diff --git a/code/ELEPHANT TUSK.ipynb b/code/ELEPHANT TUSK.ipynb new file mode 100644 index 00000000..0d38825c --- /dev/null +++ b/code/ELEPHANT TUSK.ipynb @@ -0,0 +1,290 @@ +{ + "cells": [ + { + "cell_type": "code", + "execution_count": 12, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [ + "%matplotlib inline\n", + "\n", + "from modsim import *\n", + "\n" + ] + }, + { + "cell_type": "code", + "execution_count": 13, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [ + "#using data from http://www.elephantdatabase.org/report/1995/Africa \n", + "#only recorded \"definite\" statistics\n", + "\n", + "elephant_database = TimeSeries()\n", + "\n", + "elephant_database[1995] = 286.233\n", + "elephant_database[1998] = 301.733\n", + "elephant_database[2002] = 402.067\n", + "elephant_database[2007] = 472.269\n", + "elephant_database[2013] = 401.732\n", + "\n", + "\n", + "##pop_array = (286.233,301.733,402.067,472.269,401.732,352.271)\n", + "##year_array = (1995,1998,2002,2007,2013,2014)\n", + " " + ] + }, + { + "cell_type": "code", + "execution_count": 14, + "metadata": {}, + "outputs": [ + { + "data": { + "image/png": "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\n", + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "def plot_data(x_start=1994, x_end=2015, y_start=0, y_end=500):\n", + " \n", + " plot(elephant_database, 'rs', label='data')\n", + " ylim([y_start,y_end])\n", + " xlim([x_start,x_end])\n", + " decorate(title='Elephant Population Data', xlabel='Year', ylabel='Population (in thousands)', label='data')\n", + "\n", + "plot_data()" + ] + }, + { + "cell_type": "code", + "execution_count": 15, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [ + "def fit_curve(a=-1.1287, b=28.674, c=262.15,\n", + " year_start=1994, year_end=2015):\n", + " \n", + " #year_start and year_end indicate the years to which the model will apply\n", + " \n", + " \n", + " pop_fit = TimeSeries()\n", + " \n", + " for t in linspace(year_start, year_end, 100):\n", + " pop_fit[t] = a * (t-1995)**2 + b * (t-1995) + c\n", + " \n", + " return pop_fit" + ] + }, + { + "cell_type": "code", + "execution_count": 16, + "metadata": {}, + "outputs": [ + { + "data": { + "image/png": "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\nrkJggg==\n", + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "def plot_curve(x_start=1995, x_end=2030, y_start=0, y_end=500):\n", + " \n", + " plot(fit_curve(), label='model')\n", + " ylim([y_start,y_end])\n", + " xlim([x_start,x_end])\n", + " decorate(title='Elephant Population fit', xlabel='Year', ylabel='Population (in thousands)')\n", + " \n", + "plot_curve()" + ] + }, + { + "cell_type": "code", + "execution_count": 17, + "metadata": {}, + "outputs": [ + { + "data": { + "image/png": "iVBORw0KGgoAAAANSUhEUgAAAaEAAAEjCAYAAACb0L4RAAAABHNCSVQICAgIfAhkiAAAAAlwSFlz\nAAALEgAACxIB0t1+/AAAIABJREFUeJzs3Xl8VOW9+PHPZA9JCGEHw458AUVRsIpKFal43a/22mv1\n15a6XlvrUqvUtYC40atXi1pRW2s3a1ut1aoVN1QURFyQ9UvYE9awJoTsmd8fz5kwGZJwQmYyWb7v\n1yuvTM7zzJnnnEzmm2cPBINBjDHGmHhIiHcBjDHGdFwWhIwxxsSNBSFjjDFxY0HIGGNM3FgQMsYY\nEzcWhIwxxsRNUrwLYGJLRCYA7wG7gD6qWhGRHgAeBK4C0oBbVfXJBs41FxioqgNjWeamEpGpwC8O\nkW2xqo728s8lhtcRz/skIllAmqoWNpJnMvBcPUllwAbgReABVS2LSSF9EpHfAT9Q1cBhPDcF6KGq\nm7yfJ+OueYKqzo1iMU0zWRBq/y4HSoCuwAXA3yPSzwVuA14HXgE+auRc9wEZMShjtNwPrGggbVdL\nFiQeRGQM8Crudz7Xx1Oepu7vuxNwOnAPcBzu/dLmiMgAYA7wAPA77/CHwPdo+P1h4sSCUDsmIqnA\nt4HfA5cBkzk4CB3jfb9dVZc0dj5VfTvaZYyytzv4f7mjgL5NyD9fVf8YcexpEUkEviMiJ6nqgugV\nr8UMAoaFH1DVtcDa+BTHNMb6hNq3c4AuwPvAW8BZItI7Ik+K9724JQtmWrUXve8nx7UUpkOwmlD7\ndjkQxDVFJALfwTVJ/BJARNYDA7y860Rkg6oO9I6/jfsn5TJgJzAaV4uq09chIsOB6cAZQDLwJXC3\nqn4UlucS4HrvHOnAJuBvXr5yL89cXJ/Eo8AM4GigEPgNMF1Va6J0T+olIiNxzY0TcIH5S+913wrL\nMxeoAh4DHsL9x70SmKGqL9Vzzkm4JsKjge245q/7w68lWvcmol/s/dDv8jBvR6h8tZ8PXhPXDOA/\ngCxAgcdV9ZmwPL8DTsW9x2YBR+H6mB5V1aci8h3U1+OnD0hEzgBuBb4BdMbd138BU1R1T0R/13Mi\n8pyqBurrExKRTsDdwHdxNcjNwF9w93S/lyf0vNHAFOBs3Pv8HeAmVV3fUFmNP1YTaqdEpDOuv2e+\nqm4D3gDKgR+EZbsJ+If3+Gbv55Dv4prqbgKeUdUd9bzGkcCnuAD0OHAHru/pbRE5wctzFfBXYA/u\nj/hnuA+mW4F7I045yss7F7gBWIP7YP0fn5edLSLdG/hKaehJIjIKmA+MxAWNO3EfNG+IyH9HZB+J\nC8YfeNdTA/xdRC6LyNcbeAk3KOQm75rv9a4r9LrRvDcv44Ic3jXcxOGb6H3/wivnIOAz4ELgGa98\nu3BNdzMjntsN+DeQ5+XbDPxaRG5vRnnwyjEJ989RBq7f6gZgIXANB679Q9z14x37XgPnSvHONQV4\nF7gRd2+nAHNEJDniKa8CObj3+FPAebjfh2kmqwm1X9/GjXZ7GUBVi0TkHeBcETlBVT9T1VdEZDRw\nEfBKxH916cCFqrq5kdeYgfuwHqOqqwFE5C+4D8hbcTWvW3Af8P+pqkEvz5PAOtx/1beFna8vcIGq\nvubl+z3uQ+xyoN4RexFeaSTtokbSZ+FqFseraon32rNwAeQxEflH2KjCPsDNqvqol+8Z4GvglyLy\nl7BaTirwXVX9h5fvT0ABcDGuRgNRvDeq+rWIzMd9IPvtG8sUke7e44D3Gv+JC2yf4z6cwXXwdwNO\nUNVQYHoC+CfwMxF5XlWXeXm7AI+p6k1evl979/FuEXlKVXf7KFdDbgbygW+F/T5+7V33f4Dr+xGR\nt3HBor4+r5ArcM2Ntb9L71zLgJnA1dR9zy1S1W+HfhCRDOB/RORIVc1rxjV1eFYTar9C/5m/HHYs\n9PiHPp6/urEAJCIJuD6nN0IBCEBVd+KaZEL/8R8DnBP6kPX0BHYDmRGn3Y8bpRc6Vxmu2SeyH6sh\nPwPObODr4wauoxtwGq6mmB6qOeE+TP8B9AJOCHvKXsI+nFS1FPg17gN8TMS1vBqWrxjXdBd+LS15\nb+oTCr6FuGatr3C1q3dwAS/oDVI4F3grFIC816/BNV8GOHgU3QNh+apxzZfpwLeaUVZwtY8x4dMM\nvN9fEQffr0O5wHveExHHH/OOXxhxPLLW85X3vTn332A1oXZJRPrgmshWAUERGeglLcb1EV0qIjeH\n+hwasP0QL9MN94d/0H+Bqro07HGliIwVke8Cw4GhuA9acE1P4XbW0/dTjuvP8uPzwxgdN8T7/hPv\nqz79ORDE1kTOteLAPRiIa7YCdy3VEflKcUENaPF7U59f4oYyg3tf7APyVDV8OHt33O9Z63l+aLjz\ngLBju7zm33Dh9+ewqWq1iAwWkXtx/U1DgCMO83SDgLWqWhnxGhUispa61wQuUIcL/e005/4bLAi1\nV5fiarnDcE07kXJw/+k11qYd+QEaKfTH1+iGVF6z1vW4jv75wB+AT3B9SP0jssd08EEDQtfxBA03\n1y0LexwZgMLPEX7PDnktreDeLFfVdw6Rp7GJoqGWlPB74vf+1KfRD3QR+RkucCpuftNLuD7Jn+Ca\nJZviUNcVeR3xeG92CBaE2qfLcMHhBxw89PpYYCpuzlBzOlZ34P6zHxKZ4H1Y9AF+hfuQ/YOqfj8i\nT2tpxljvfa+K/ED2RswNwjWFhQwSkUBEE9qR3nfffQPeaLPWfm/A1QBKcDW1SOJ9zw871ktEMlV1\nX9ixyPtTDW4eW0RtvMHrFpE0YBpuusEkVa0KS4scxOHHemCciCSH14a8AQuDaHzStoki6xNqZ0Rk\nGDAWmKuqf1DVV8K/cCOHtgKTRKQpExvr8D4E5gDniEi/sNfPwQ1KGIwbKQewPKKM5+A+mOL+T5Cq\nbgEWAZPD74c3Ouq3uJFw4eXshRtwEcqXAVyHa8ZqdLJvhFjcm1BNI2p/116T4pu498vxoePeck9T\ncP/svB72lADw47B8SbiRens5MNBhq/d9dFi+XBqfl5SOW9FhVUQAGo3r0wu9Fvi7D6/hhnj/OOL4\nj3BD0P/VyHNNFMX9Q8BEXWhAwm/qS/T6IX6LGz1U7/DVJrgd1xyyUEQex3XoXo3rQ7gLWA1sBO7w\n/pMtwM3vmIyb95LVzNePdKb3YdaQf4RGv0W4ATeC63NvdNpO3BD1E3ErSewMy1uJm39yPG502hVA\nLq7TvCmWE/17E+q3uE5Eeqvqnw/jHPX5Oa6Pca7XhLgFN9rwDOARVV0ekf8erx9yGS5gnwxcGZp7\ng5sMezvwFxH5P9wozutx92AY9VDV3SLyKXCFiBThmuSOxq15GGoqy8IN6gjdh//nBcvn6znls7iW\ngke8IfqLcP+8/RBY4KWbFmA1ofbnMtx/nS83kudp3B/u5Oa8kKquAMbh5mrchpu0ugU4VVWXeU0t\n5+D6O24E/hc3guxG3H/RncWtdxYtd+D6VRr66tHAdcwHTsF9EN2C63fIACar6oMR2Tfj7vG3cbXK\nvbghw3Noghjdm3dxTaznAo97wa3ZVHUNLiC/gRu+PRM3evBKVb2lnqdMwo2QDN3Hi1X1t2Hn+xoX\nnIq9PNfgFtF95uBT1XEJblj4Fbhh7md6zwv1B53hnX8lbuTfWC9f5CCD0P2fCDzinedR3Lp59wNn\nRA5YMLETCAYb7Vc2xnikla4i3lr4WfHAmEgt3hzndfYuqydpvKrO82ZFz8R1eubhluN4M+z5PXGj\nhybhRrA8B9wZ3k5sjDGmbYhHc9wo3MiqPhFfn3oB6lXc2lnH4arer4jIUWHPfwk3iuY0XHPSD3Gj\nZowxxrQx8RiYcDRufsLWyAQRuRFYoKr3eYfuFpFTce3k14jIOFxb82BVXQcsFpFbgVkiMv0Qky+N\nMca0MvEKQg1tLDWeg+euzMVNvgylb/ACUHh6Fm6456f1nVTcvjon4DrNDzVhzpiGTAYIW4HC1DUV\nmGr3p11JxLVUfRarf/LjFYTSRGQBbhmPpcAdqroQN9R1U0T+zUBoHkpD6Xh56g1CuABkk8+MMebw\njAfmxeLELRqERCQdN4mxEDehsRw3P+ADb95FJ9wciXDluHkE1JfuzXsJhuWpzxaAP/3pT/Tu3Zom\noxtjTOu1detWLr/8cvA+Q2OhRYOQqpZ6M+rLwzbsmoybH/Ej3DIwqRFPS8UtG0J96d7M9kBYnvpU\nA/Tu3Zvc3MbmMhpjjKlHzLoxWnx0nKoWhbcteisDL8M1p+Xj2h/D9eVAE1xD6XBwM50xxphWrkWD\nkIiMEZGi8Jng3n4lo3GBaB7eOlBhJuB2S8RLHxy+VpmXXsyB/T2MMca0ES09MGExbvXa2SLyY9z+\nJVNwe5Y8hlsc8nMRmQa8gFse5UTcApHgljhZALwoItd7+Wfi1q+qbwl5Y4wxrViL1oS8VQ3Oxi0+\n+BpuzbHewDdVdbu3CvFFwH/hajYXAOd7a5ThLZ9/EbANN9rtOdxCg9Nb8jqMMcZER4sP0VbVTTSy\nAZWqvk7dpeEj07fiApExxpg2zlbRNsYYEze2n5Ax8XLttQ2nzZ7dcuUwJo6sJmSMMSZuLAgZY4yJ\nGwtCxhhj4saCkDHGmLixIGSMMSZuLAgZY4yJGxuibUy82DBsY6wmZIwxJn581YREZCTwXdyK1QOB\nbGAHsBH4N/APVV0ZozIaY4xppxoNQiIiuFWqz8Pt17MIt+hoCZCD2277ZmCGiPwTuEtVl8e0xMYY\nY9qNBoOQiNwK3Ab8CRinqgsbyXsCcA0wT0QeVNWZUS+pMcaYdqexmtBw4ChV3X6ok6jqZ8BnIjIV\nmBGlshljjGnnGgxCqnplU0/mbdPww2aVyBhjTIfRpCHaIpKhqiXe44uAfsC/VHVtLApnTHtQXROk\ntKySkrIq9pdVUlZeTWlFFeUV1ZRXVlNRWU1lZTWV1TVUVtVQXROkqrqGmpogNTVBgsED5woEICEh\nQCAQIDHB+0pMIDkpgZSkBJKTEklNSSQ12X1PT02q/eqU5r4HAoH43QxjIvgdHSfAv4C/AHeLyL3A\nHUAAeEBEzlTVT2JXTGNar+rqGvaWVLB3XzlF+yoo2l9B8f4K9u2vpHh/BaXlVfEuYq2EQICM9GQy\n05PJ7JRC54wDXzlZqWSkJ1uQMi3Kb03oQaAK+KeIpAA/Bv4KXAv8DrgPN3zbmHarqrqGXUVl7NxT\nxq7iMnYXlbGrqIzi/ZUEw6srrVhNMEixFyTZWXJQelJiAl2yUsnJSiOncyrdOqfRLTud7MwUC04m\nJvwGodOAK1V1kYhMws0Tmq2qRSLyFPBSzEpoTBxUVtVQuGc/23ftp3B3KYV7StldXH5YwSYQCJCe\nmkRGWhLpaUmkpySRlppEWoprMktJTiQlKZHkJNeslpiQQGKia2oLNb3VCgapCUJNTZDqmhqqq4NU\n1bhmvMqqGiq85r3yimrKKqopq6iitLyK/WVVlJRVUl5R3WhZq6pr2LGnlB17SuscT05KoHt2Oj1y\n0unRpRM9u6aTk5VGQoIFJtM8foNQMrDLe3w2bp7QPO/nRFwtyZg2KRgMUry/ki079rF153627ixh\n594yanwGnEAgQFanZLIzU+mckUJ2RipZGclkdUohMz2ZTmnJrebDuqq6praZMPS9qKScPftcc2JD\nTYeVVTVs2VnClrDaU3JSAr26ZtC7Wyf6dMugV7dOpKXYSmCmafy+Y5YCF4uIApcAc1S1SkSSgeuB\nJbEqoDGxsHdfOZsK97Fp+z42Fe5jX2nlIZ8TCATIzkihW7Zrosrp7JqtumSlkpTYNlbACjW3dclK\nrTe9rLyK3cXl7C52TY0797qv/WUH35/KqhoKthdTsL0YcPene3YafXtkktszkz7dMywomUPy+w65\nB3gFF3DKcX1EAKuAXrgVFYxptcorqynYVszGbcXkbyumqKSi0fyBQICcrFR65rimpx5dOtG9SxrJ\nSYktVOL4SEtNok9qEn26Z9Q5XlJayY49rlly2679bNu1/6DAFAwGKfTyLM4rJBAI0DMnnX69sujf\nK4te3TJIbCU1QtN6+ApCqvq2iIwCTgAWqOoGL+lh4D1bqse0NsFgkN3F5azfXMT6LUVs3VnSaPNa\nclICvbtl0Kd7Bn26ZdCzaydSk9t3wGmKjPRkMtKTGdCnM+Du777SSrbuLGHrzv1s2VFC4Z7SOn1m\nwWCwNmAtWrGN1ORE+vXKYkDvzgzok0WntOR4XY5pRXzXlb25QGsjjj0e9RIZc5iCwSBbd+5n7aa9\nrNu8lz37yhvMm5yYQJ8eGeT2zOKIHpn06JLeavpt2gLXD5ZCVqcUjuyXA0BFZTVbdpRQ4DVzRgal\n8spqVhfsYXXBHgKBAH26dWJg32yGHJFNdmb9zYOm/Wts7bg5TTmRqk5qfnGMaZqamiBbdpawOn8P\nazftpaSevouQnjmdXNNQ7yx6d+1EYhvpx2krUpITGdCnc21tqay8ioLCfWzcWszGrUV1+t2CwSCb\nd5SweUcJn3y9mR5d0hmS24WhuV0a7K8y7VNjNaEUILz94mTv5wXAFqAbcBJuT6LXYlVAYyIFg0G2\n7y5l1cbdrM7f02DgSU5KoH/vzgy05p+4SEtNYqgXWILBILuKyli/pYj1m4vYumt/nVpSqC9pwdIt\n9MhJ58h+OQzr14XMTilxvALTEhpbO+700GMRuRnoCZylqgVhx7sDbwDrYlhGYwAoKqlg5YZdrNqw\nu8GmtvTUJAYfkc3gvtnk9sy02k4rEQgE6JadTrfsdMYM78X+skrWbyli3aa9bNxWTHVNWEDaXUrh\n7lLmL9lC3+4ZDB/QlSG52aRYH1275LdP6Fbg+vAABKCqO0TkPuA3uGV8jImqyqoa1mzaw4p1u9hU\nuK/ePOmh/7j7daFPtwzr22kDOqUlM3JQN0YO6kZFZTXrtxSRl7+HjVuLagNSMBh0w+gL9/HhlwkM\nyc1mxKBu9O2eYas3tCN+g1An3Dpx9clsJM2Yw1K4u5Rla3ewKn8PFZUHz/JPSU5kyBHZDOufwxE9\nMi3wtGEpyYkM65/DsP45lFdWs7ZgL6vyd1OwfV9tk11ldQ0rN+xm5YbdZGemMnJQV0YM7GpNrO2A\n3yD0HnC/iCxR1VWhgyJyDG7duNdjUTjTsVRV15C3cQ9L1+5g2679B6UHAgH698pi+MAcBvXNbjMT\nRI1/qcmJjBjUlRGDulJSWolu3I2u38XOorLaPHv3lTN/yRY+XbaVIUdkc/SQ7lY7asP8BqEbgY+A\nZSKSBxTiJqkOBZYBN8WmeKYjKCqpYOmaHSxft4uyioOXjemSmcrIQd2QATlkpNt/vh1FRnoyx0tP\njhvWg8LdpSxfv4u8jbsp92rGNTVB8vL3kJe/h26d0xg1tDsyIKfdTyhub/xOVs0XkZG4DetOBboC\nnwMzgT+o6qHXPKmHiJyEW4PuW6o61zs2yTuvAHnAFFV9M+w5PYHHgUlABfAccKeq2vp1bUgw6IZW\nL15VyNrNRQctDJqYEGBIbheOGmx9AB1dIBCgZ9dO9OzaiVOO6cuaTXtYtmZnnXXsdhaVMfeLAuYv\n3cLIQd04Zmh3smxkXZvQlMmq+4EnvK9mE5EM4A+4BVBDx0YCrwL34lbmvhx4RUSOV9VlXraXcEPF\nTwOOwG0lUQXcGY1ymdiqqQmyZtMeEq67jtLyKvrhdkYMSUlKYN//Pc7wgTnW3m8Okvzj6xgODAfK\nKqrYtbeMPfvKqQnC3Gvuoryimi91O4tXFTIktwvHDetBz66d4l1s0wjfQUhEhgDnABm4uUHhgqr6\nQBNf+xGgANekF3Ijblmg+7yf7xaRU73j14jIOFxNbLCqrgMWi8itwCwRma6qDU+RN3FVWVXDivU7\n+WpVIUUlFZwesVpzZnoyXTunkdUpmcDwnnEqpWlL0lKS6Nsjk17dMthTXEZ2Zip7vaH7NcEgefm7\nycvfTW7PLMYM70luz0yrUbdCfndWvRx4noODT0gQ8B2EROQc4FzcthBfhyWNx22WF24ucGlY+gYv\nAIWnZwGjgU/9lsG0jPLKapas3sHivMKDtgkIBFx/T7fsNFtt2Ry2xAQ3B+nys4azYWsRX60qrDOc\nP7TSd48cN0dpyBHZFoxaEb9/+XcD7wBXAwWqetjbSHoTXH+D61/aHZGcC2yKOLaZAy02DaXj5bEg\n1EqUlVexOK+Qr1fvqO1IDklLSaJHl3S6ZqeRbCPcTJQkJAQY1DebQX2z2b57P1+tKmR1/p7ahWsL\nd5fy7/nr6do5jTHDe3Jkvxwb2t8K+A1CA4EfqWp+FF5zNvCqqv5bRHIj0joBZRHHyoG0htJVtVJE\ngmF5TByVlVfxlRd8Iuf3ZKYnc5z0ZOSgriS/Ye30JnZ65nRi0okDOOnoPny1ajvL1+2iqroGgF1F\nZby9cCOfrdjGCSN6WTCKM79BaBV1+48Pi4j8ADgOOKaBLKVA5OqFqbidXOtN9zbWC4TlMXFQXlnN\n4lWFfJVXeFDw6ZKVyhjpxbABObafjGlRnTNS+OZxuYwd0YvFeYUsWbOz9v25p7i8NhideFRvhuZ2\nsWa6OPAbhO4EHhORdcAnzRgOPRnXpLZVRODASgtvisjzQD7QJ+I5fTnQBJePGxwRmQ4HN9OZFlBZ\nVcPXqwv5QrdTXlE3+HTtnMbYEb0YmtvF/tM0cdUpLZlxo/pynPTk6zzXR1keFozeWrCBRdnbOeno\n3gzs09mCUQvyG4RmAj2A9wFEJHIdlaCq+ll//f8B6WE/98ZNgr0KeBuYgRt6fW9YngnAh97jecBD\nItIvrGlwAlAMfOXzWkwUVNcEWbFuJ58t33bQKtZdO6dxwsheDDmikeAze3YLlNK0O81836SlJPGN\no3pzzJHd+Xr1Dr5adaDmvnNvKa9/vI4+3TIYN6oPfXtkRqPE5hD8BqG/ROPFVLVObUVEQv07m1R1\nu4jMAj4XkWnAC8BlwInAdV6++bitJF4UketxqzbMBB5R1cb3azZREQwGWbtpL/OXbmFPcd0R8Z0z\nUjjxqN7Wxm5avbSUJL4xsjfHDOnOl6sK+Xp1IZVVrs9oy84SXp67mkF9OjPumL507WzdzbHkd8WE\nabEuiPc6S0TkIlxgmQKsBM5X1RVeetBL/zWuBlUMPAtMb4nydXRbd5bw8eLNdWaqA2SkJXPCyF6M\nGNTN+nxMm5KWmsS4UX049sjufL5yO0vW7KDGW8V73ZYi1m8t5njpybhRkb0EJlqaMlk1DTgKt9ld\n6JMmATd5dbyq3tXUF/e2hghEHHudRhZEVdWtwEVNfS1z+Ir3VzB/yRZWbaw7oj41OZHjh/fkmKE9\nSE6yodam7eqUlsz40Udw7JE9WLhsC7pxD8FgkGAwyOcrtzE0tws9ctIPfSLTZH4nq56Gm0TavYEs\nxUCTg5Bp3SqravhSt/OFbq8d3gpuPsaoId05YUQv0lJtkqlpPzpnpPCtbwzg2CN78smSzeRvKyYz\nPZmMdHufx4rfOzsD2AX8D25wQTVu4dBzcP01Z8ekdCYugsEgqwv28PHizewrrTvoYEhuF04e1Yfs\nTD/jUIxpm3rkpHPhN4dQUlpJYmLAVvSIIb939jjgKlX9h4hkA//jrWz9poik4mpB58aqkKbl7Coq\n48MvCyjYXncX0x456Yw/9ggbMWQ6FNs6JPb8BqEEDszDycP1DYX8HbeunGnDKquqWbh8G4tXFdYu\ncwJu6+xxo/owYmBXmzthjIk6v0FoDS7wfAQokCEioqqK24ohK0blMzEWDAZZt7mID78sqNP0lhAI\nMGpod04Y2cuaIowxMeP30+XPwEwRSVDVJ0VkEfArEXkUt7jpssafblqjffsr+OCLAtZtKapzvG/3\nTE47/gi6ZdtoIGNMbPkNQg/hVkw4FXgS+BHwJm4odRFwQUxKZ2KipibIkjU7WLB0S+0EPXBNb6cc\n2xfpn2NNb8aYFuF3smoN8NOwnxeJyGDcBoeqqkUNPtm0Kjv3lvLeony27dpf5/hRg7sx7ug+NuTa\nGNOimvSJIyIZqhqaLv8t3MraO3C1IdOKVVfX8LluZ9GKbbUzwsGt83b6mFz6drdRb8aYlud3sqoA\n/8KtIXe3iNyLW1kb4AEROVNVP4lRGU0zFe4u5d1FG9mxp7T2WEJCgLEjejFGepJoG8sZY+LEb03o\nQaAK+KeIpAA/Bl4ErgV+B9yHW83atCLV1TV8vtKr/YQNu+7dLYMJY3Jt4IExJu78/gt8GnCHqi4C\nTgeygdleX9BTwNjYFM8crp17S/n7e3ksXL61NgAlJSZw6rF9ufj0oRaAjDGtgt+aUDJu2R5wS/SU\n4Pb2ATdP6HA3uTNRVlMT5KtVhSxYtqVO30/f7hmcMbY/XbJsuR1jTOvhNwgtBS4WEQUuAeaoapW3\ntfb1wJJYFdD4V1RSwTsLN7J5x4EldxITAt5S9T1s2LUxptXxG4TuAV7BBZxyXB8RwCrcxnLnRb9o\nxq9gMIhu3M2HX26q3SUSoFfXTkw8ob9tymWMabX8zhN6W0RGAScAC1R1g5f0MPCeqi6PVQFN48oq\nqvjgiwLy8vfUHksIBBg7shdjhveyTeaMMa2a73lCqroWWBtx7PGol8j4tmVHCXM+3UDx/gM7m3fJ\nTOXMEwfQq2unOJbMGGP88TtPaM6h8qjqpOYXx/hRUxNk0cptfLZ8G8GwodcjB3Vj/Oi+JCclxrF0\nxhjjn9+aUAoQjDiWCYwE9gEvRbNQpmH7Sit5+9MNbCo8MPggNSWRCWP6MTS3SxxLZowxTee3T+j0\n+o6LSA5uIdOVUSyTacCGrUW8s3AjpeUHRsT37Z7JpBP7k9kpJY4lM8aYw9Os9VpUdTfwAHBzdIpj\n6lNTE2T+ki289tHa2gAUCAT4xlG9+c/ThlgAMsa0WdFaMrlXlM5jIpSUVjInovktIy2ZSScN4Ajb\natsY08b5HZhwcj2HE3GraE8DPo9moYyzqXAfby3YwP6yAzue9u+Vxbe+0Z9OaclxLJkxxkSH35rQ\nPA4emAAQAPKBm6JWIkMwGOTLVYUsWLKldt23QCDAN0b2YuyIXrbygTGm3fAbhOpbITuI20foa2/T\nOxMFFZXKY6xrAAAgAElEQVTVvLsonzUFByafpqcmMenEAfTrlRXHkhljTPT5HR33QeixiGQAWcBO\nVa1s+FmmqXYXl/HmJ+vZVVRWe6x3twz+Y9xAMtOt+c0Y0/74HpggIqcDDwFjcM1wiMhC4C5VfTcm\npetA1m3ey9sLN9ZZ++2Yod055Zi+tumcMabd8jsw4ZvAHNx8oHuAbUBf4DvAmyIyUVU/ilkp27Fg\nMMiiFdv4dNnW2mNJiQlMGJOLDOgax5IZY0zs+a0J3Qu8A5yrqrUDFERkBvA6MBWYGPXStXOVVdW8\ns3AjazbtrT3WOSOF/xg3kJ45tvabMab989vOMxZ4IjwAAXg/P4FbXds0QVFJBX9/b3WdAJTbM4tL\nJg6zAGSM6TD81oR249aKq08WUN1AmqnH5h37ePOT9XWW3zn2yB6cckxfEmzrBWNMB+K3JvQeMFVE\n+oYf9H6eimuqMz6sWLeLVz5YUxuAEhICnDG2H+NHH2EByBjT4fitCd0OLALyRGQesBXoDZyKmys0\nxe8Likgu8H+4PqQE4N/AT1V1s5c+CZgJCJAHTFHVN8Oe3xN4HJgEVADPAXeqahWtWE1NkPlLt/Cl\nbq89lp6axDknD6JP94w4lswYY+LH7zyhTSJyHHALMB4YhGuiewJ4RFW3Nvb8EBEJ4AYyFHJgAuyv\ngNeAMSIyEngVNxDiJeBy4BUROV5Vl3n5X8JNlD0NOAL4HVAF3OmnDPFQWVXNnE83sm7zgf6f7l3S\nOefkQXTOaMLio9de23Da7NnNKKExxsRHU3ZW3Qrc2szX6wWsAH6uqusBROQRXKDJAW7EbR9+n5f/\nbhE51Tt+jYiMw9W+BqvqOmCxiNwKzBKR6apa3szyRd2+0kpe/3gthbtLa48N6tOZM08cQEqybT5n\njOnYmjJZdQSu9tGFg/uSgqr6wKHO4QWyS8POmQtcC3ymqrtFZDzw14inzQ17znhggxeAwtOzgNHA\np36vpyXs3FvKax+tZV/pgYUljhvWk3Gj+lj/jzHG4H+y6mXA87iVs+sTxO0r5JuIvAJciGvWCzXN\n5QKbIrJuxq3W3Vg6Xp5WE4TytxXz5vz1tSsgJAQCfPO4Izh6SPf4FswYY1oRvzWhe4APgauBdZHz\nhQ7T3cD9wF3A216fUyegLCJfOZDmPT4oXVUrRSQYlifuVqzbxfuf59eugJ2SnMhZJw1gQO/OcS6Z\nMca0Ln6D0EDgelVdG60XVtUlACJyKW47iB8ApUBqRNZUoMR7fFC6iCTj1rIrIc6CwSCfrdjGwrAl\neDLTkzl//GC6ZafHsWTGGNM6+Q1CCvRp7ouJSC9ggqr+pfbEqvtFZA1upFt+Pa/TlwNNcPnAOfWk\nw8HNdIfnMEeg1dQE+eDLApat3Vl7rHuXdM47dbCtgG2MMQ3wG4TuBJ4UkQJgXjO2cBgAvCAiq1V1\nEYCIZOPmBD0PJOMGP9wb9pwJuKZAcJvrPSQi/VQ1Pyy9GPjqMMvUbJVVNcxZsJ51W4pqj/XrlcXZ\n4wZGdwScDcM2xrQzDQYhEamk7m6qSXgrI4hI5DI9QVWNbEarzyLgI+BZEbkGqAQexM0beh43/+hz\nEZkGvABcBpwIXOc9fz6wAHhRRK7HDfmeiZurVOHj9aOurLyKf328jq07D7QGDh+Qw4Qx/WwLBmOM\nOYTGakL3Uf+W3odNVWtE5GLgf4F/4QYTvAWcpqr7gCUichEusEzBbR1xvqqu8J4f9NJ/jQtmxcCz\nwPRoltOvffsrePWjtXU2oRszvBcnHd3btuA2xhgfGgxCqjrV70ki15RrjKruACY3kv46blWFhtK3\nAhf5fb1Y2VVUxqsfrqmdAxQIBBg/ui/HDO0R55IZY0zb4au9SESqRaTe7Rq8CaYa1VK1ctt27efl\n91fXBqCEhACTTuxvAcgYY5qosT6hW4DQypoB4GoRObuerKfgFhLtEPK3FfPGJ+uorKoBIDkpgXNO\nHkS/XllxLpkxxrQ9jfUJJeMmlILrG/phPXmqgT3AtCiXK34aGYG2dtNe3lqwnuoa11WWlpLE+eMH\n06urbUJnjDGHo7E+oQdxI9cQkRrgFFVd2FIFa21WbtjFe58dWAUhMz2ZC745hK6dW81CDcYY0+b4\n3cqhQ481XrJ6Bx98WVD7c5fMVC745pCmbcNgjDHmIL5X0e6ovtDtfPL15tqfu3dJ54Lxg+mUZqsg\nGGNMc1kQakAwGOSz5dtYuPzAOnC9unbi/PGDSUux22aMMdFgn6b1CAaDfLKk7lbcR/TI5NxTBtlG\ndMYYE0UWhCIEg0HmfbWZxasLa4/1753F2eMGkZzUobvGjDEm6iwIhQkGg3zwRQFLw1bCHtQ3m/84\naYCtA2eMMTHgd2fV7sDDwHm4Caz1be/tZwHTVisYDPL+5wUsX3cgAA3N7cKZJw4g0bbiNsaYmPBb\nE3oCOB+3snUBUBOzEsVBTU2Q9z/PZ8X6XbXHpH8OE0/oT4IFIGOMiRm/Qehs4GZVbXcb2tQXgIYP\nyOGMsRaAjDEm1vwGoSpgdSwLEg+uCa5uABoxsCsTxvSzAGSMMS3Ab2/7P3AbzLUbwWCQ9xbVDUAj\nB3XljLEWgIwxpqX4rQl9CjwoIoOAT4D9EelBVX0gqiWLodAghMgANGFMP9uMzhhjWpDfIPSU9/10\n7ytSEGgTQSg0DDt8FJwFIGOMiY8OtYBpMBjko6821ZkHNHyABSBjjImXDjVZ9QstJH/3gXgq/XM4\nY6wFIGOMiZfGdladA/xEVdV73Jigqp4V3aJF37K1O+ic0xOAI/t1sXlAxhgTZ4faWTX0CZ2C6/dp\nFwYfkc23vjHAApAxxsRZYzurTgh7fHqLlKYFDOjdmbNsKR5jjGkVGhxwICKnHM4JRWT84Rcnto7o\nkcXZJw+0xUiNMaaVaKw57kkRWQHMUNWlhzqRiJwA/Bw4EjgmSuWLqjPG5pJkAcgYY1qNxoLQWGAq\nsEhE8oCXgIXAOqAE6ALkAqfi1pYTYBateGUFGwVnjDGtS2N9QpXAnSLyJHAzcDVwD3UHKASAjcDf\ngfNUdVMMy2qMMaadOeQ8IS+w/Az4mYgMBwYD2cAOYIOqroptEY0xxrRXTZqsqqorgZUxKosxxpgO\nxnrpjTHGxI0FIWOMMXFjQcgYY0zctPgCpiLSC5gJTALScXsV3RKaiyQik7x0AfKAKar6ZtjzewKP\ne8+vAJ4D7lTVqpa8DmOMMc3XojUhEUnA7dI6DLgQOBnYC7wrIt1EZCTwKvA34Djgn8ArInJU2Gle\nAnoDpwGTgR8C01rqGowxxkSPr5qQiKQBtwPnARkcHLyCqio+TnUsMA4YqaorvHN/D9gFnAucAixQ\n1fu8/HeLyKnAjcA1IjIONzl2sKquAxaLyK3ALBGZrqrlfq7HGGNM6+C3Oe4x4CpgLrAUqDnM19uI\nC2Qadix0rhxgPPDXiOfMBS71Ho/HzU1aF5GeBYzGNe0ZY4xpI/wGof8C7lDVh5rzYqq6E3g94vAN\nuL6hOcC9QOSqC5uBft7j3AbS8fJYEDLGmDbEb59QCm7duKgSkQuAB4BHvOa5TkBZRLZyIM17fFC6\nt7xQMCyPMcaYNsJvEJqDW6Q0akRkMm6QwYvAbd7hUiA1ImsqbsHUetNFJLT5XgnGGGPaFL/NcX8E\nnhGR7sAnwP7IDKr6Z78vKiJ3AjNwQ61vUNXQoqj5QJ+I7H050ASXD5xTTzoc3ExnjDGmlfMbhF7y\nvk/2viIFAV9BSERuwwWge1T13ojkebih1+HHJwAfhqU/JCL9VDU/LL0Y+MrP6xtjjGk9/AahQdF4\nMRE5Brgf+C2uZtU7LLkYtx/R5yIyDXgBtzfRicB1Xp75wALgRRG5HghNfH1EVSuiUUZjjDEtx1cQ\nUtUNoccikoEbEr3TGxTQFJcCicAV3le4u1V1hohchAssU3Ardp8fmlOkqkEv/dfAR7jA9SwwvYnl\nMMYY0woEgsHgoXMBInI68BAwBjcQANyIubtU9d2YlC5KRGQgsO7dd98lNzc33sUxxpg2oaCggIkT\nJwIMUtX1sXgNX6PjROSbuBFy6bjdVa/Bbf2dCbwpIuNjUThjjDHtm98+oXuBd4Bzw0ayISIzcJNP\npwITo146Y4wx7ZrfeUJjgSfCAxC4PhrgCeCEaBfMGGNM++c3CO3GNb3VJwuojk5xjDHGdCR+g9B7\nwFQR6Rt+0Pt5Kq6pzhhjjGkSv31CtwOLgDwRmQdsxe3pcypQhBtObYwxxjSJr5qQqm7CbTL3JJCN\n2xOoC64/6DhVXRuzEhpjjGm3fG/vrapbgVtjWBZjjDEdTINBSETuAJ5T1S3e48YEVfWB6BbNGGNM\ne9dYTWgGbsDBFu9xY4K4fYGMMcYY3xoMQqqaUN9jY4wxJlr8LttzT+Tw7LC0ASLyq+gWyxhjTEfg\nt4bzC+CIBtLG4daSM8YYY5qksYEJ83ABBtyq2QtEpKHsn0W5XMYYYzqAxgYmXAV8GxeApgNPAwUR\neaqBPcArMSmdMcaYdq2xgQkrgfsARCQReNabtGqMMcZEhd+dVacBiEg3IIUDm9olABnAeFV9NiYl\nNMYY0275CkIiMgr4E3BUA1mCuG22jTHGGN/8LtvzS6Ab8DPgPKAceA04BzgbOD0WhTPGGNO++R2i\nPQ64W1X/D3gRyFDVX6vq+bhBCTfEqoDGGGPaL79BKBXI8x6vAo4NS3uOA0O5jTHGGN/8BqGNwCDv\n8Sqgs4gM8H4uA7pGu2DGGGPaP79B6B/AgyJykapuBlYC94rICOBmYE2sCmiMMab98jswYRpwJHA1\nLiDd7H2/HDdh9dKYlM4YY0y75nee0H7gYhFJ9X5+yxu2fTzwhapaTcgYY0yT+d5ZFUBVy8Mer8Ga\n4YwxxjRDYwuY5uEmofoRVNUGVzc1xhhj6tNYTehj/AchY4wxpskaW8B0cguWwxhjTAfkd+24kw+V\nR1U/aX5xjDHGdCR+BybM49BNc4nNLIsxxpgOxm8QmlDPsUxgPPA93OZ3xhhjTJP4nSf0QQNJr4vI\nPuAu3OraTSIiTwFJqnpV2LFJwExAcOvVTVHVN8PSewKPA5OACtzadXeqalVTX9803aJFi7j88st5\n9913yc3NPWT+l19+mbvuuovly5e3QOmMMW2N32V7GvMRTdzKQUQCIjIduDbi+EjgVeBvwHHAP4FX\nRCR8H6OXgN7AacBk4Ie4FR2MMca0MdEIQucDRX4zi8hg4D3gOtzCqOFuBBao6n2qulJV7wY+8Y4j\nIuOAU4EfqOpiVX0DuBX4SWg1B2OMMW2H39Fxc+o5nAj0A4YADzXhNU8G8oHvAn+JSBsP/DXi2FwO\nrE03Htigqusi0rOA0cCnTShHuyMizJgxg5deeolly5bRr18/7r//fpYvX87s2bMpLi7m9NNP58EH\nHyQlJQVwzWuPPvooy5YtIz09nXPOOYdbbrmF9PR0AFauXMmMGTNYsmQJ/fr145JLLqnzmjU1NTz9\n9NO8+OKL7N69myFDhnDDDTdw2mmntfj1G2PaHr8DE1I4eHRcEFiO67/5rd8XVNU/An8E96EZIRfY\nFHFsMy7YNZaOlyeqQehL3c7C5VuprKqJ5ml9SU5K4Bsje3Oc9GzS8x555BHuu+8+Bg4cyM9//nOu\nueYaRo0axTPPPMO6deu45ZZbGDt2LJdddhmLFy9m8uTJfO9732PatGkUFBQwdepUCgoKeOqpp9i7\ndy+TJ0/mpJNO4qWXXmL9+vXcfffddV7v4Ycf5u2332b69On079+fjz76iOuvv55nn32WE088MZq3\nxBjTDvkdmHB6jMsR0gm3P1G4ciCtoXRVrRSRYFieqPlqVWFcAhBAZVUNX60qbHIQ+s53vsMZZ5wB\nwIUXXsj06dOZOnUq/fr1Y9iwYTz77LPk5bn9CX/7299y9NFHM2XKFACGDBnC1KlTueaaa8jLy+Oz\nzz6jsrKS++67j4yMDIYOHcq2bduYPn06ACUlJfz+979n1qxZjB8/HoABAwawcuVKnn76aQtCxphD\natICpiJyNq5JLAfYBrynqh9GsTyluF1cw6UCJQ2li0gyEAjLEzWjh/WIa01o9LAeTX5e//79ax+n\np6eTkJBQZxRbWloaFRUVAOTl5R3UbDZ27NjatLy8PAYNGkRGRkZt+ujRo2sfr1mzhoqKCm688UYS\nEg50L1ZWVtK9e/cml90Y0/H47RPqBrwJjMXVTAqBnsDdXn/RRaoaWYM5HPlAn4hjfTnQBJcPnFNP\nOhzcTNdsx0nPJtdE4i0pqe6vNBAIEAgE6s2blnZw5TEYDNaeJxAI1P4ckpycXPs41K80a9YsBgwY\nUCdfeFAyxpiG+P2kmIXb3vt8VU1X1f6qmgZchAtMD0apPPNwQ6/DTQA+DEsfLCL9ItKLga+iVIYO\nY8iQIXz55Zd1jn3++ee1aSNGjGDt2rXs3bu3Nn3p0qW1jwcMGEBycjLbtm1jwIABtV+vvfYaL7/8\ncstchDGmTfMbhM4Gfqaqr4cfVNVXgdtxI92iYRbwTRGZJiLDvblEJwKPeenzgQXAiyJyvNc8OBN4\nRFUrolSGDuPqq69myZIlPPTQQ6xdu5aPPvqIadOmcdpppzFkyBDOPvtssrOzue2221i1ahUfffQR\nv/rVr2qfn56ezuTJk3n44Yd54403yM/P5/e//z1PPPEE/fr1a+SVjTHG8RuEqoA9DaRtwY2eazZV\nXYKrXf0XrmZzAa72tcJLD3rp23CTZJ8DngWmR+P1O5phw4bx1FNPsXDhQi644AJuv/12zjzzTB57\nzMX8zMxMnn/+eaqqqrjkkkuYPn06V199dZ1z3HTTTXz3u99l5syZnH322bzwwgtMnz6diy++OB6X\nZIxpYwKRbf71EZFpuMBwpqpuDjveGXgdeF9V74lZKZtJRAYC6/wuNWOMMQYKCgqYOHEiwCBVXR+L\n1/A7Oq6v97VGRObh5uZ0A07BTRQtD5vQGlTVs6JeUmOMMe2O3yA0lAMd/0lAaBxw6FgitpWDMcaY\nJvI7WbW+rRyMMcaYZmnqZNWRuCHU2bi5QvNUVWNRMGOMMe2f38mqCcBs4Arc6gQhQRH5A/BDb+Sa\nMcYY45vfIdo/B77vfc8FknH9QrfjVri+NSalM8YY0675bY67ErhPVX8ZdqwAmCkiaV76zGgXzhhj\nTPvmtybUB/i4gbRPODBazhhjjPHNbxBaC4xrIG0cbtUEY4wxpkn8BqFngTtF5GYR6SMiCd73nwJ3\n4JbPMa3M1q1bERE+/fTQe/0Fg0FeeeUVdu7c2QIlM8YYpymraP8VeBjXF1Tpff9f4G/AfTEpnWkx\nX3zxBVOmTKG0tDTeRTHGdCB+J6tWAz8QkZm4Te26AruBD1V1WQzL1/Zce23DabNnt1w5msjPGoLG\nGBNthwxCItILN/BgjRdwLOi0Ups2bWLatGl89tln5OTkcN1119WmlZeX88gjjzBnzhwKCwvJzMxk\nwoQJ3HPPPezcuZPLL78cgIkTJ3L99dfzk5/8hLfeeounn36avLw8AoEAI0aM4I477uCYY46J1yUa\nY9qZBpvjRCRVRP6M27F0AVAoIi+ISE6Llc74VllZyVVXXUVpaSkvvPAC999/P08//XRt+kMPPcT7\n77/PL3/5S/79739zzz338Prrr/Piiy/Sp08fnnzySQD+9re/ccUVV/D1119z0003cfHFF/PGG2/w\nhz/8AYC77747LtdnjGmfGqsJTQe+A/wW+AIQ4Fpc4Prv2BfNNMUnn3zCunXr+M1vfkPfvm7H87vu\nuotrrrkGgGOPPZZzzz2XMWPGAJCbm8uf//xnVq1aRWJiItnZ2QB07dqVjIwMkpOT+cUvfsGll15a\nm/+SSy7hrrvuisPVGWPaq8aC0LeBaap6b+iAiHwNzBaRNFUti3npjG95eXnk5OTUBiBwgSfkwgsv\nZN68ecycOZP169ezevVqNm7c2OD+SiNGjCArK4vZs2ezevVqNmzYwIoVK6ipqYn5tRhjOo7GRsfl\nAh9EHHsDF7gGxqpA5vAEAoGDBhckJyfXPr7zzjv52c9+RjAYZNKkSTzxxBOccMIJDZ5v/vz5nH32\n2axYsYJRo0bx05/+lDvvvDNm5TfGdEyN1YRSgMjazg7ve3psimMO14gRI9i9ezfr169n4MCBACxd\nuhSAPXv28Pe//51Zs2YxadIkAKqqqsjPz6+tOQUCgTrne/755znllFN49NFHa499/LFbNCMYDB6U\n3xhjDkeTtnIIY59ADYnTMOwTTzyRo446iltvvZV77rmHyspKZsyYAUBmZiaZmZm8++67DB8+nH37\n9jF79my2bNlCRUUFABkZGQCsWLGC7Oxsevfuzdy5c/nqq6/o1q0bc+fO5fnnnwegoqKC1NTUuFyn\nMaZ9OdRk1YYmj9ikklYmMTGRZ555hj59+vD973+fG2+8kcmTJwOQlJTEo48+yrJlyzjvvPP40Y9+\nRHZ2NldccUVtbWno0KGcddZZ3HzzzfzqV7/ihhtuYOTIkVx55ZV8+9vfZs6cOTz44IMALFmyJF6X\naYxpZwINTVIUkRpgIVAUnh+YCHwKFIcdD6rqWbEqZHOJyEBg3bvvvttgR7wxxpi6CgoKmDhxIsAg\nVV0fi9dorDnuQ1yNJznieGiwQuRxY4wxpkkaDEKqenoLlsMYY0wH5HcBU2OMMSbqLAgZY4yJGwtC\nxhhj4saCkDHGmLixIGSMMSZuLAgZY4yJGwtCxhhj4saCkDHGmLg53AVM40pEEoEZwGQgC/g38GNV\n3RbPchljjGmatloTmgr8APg+8E3c3kcvxbNAxhhjmq7NBSERSQFuBO5Q1bdV9QvgUuAUETk5vqUz\nxhjTFG0uCAGjcU1wc0MHvNVd1wPj41IiY4wxh6Ut9gmF9mLYFHF8M9CvgeckAmzdujVWZTLGmHYn\n7DMzMVav0RaDUCegRlUrI46XA2kNPKcPwOWXXx7LchljTHvVB1gTixO3xSBUCiSISJKqVoUdTwVK\nGnjOZ7imui1AdYzLZ4wx7UUiLgB9FqsXaItBKN/73ifsMUBfDm6iA0BVy4F5MS6XMca0RzGpAYW0\nxYEJi3Fbi58WOuBt3z0QtxusMcaYNiIQDAbjXYYmE5EHcRNVJwPbgSeBMtsN1hhj2pa22BwHcBeQ\nDPzR+/5v4MdxLZExxpgma5M1IWOMMe1DW+wTMsYY00601ea4wyIiTwFJqnpV2LHvAVOAQcBS4C5V\nfTss/UjgMeBkYB/wG+De0PBwEckEioBAxMt9T1X/GMPL8UVEegEzgUlAOvApcIuqLvXSJ3npAuQB\nU1T1zbDn9wQe955fATwH3Bk+PF5EbgZuAnoAHwM/UtW82F+dP7G+B+39PRB2nlRgIfDLyOtqze+B\nWF9/a//9Q1T+Bo730scC+4E3gNtUdVdYnsN6D3SImpCIBERkOnBtxPHvAs8DfwKOA34PvCoip3vp\nOcBHuEmwE4DvAt8BZoed5ijv+2DcsPHQ199jdDm+iUgC8A9gGHAhLpDuBd4VkW4iMhJ4Ffgb7vr/\nCbwiIkeFneYloDduNOJk4IfAtLDXuNL7+RbgRNw8rn97f7Bx1xL3gPb/HkBEsrzzHFPPa7Ta90BL\nXD+t+PcPzb8HItIXeAdYB4wDLgG+Afw17DUO+z3Q7mtCIjIYV3s5GtgYkTwF+LOqPuD9vEpERgO/\nwK1N9wPcCg3/FYr4InIVME9E7vXWrDsayFfVdbG+lsNwLO5NM1JVV0BtzW8XcC5wCrBAVe/z8t8t\nIqfiFoi9RkTGAacCg73rWywitwKzRGS6N//qNuARVf27d/7LcJOCvw38uaUutBEtcQ/a7XvAy/8t\n3D9eexp4jdb8HmiJ62/Nv39o/j34b6AM+B9Vrfae/2PgQxHpr6obacZ7oCPUhE7GTWodhYvk4Y7E\n1XTCfQmcLCJJXvqy8Cqnlw5uCwlwb8AVUS1x9GwEzgM07FiN9z0Ht4rE3IjnzOXAQrDjgQ0Rf1xz\ncQvIjvaaqYZRdzHZfcAiWs9isjG9B97P7fk9AHA+rpXgoFXq28B7IKbX72nNv39o/j14FfjvUACK\nfH5z3wPtvibktcn+EUBEIpPrW/R0IJACdPHSzxeRBFWtCUsH6Ol9PxpIF5H3gZG42cX31tem3NJU\ndSfwesThG3BtwnOAe2l8IdjcBtLx8oTW72vKYrItqgXuwae07/cAqnpj6HE9f0OHs6Bwi2mB64dW\n/PuH5t8DVV3DwasmTPGesxRX06KxczSmI9SEGvMH4HoRmSgiiSIyAbjSS0vBtXn2BB4SkU5e596v\ngCovHVx7cHfgAeBsXIfc6yJyRgtehy8icgGunI941fJOuGp2uPCFYA9K9xaODXp5OnmHGztHqxKD\newDt+z1wKG3qPRCD64c29PuH5t8Db7GA83ADD6pp5nug3deEDuFBXJB5E7dQ3zLgl7hf0F5V3Swi\nl+Dag3+KGx13D65zcq93jqEAqrrf+/kLETkauBl4r4Wu45BEZDLwDPAXXPstuM7DyI7D8IVgD0oX\nkWTcKKASL53IPDS+mGzcxOgeQPt+DxxKm3kPxOj6oY38/qF590BEEnGjRK8FrlPVV8OeH3pOo+eo\nT4euCalqhapej2vfP0JVj8ENP9ymqiVentdUtS+u2aEHbnhuD7zqqaruD3vzhSyhFTRFhIjInbhy\nPwV8P6xpMR9vm4sw4QvBNpSOlyd8MdmGztEqxPAetPf3wKG0ifdADK+/Tfz+oXn3QETScCPsrgT+\nn6qGjxBu1nugQwchEZkhIlNUtVxVQ7s3/SeunRQROVVE3hWRRFXdoqoVXnoJ8ImI9BKRPSJyccSp\nx+JqVXEnIrcBM4B7VPUnqhq+RMY8whaC9UzgwEKw84DBItIvIr0Y+EpVt+PmFIQvJpuJu/5Ws5hs\nLO9BB3gPNKotvAdief1t4fcPzbsH3hDvvwETgfNVtc5ot+a+Bzp6c9x64GERWQKsxE20OgG4zktf\nCTOlgT0AAAP/SURBVByP6xN6AjcaahZwv6oWAUUi8gnwvyKyBxf1r8SNohnTkhdSHxE5Brgf+C3w\njIj0Dksuxl3L5yIyDXgBuAw3xj90/fOBBcCLInI9EJrw9ogXkAEewV3/alwn5f24oZkvx/La/GqB\ne7Ctnb8H/Gi174FYX7+qturfP0TlHlyH6wO6CjdFIfz5O70+0sN+D3TompCqPovrA5oN/P/27ibE\nqjqM4/g3AiFahLWJFi0ieYK2RVEaVARppQgG0QtCVGgLSQmKSoxQEWwxGckshISCXgiUiqKiZVSb\nECvjgRaBuUiKKCWwAls85+bxMkJ0X/4z4/cDw4E5L/eeO2d4zv/e/31+h6lp3LdlZnbrf6amZ67g\nzOdF2zJzZ+8w91MNVF+jYiaWA3dk5ny4C7qP+qzrYeqC6P9szsyvgbXAOuAQsJq60/kOoLtbWgv8\nRE1lfxXYB7wweIDMnAV2UBfhF9SEjTt7Raq1ib8GLOJr4L+Y59fAxM+f+f33h9Ffg0Ek9b459r8B\nRrsGbGAqSWrmvB4JSZLasghJkpqxCEmSmrEISZKasQhJkpqxCEmSmrEISSOIiNmIOB0Rq86xfnW3\n/rlpPzdpIfB7QtIIohI3v6W6al/b5agM1l0CHAF+BG4aymORhCMhaSSZeYJKn7ySalXStxu4FFhv\nAZLm5khIGoOI2A88RI14voyIW6ikyS2ZOdPbbgMVm3wV1WdsFtjdbygZERuBR4FrqMiII8D2zDzQ\nrX8EmKGCxbZRN5PXZcXNSwuKIyFpPDZT/eVejoglwF6qg/BLgw0iYivwCpVyeQ/Vh24HlWs12GYL\nFZz4NrAKeJCKUn4jIvqt8i+iGkuup/p//TCpE5Mm6Xzvoi2NRWb+GhGPU5krn1Bvz909GOFExFLg\nGWBPZj7Z7fZxRPwB7IqIPZl5jIqP35WZ/cJ0lIoRv7E7PtQN5PPzJUJa+r8sQtKYZObBiHiT6lr8\n2NDo5GYq6vi9iOj/370LvEjlt7yemZvg36IVVGrn7d22SzjbobGfhDRlFiFpvD6iitDwCOWybvnp\nOfa7AiAillHRIrcCp6hMq2+6bS4Y2uck0gJnEZKm47dueS8VpjjsWERcCHwA/E4Foh3OzL+7ULIH\n5thHWvAsQtJ0fA78BVyeme8MfhkRy4GtwNPUSOdqYENmftXbd2W3dCKRFh2LkDQFXQz0DBUVvxT4\njJqEsBP4hZqG/SdwFHgiIo5TI6KVwKbuMBdP+3lLk+adlTQ9TwHPUm+tfQhsB96nIuVPdTPp1gDH\nqajot4DrgbuA76mYeWlR8cuqkqRmHAlJkpqxCEmSmrEISZKasQhJkpqxCEmSmrEISZKasQhJkpqx\nCEmSmvkHfNBJkK6ldxkAAAAASUVORK5CYII=\n", + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "def plot_all(x_start=1994, x_end=2020, y_start=0, y_end=500):\n", + " \n", + " newfig()\n", + " plot_curve(x_start, x_end, y_start, y_end)\n", + " plot_data(x_start, x_end, y_start, y_end)\n", + " decorate(title='African Elephant Population', xlabel='Year', ylabel='Population (in thousands)')\n", + " \n", + "plot_all()" + ] + }, + { + "cell_type": "code", + "execution_count": 18, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [ + "system = System(t0 = 2013, tn = 2200, pop = elephant_database[2013],\n", + " poaching_rate = 0.074, birth_rate = 0.05)\n", + "\n", + "elephant_future = TimeSeries()\n", + "elephant_future[2013] = 401.732\n", + "\n", + "\n", + "def run_simulation(system):\n", + " elephant_boom = TimeSeries()\n", + " for i in linrange(system.t0, system.tn):\n", + " births = system.birth_rate * elephant_future[i]\n", + " deaths = system.poaching_rate * elephant_future[i]\n", + " elephant_future[i+1] = births - deaths + elephant_future[i]\n", + " system.elephant_boom = elephant_future\n", + "\n", + "run_simulation(system)" + ] + }, + { + "cell_type": "code", + "execution_count": 19, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "48.5367355922\n" + ] + }, + { + "data": { + "image/png": "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\n", + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "def plot_all(x_start=1994, x_end=2200, y_start=0, y_end=500, year_estimate=2100):\n", + "\n", + " newfig()\n", + " plot_curve(x_start, x_end, y_start, y_end)\n", + " plot_data(x_start, x_end, y_start, y_end)\n", + " plot(system.elephant_boom, 'g-', label='projection')\n", + " decorate(title='African Elephant Population', xlabel='Year', ylabel='Population (in thousands)')\n", + " \n", + " print(system.elephant_boom[year_estimate])\n", + " \n", + "plot_all()" + ] + }, + { + "cell_type": "code", + "execution_count": 21, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [ + "def poaching_sweep(num_points = 10):\n", + " \n", + " newfig()\n", + " poaching_array = linspace(system.poaching_rate-.024, system.poaching_rate+.024, num_points)\n", + " \n", + " for rate in poaching_array:\n", + " \n", + " slop = System(t0 = 2013, tn = 2200, pop = elephant_database[2013],\n", + " poaching_rate = rate, birth_rate = 0.05)\n", + " run_simulation(slop)\n", + " \n", + " plot(slop.poaching_rate, system.elephant_boom[2100], 'gs')\n", + " decorate(title='2100 Population', xlabel='Poaching Rate', ylabel='Final Population (in thousands)')" + ] + }, + { + "cell_type": "code", + "execution_count": 22, + "metadata": {}, + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "C:\\ProgramData\\Miniconda3\\lib\\site-packages\\matplotlib\\axes\\_axes.py:545: UserWarning: No labelled objects found. Use label='...' kwarg on individual plots.\n", + " warnings.warn(\"No labelled objects found. \"\n" + ] + }, + { + "data": { + "image/png": "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\nA0RAOi14u9yKAAAAAElFTkSuQmCC\n", + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "poaching_sweep()" + ] + }, + { + "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": 2 +} diff --git a/code/JOUST.ipynb b/code/JOUST.ipynb new file mode 100644 index 00000000..820bf5b5 --- /dev/null +++ b/code/JOUST.ipynb @@ -0,0 +1,491 @@ +{ + "cells": [ + { + "cell_type": "code", + "execution_count": 1, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [ + "%matplotlib inline\n", + "\n", + "from modsim import *" + ] + }, + { + "cell_type": "code", + "execution_count": 2, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [ + "radian = UNITS.radian\n", + "m = UNITS.meter\n", + "s = UNITS.second\n", + "g = UNITS.gram\n", + "kg = g*1000\n", + "degree = UNITS.degree" + ] + }, + { + "cell_type": "code", + "execution_count": 30, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [ + "rho_ash = 710 * kg/m**3\n", + " #using european ash via Engineering Toolbox\n", + "rho_air = 1.225 * kg/m**3\n", + " \n", + "knight_mass = 71 #* kg\n", + "pull_strength = 76 * kg\n", + "strength = 744.8 * kg * m / s**2\n", + " #RoyMurray\n", + " \n", + " \n", + "horse_mass = 500 #* kg\n", + " #via medievalwarefare.info\n", + "field_length = 36.6 * m\n", + "lance_length = 3.04 * m\n", + " #10 ft\n", + "heavy_armor = 50 #* kg, \n", + "medium_armor = 40 #* kg,\n", + "light_armor = 30 #* kg, \n", + "lance_angle = 30 * degree\n", + "max_speed = 13.4 * m / s\n", + "og_acceleration = 9.78 * m/s**2\n", + "og_armor_mass = 40 * kg" + ] + }, + { + "cell_type": "code", + "execution_count": 5, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [ + "masses = Condition(heavy_armor = 50, \n", + " medium_armor = 40,\n", + " light_armor = 30, \n", + " knight_mass = 71,\n", + " horse_mass = 500,)\n", + " \n", + " \n", + "\n", + "def make_system(condition):\n", + " unpack(condition)\n", + " mass_light = knight_mass+horse_mass+light_armor\n", + " mass_medium = knight_mass+horse_mass+medium_armor\n", + " mass_heavy = knight_mass+horse_mass+heavy_armor\n", + " \n", + " return System(mass_light=mass_light, mass_medium=mass_medium, mass_heavy=mass_heavy)" + ] + }, + { + "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", + "
value
mass_light601
mass_medium611
mass_heavy621
\n", + "
" + ], + "text/plain": [ + "mass_light 601\n", + "mass_medium 611\n", + "mass_heavy 621\n", + "dtype: int64" + ] + }, + "execution_count": 6, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "mass_system = make_system(masses)\n", + "mass_system" + ] + }, + { + "cell_type": "code", + "execution_count": 7, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [ + "angle_sweep = linspace(.8 * degree, 7.8 * degree, 35)\n", + "velocity_sweep = linspace(8 * m/s, 13.4 * m/s, 20)" + ] + }, + { + "cell_type": "code", + "execution_count": 16, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [ + "condition = Condition(heavy_armor = 50, \n", + " medium_armor = 30,\n", + " light_armor = 10, \n", + " knight_mass = 71,\n", + " horse_mass = 500,\n", + " angle_min = .8 * degree,\n", + " angle_max = 7.8 * degree,\n", + " velocity_min = 8 * m/s,\n", + " velocity_max = 13.4 * m/s)\n", + " \n", + " \n", + "\n", + "def make_system(condition):\n", + " unpack(condition)\n", + " \n", + " mass_light = knight_mass+horse_mass+light_armor\n", + " mass_medium = knight_mass+horse_mass+medium_armor\n", + " mass_heavy = knight_mass+horse_mass+heavy_armor\n", + " angle_sweep = linspace(.8 * degree, 7.8 * degree, 35)\n", + " velocity_sweep = linspace(8 * m/s, 13.4 * m/s, 20)\n", + " \n", + " \n", + " return System(mass_light = mass_light, mass_medium = mass_medium, mass_heavy = mass_heavy,\n", + " angles = angle_sweep, velocities = velocity_sweep)" + ] + }, + { + "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", + "
value
mass_light581
mass_medium601
mass_heavy621
angles[0.8 degree, 1.0058823529411764 degree, 1.2117...
velocities[8.0 meter / second, 8.284210526315789 meter /...
\n", + "
" + ], + "text/plain": [ + "mass_light 581\n", + "mass_medium 601\n", + "mass_heavy 621\n", + "angles [0.8 degree, 1.0058823529411764 degree, 1.2117...\n", + "velocities [8.0 meter / second, 8.284210526315789 meter /...\n", + "dtype: object" + ] + }, + "execution_count": 17, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "system = make_system(condition)\n", + "system\n" + ] + }, + { + "cell_type": "code", + "execution_count": 10, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [ + "def physics(system):\n", + " p1, p2, p3 = Series\n", + " p1 = mass_light * velocities\n", + " p2 = mass_medium * velocities\n", + " p3 = mass_heavy * velocities\n", + " \n", + " return p1, p2, p3" + ] + }, + { + "cell_type": "code", + "execution_count": 11, + "metadata": {}, + "outputs": [ + { + "ename": "TypeError", + "evalue": "'type' object is not iterable", + "output_type": "error", + "traceback": [ + "\u001b[1;31m---------------------------------------------------------------------------\u001b[0m", + "\u001b[1;31mTypeError\u001b[0m Traceback (most recent call last)", + "\u001b[1;32m\u001b[0m in \u001b[0;36m\u001b[1;34m()\u001b[0m\n\u001b[1;32m----> 1\u001b[1;33m \u001b[0mphysics\u001b[0m\u001b[1;33m(\u001b[0m\u001b[0msystem\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0m", + "\u001b[1;32m\u001b[0m in \u001b[0;36mphysics\u001b[1;34m(system)\u001b[0m\n\u001b[0;32m 1\u001b[0m \u001b[1;32mdef\u001b[0m \u001b[0mphysics\u001b[0m\u001b[1;33m(\u001b[0m\u001b[0msystem\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m:\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[1;32m----> 2\u001b[1;33m \u001b[0mp1\u001b[0m\u001b[1;33m,\u001b[0m \u001b[0mp2\u001b[0m\u001b[1;33m,\u001b[0m \u001b[0mp3\u001b[0m \u001b[1;33m=\u001b[0m \u001b[0mSeries\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0m\u001b[0;32m 3\u001b[0m \u001b[0mp1\u001b[0m \u001b[1;33m=\u001b[0m \u001b[0mmass_light\u001b[0m \u001b[1;33m*\u001b[0m \u001b[0mvelocities\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0;32m 4\u001b[0m \u001b[0mp2\u001b[0m \u001b[1;33m=\u001b[0m \u001b[0mmass_medium\u001b[0m \u001b[1;33m*\u001b[0m \u001b[0mvelocities\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0;32m 5\u001b[0m \u001b[0mp3\u001b[0m \u001b[1;33m=\u001b[0m \u001b[0mmass_heavy\u001b[0m \u001b[1;33m*\u001b[0m \u001b[0mvelocities\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n", + "\u001b[1;31mTypeError\u001b[0m: 'type' object is not iterable" + ] + } + ], + "source": [ + "physics(system)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [] + }, + { + "cell_type": "code", + "execution_count": 15, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [ + "condition = Condition(rho_ash = 710 * kg/m**3,\n", + " #using european ash via Engineering Toolbox\n", + " rho_air = 1.225 * kg/m**3, \n", + " \n", + " knight_mass = 71 * kg,\n", + " pull_strength = 76 * kg,\n", + " strength = 744.8 * kg * m / s**2,\n", + " #RoyMurray\n", + " \n", + " \n", + " horse_mass = 500 * kg,\n", + " #via medievalwarefare.info\n", + " field_length = 36.6 * m,\n", + " lance_length = 3.5 * m,\n", + " #10 ft\n", + " harmor_mass = 50 * kg, \n", + " larmor_mass = 30 * kg, \n", + " lance_angle = 30 * degree,\n", + " max_speed = 13.4 * m / s,\n", + " og_acceleration = 9.78 * m/s**2,\n", + " og_armor_mass = 40 * kg)\n" + ] + }, + { + "cell_type": "code", + "execution_count": 16, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [ + "init = State(x=0)" + ] + }, + { + "cell_type": "code", + "execution_count": 17, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [ + "def make_knight_1(condition):\n", + " x_init = 0\n", + " mass = horse_mass + knight_mass\n", + " \n", + " \n", + " return (rho_ash, rho_air, knight_mass, strength, horse_mass, field_length, \n", + " lance_length, lance_Angle, max_speed, x_init)" + ] + }, + { + "cell_type": "code", + "execution_count": 18, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [ + "def make_knight_2(condition):\n", + " x_init = field_length/2" + ] + }, + { + "cell_type": "code", + "execution_count": 14, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [ + "mass = horse_mass + knight_mass + og_armor_mass\n", + "F_horse = mass * og_acceleration \n", + "\n", + "acceleration = F_horse / mass" + ] + }, + { + "cell_type": "code", + "execution_count": 19, + "metadata": {}, + "outputs": [ + { + "ename": "SyntaxError", + "evalue": "invalid syntax (, line 7)", + "output_type": "error", + "traceback": [ + "\u001b[1;36m File \u001b[1;32m\"\"\u001b[1;36m, line \u001b[1;32m7\u001b[0m\n\u001b[1;33m for mass in\u001b[0m\n\u001b[1;37m ^\u001b[0m\n\u001b[1;31mSyntaxError\u001b[0m\u001b[1;31m:\u001b[0m invalid syntax\n" + ] + } + ], + "source": [ + "def acceleration_sweep(condition):\n", + " og_mass = horse_mass + knight_mass + og_armor_mass\n", + " F_horse = og_mass * og_acceleration \n", + " \n", + " armor_array = linspace(larmor_mass, harmor_mass, 20)\n", + " \n", + " for mass in armor_array:\n", + " \n", + "\n", + " acceleration = F_horse / mass" + ] + }, + { + "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": [] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [ + "f_drag = -rho * v.mag * v * C_d * area / 2" + ] + } + ], + "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": 2 +} diff --git a/code/chap01_fig01.pdf b/code/chap01_fig01.pdf new file mode 100644 index 00000000..2f887228 Binary files /dev/null and b/code/chap01_fig01.pdf differ diff --git a/code/chap01mine.ipynb b/code/chap01mine.ipynb new file mode 100644 index 00000000..02f77320 --- /dev/null +++ b/code/chap01mine.ipynb @@ -0,0 +1,2201 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# Modeling and Simulation in Python\n", + "\n", + "Chapter 1: Modeling\n", + "\n", + "Copyright 2017 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 (like the cell below this one).\n", + "\n", + "### Selecting and running cells\n", + "\n", + "To select a cell, click in the fart 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. If you run a text cell, it will typeset the text and display the result.\n", + "\n", + "If you run a code cell, it 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 run 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", + "You might want to 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, and 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, selection \"Close and Halt\" from the File menu." + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "'Hello'" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "'Hello'" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "'Hello'" + ] + }, + { + "cell_type": "code", + "execution_count": 1, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "'hello'" + ] + }, + "execution_count": 1, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### Using the notebooks\n", + "\n", + "The notebooks for each chapter contains the code from the chapter along with addition examples, explanatory text, and exercises. I recommend you read the chapter first to understand the concepts and vocabulary, then run the notebook to review what you learned and see it in action, and then attempt the exercises.\n", + "\n", + "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.\n", + "\n", + "If you try to work through the notebooks without reading the book, you're gonna have a bad time. If you have previous programming experience, you might get through the first few notebooks, but sooner or later, you will get to the end of your leash, and you won't like it." + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### Importing modsim\n", + "\n", + "The following cell imports `modsim`, which is a collection of functions we will use throughout the book. Whenever you start the notebook, you will have to run the following cell. It does two things:\n", + "\n", + "1. It uses a Jupyter \"magic command\" to specify whether figures should appear in the notebook, or pop up in a new window.\n", + "\n", + "2. It imports everything defined in `modsim`.\n", + "\n", + "Select the following cell and press SHIFT-ENTER to run it." + ] + }, + { + "cell_type": "code", + "execution_count": 16, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "If this cell runs successfully, it produces no output other than this message.\n" + ] + } + ], + "source": [ + "# If you want the figures to appear in the notebook, \n", + "# and you want to interact with them, use\n", + "# %matplotlib notebook\n", + "\n", + "# If you want the figures to appear in the notebook, \n", + "# and you don't want to interact with them, use\n", + "# %matplotlib inline\n", + "\n", + "# If you want the figures to appear in separate windows, use\n", + "# %matplotlib qt5\n", + "\n", + "# To switch from one to another, you have to select Kernel->Restart\n", + "\n", + "%matplotlib qt5\n", + "\n", + "from modsim import *\n", + "\n", + "print('If this cell runs successfully, it produces no output other than this message.')" + ] + }, + { + "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. The following to lines create new variables named `meter` and `second`." + ] + }, + { + "cell_type": "code", + "execution_count": 20, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [ + "meter = UNITS.meter\n", + "second = UNITS.second\n", + "newton = UNITS.newton" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "To find out what units are defined, type `UNITS.` 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": 21, + "metadata": {}, + "outputs": [ + { + "data": { + "text/html": [ + "bushel" + ], + "text/latex": [ + "$bushel$" + ], + "text/plain": [ + "" + ] + }, + "execution_count": 21, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "UNITS.bushel" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Create a variable named `a` and display its value:" + ] + }, + { + "cell_type": "code", + "execution_count": 22, + "metadata": {}, + "outputs": [ + { + "data": { + "text/html": [ + "9.8 meter/second2" + ], + "text/latex": [ + "$9.8 \\frac{meter}{second^{2}}$" + ], + "text/plain": [ + "" + ] + }, + "execution_count": 22, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "a = 9.8 * meter / second**2\n", + "a" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "collapsed": true + }, + "source": [ + "Create `t` and display its value:" + ] + }, + { + "cell_type": "code", + "execution_count": 23, + "metadata": {}, + "outputs": [ + { + "data": { + "text/html": [ + "4 second" + ], + "text/latex": [ + "$4 second$" + ], + "text/plain": [ + "" + ] + }, + "execution_count": 23, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "t = 4 * second\n", + "t" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "collapsed": true + }, + "source": [ + "If you create a variable and don't display the value, you don't get any output:" + ] + }, + { + "cell_type": "code", + "execution_count": 24, + "metadata": {}, + "outputs": [ + { + "data": { + "text/html": [ + "156.8 meter" + ], + "text/latex": [ + "$156.8 meter$" + ], + "text/plain": [ + "" + ] + }, + "execution_count": 24, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "h = a * t**2\n", + "h" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "collapsed": true + }, + "source": [ + "Add a second line to the previous cell to display the value of `h`.\n", + "\n", + "Now let's solve the falling penny problem. The following lines set `h` to the height of the Empire State Building and compute the time it would take a penny to fall, assuming constant acceleration." + ] + }, + { + "cell_type": "code", + "execution_count": 25, + "metadata": {}, + "outputs": [ + { + "data": { + "text/html": [ + "8.817885349720552 second" + ], + "text/latex": [ + "$8.817885349720552 second$" + ], + "text/plain": [ + "" + ] + }, + "execution_count": 25, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "h = 381 * meter\n", + "t = sqrt(2 * h / a)\n", + "t" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "collapsed": true + }, + "source": [ + "Given `t`, we can compute the velocity of the penny when it lands." + ] + }, + { + "cell_type": "code", + "execution_count": 26, + "metadata": {}, + "outputs": [ + { + "data": { + "text/html": [ + "86.41527642726142 meter/second" + ], + "text/latex": [ + "$86.41527642726142 \\frac{meter}{second}$" + ], + "text/plain": [ + "" + ] + }, + "execution_count": 26, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "v = a * t\n", + "v" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "collapsed": true + }, + "source": [ + "We can convert from one set of units to another like this:" + ] + }, + { + "cell_type": "code", + "execution_count": 27, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [ + "mile = UNITS.mile\n", + "hour= UNITS.hour" + ] + }, + { + "cell_type": "code", + "execution_count": 28, + "metadata": {}, + "outputs": [ + { + "data": { + "text/html": [ + "193.30546802805438 mile/hour" + ], + "text/latex": [ + "$193.30546802805438 \\frac{mile}{hour}$" + ], + "text/plain": [ + "" + ] + }, + "execution_count": 28, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "v.to(mile/hour)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "**Exercise:** In reality, air resistance prevents the penny from reaching this velocity. At about 20 meters per second, 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 20 meters per second, and then 0 afterwards. What is the total time for the penny to fall 381 meters?" + ] + }, + { + "cell_type": "code", + "execution_count": 29, + "metadata": {}, + "outputs": [ + { + "data": { + "text/html": [ + "20.070408163265306 second" + ], + "text/latex": [ + "$20.070408163265306 second$" + ], + "text/plain": [ + "" + ] + }, + "execution_count": 29, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "# Solution goes here\n", + "v_perf = 20 * meter / second\n", + "a = 9.8 * meter / second**2\n", + "height_one = v_perf**2 / (2 * a)\n", + "time_one = sqrt(2 * height_one / a)\n", + "height_two = 381 * meter - height_one\n", + "time_two = time_one + height_two / v_perf\n", + "time_two" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Modeling a bikeshare system" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "We'll start with a `System` object that represents the number of bikes at each station." + ] + }, + { + "cell_type": "code", + "execution_count": 30, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [ + "bikeshare = System(olin=10, wellesley=2, babson=0)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "If you display the value of a `System` object, it lists the system variables and their values (not necessarily in the order you defined them):" + ] + }, + { + "cell_type": "code", + "execution_count": 97, + "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
olin-1
wellesley13
\n", + "
" + ], + "text/plain": [ + "olin -1\n", + "wellesley 13\n", + "dtype: int64" + ] + }, + "execution_count": 97, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "bikeshare" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "We can access the system variables using dot notation." + ] + }, + { + "cell_type": "code", + "execution_count": 96, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "-1" + ] + }, + "execution_count": 96, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "bikeshare.olin" + ] + }, + { + "cell_type": "code", + "execution_count": 33, + "metadata": { + "scrolled": true + }, + "outputs": [ + { + "ename": "AttributeError", + "evalue": "'System' object has no attribute 'wellsley'", + "output_type": "error", + "traceback": [ + "\u001b[1;31m---------------------------------------------------------------------------\u001b[0m", + "\u001b[1;31mAttributeError\u001b[0m Traceback (most recent call last)", + "\u001b[1;32m\u001b[0m in \u001b[0;36m\u001b[1;34m()\u001b[0m\n\u001b[1;32m----> 1\u001b[1;33m \u001b[0mbikeshare\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0mwellsley\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0m", + "\u001b[1;32mC:\\ProgramData\\Miniconda3\\lib\\site-packages\\pandas\\core\\generic.py\u001b[0m in \u001b[0;36m__getattr__\u001b[1;34m(self, name)\u001b[0m\n\u001b[0;32m 3079\u001b[0m \u001b[1;32mif\u001b[0m \u001b[0mname\u001b[0m \u001b[1;32min\u001b[0m \u001b[0mself\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0m_info_axis\u001b[0m\u001b[1;33m:\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0;32m 3080\u001b[0m \u001b[1;32mreturn\u001b[0m \u001b[0mself\u001b[0m\u001b[1;33m[\u001b[0m\u001b[0mname\u001b[0m\u001b[1;33m]\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[1;32m-> 3081\u001b[1;33m \u001b[1;32mreturn\u001b[0m \u001b[0mobject\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0m__getattribute__\u001b[0m\u001b[1;33m(\u001b[0m\u001b[0mself\u001b[0m\u001b[1;33m,\u001b[0m \u001b[0mname\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0m\u001b[0;32m 3082\u001b[0m \u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0;32m 3083\u001b[0m \u001b[1;32mdef\u001b[0m \u001b[0m__setattr__\u001b[0m\u001b[1;33m(\u001b[0m\u001b[0mself\u001b[0m\u001b[1;33m,\u001b[0m \u001b[0mname\u001b[0m\u001b[1;33m,\u001b[0m \u001b[0mvalue\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m:\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n", + "\u001b[1;31mAttributeError\u001b[0m: 'System' object has no attribute 'wellsley'" + ] + } + ], + "source": [ + "bikeshare.wellsley" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "**Exercise:** What happens if you spell the name of a system 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 system variable. " + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "**Exercise:** Add a third attribute called `babson` with initial value 0, and print the state of `bikeshare` again." + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Plotting\n", + "\n", + "`newfig` creates a new figure, which should appear either in the notebook or in a new window, depending on which magic command you ran in the first code cell.\n", + "\n", + "`plot` adds a data point to the figure; in this example, you should see a red square and a blue circle representing the number of bikes at each station." + ] + }, + { + "cell_type": "code", + "execution_count": 34, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [ + "newfig()\n", + "plot(bikeshare.olin, 'rs-')\n", + "plot(bikeshare.wellesley, 'bo-')\n", + "plot(bikeshare.babson, 'go-')" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "We can use the operators `+=` and `-=` to increase and decrease the system variables. The following lines move a bike from Olin to Wellesley." + ] + }, + { + "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", + "
value
olin9
wellesley3
babson0
\n", + "
" + ], + "text/plain": [ + "olin 9\n", + "wellesley 3\n", + "babson 0\n", + "dtype: int64" + ] + }, + "execution_count": 35, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "bikeshare.olin -= 1\n", + "bikeshare.wellesley += 1\n", + "bikeshare" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "And the following lines plot the updated state of the system. You should see two new data points with lines connecting them to the old data points." + ] + }, + { + "cell_type": "code", + "execution_count": 36, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [ + "plot(bikeshare.olin, 'rs-')\n", + "plot(bikeshare.wellesley, 'bo-')" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "**Exercise:** In the cell below, write a few lines of code to move a bike from Wellesley to Olin and plot the updated state." + ] + }, + { + "cell_type": "code", + "execution_count": 37, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [ + "# Solution goes here\n", + "bikeshare.wellesley -= 1\n", + "bikeshare.olin += 1\n", + "plot(bikeshare.olin, 'ro-' )\n", + "plot(bikeshare.wellesley, 'bo-' )" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Functions\n", + "\n", + "Now we can take the code we've written so far and encapsulate it in functions." + ] + }, + { + "cell_type": "code", + "execution_count": 38, + "metadata": { + "collapsed": true + }, + "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." + ] + }, + { + "cell_type": "code", + "execution_count": 39, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [ + "def plot_state():\n", + " plot(bikeshare.olin, 'rs-', label='Olin')\n", + " plot(bikeshare.wellesley, 'bo-', label='Wellesley')" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Now when we run the functions, it runs the statements inside." + ] + }, + { + "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", + "
value
olin9
wellesley3
babson0
\n", + "
" + ], + "text/plain": [ + "olin 9\n", + "wellesley 3\n", + "babson 0\n", + "dtype: int64" + ] + }, + "execution_count": 40, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "bike_to_wellesley()\n", + "plot_state()\n", + "bikeshare" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "You should see two more data points that represent the current state of the system. If the figure is embedded in the notebook, you might have to scroll up to see the change.\n", + "\n", + "One common error is to omit the parentheses, which has the effect of looking up the function, but not running it." + ] + }, + { + "cell_type": "code", + "execution_count": 41, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "" + ] + }, + "execution_count": 41, + "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. Run the new function and print or plot the results to confirm that it works." + ] + }, + { + "cell_type": "code", + "execution_count": 42, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [ + "# Solution goes here\n", + "b = 1\n", + "def bike_to_olin (b):\n", + " bikeshare.wellesley -= b\n", + " bikeshare.olin += b\n", + "bike_to_olin(b)\n", + "plot(bikeshare.wellesley, 'ro-')\n", + "plot(bikeshare.olin, 'bo-')" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Parameters" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Before we go on, let's start with a new state object and a new plot." + ] + }, + { + "cell_type": "code", + "execution_count": 43, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [ + "bikeshare = System(olin=10, wellesley=2)\n", + "newfig()\n", + "plot_state()" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Since we have two similar functions, we can create a new function, `move_bike` that takes a parameter `n`, which indicates how many bikes are moving, and in which direction." + ] + }, + { + "cell_type": "code", + "execution_count": 44, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [ + "def move_bike(n):\n", + " bikeshare.olin -= n\n", + " bikeshare.wellesley += n" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Now we can use `move_bike` to write simpler versions of the other functions." + ] + }, + { + "cell_type": "code", + "execution_count": 45, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [ + "def bike_to_wellesley():\n", + " move_bike(1)\n", + " \n", + "def bike_to_olin():\n", + " move_bike(-1)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "When we define these functions, we replace the old definitions with the new ones.\n", + "\n", + "Now we can test them and update the figure." + ] + }, + { + "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", + "
value
olin9
wellesley3
\n", + "
" + ], + "text/plain": [ + "olin 9\n", + "wellesley 3\n", + "dtype: int64" + ] + }, + "execution_count": 46, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "bike_to_wellesley()\n", + "plot_state()\n", + "bikeshare" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Again, each time you run `plot_state` you should see changes in the figure." + ] + }, + { + "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", + "
value
olin10
wellesley2
\n", + "
" + ], + "text/plain": [ + "olin 10\n", + "wellesley 2\n", + "dtype: int64" + ] + }, + "execution_count": 47, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "bike_to_olin()\n", + "plot_state()\n", + "bikeshare" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "At this point, `move_bike` is complicated enough that we should add some documentation. The text in triple-quotation marks is in English, not Python. It doesn't do anything when the program runs, but it helps people understand what this function does and how to use it." + ] + }, + { + "cell_type": "code", + "execution_count": 48, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [ + "def move_bike(n):\n", + " \"\"\"Move bikes.\n", + " \n", + " n: number of bikes: positive moves from Olin to Wellesley;\n", + " negative moves from Wellesley to Olin\n", + " \"\"\"\n", + " bikeshare.olin -= n\n", + " bikeshare.wellesley += n" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Whenever you make a figure, you should put labels on the axes to explain what they mean and what units they are measured in. Here's how:" + ] + }, + { + "cell_type": "code", + "execution_count": 49, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [ + "label_axes(title='Olin-Wellesley Bikeshare',\n", + " xlabel='Time step (min)', \n", + " ylabel='Number of bikes')" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Again, you might have to scroll up to see the effect.\n", + "\n", + "And you can save figures as files; the suffix of the filename indicates the format you want. This example saves the current figure in a PDF file." + ] + }, + { + "cell_type": "code", + "execution_count": 50, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Saving figure to file chap01_fig01.pdf\n" + ] + } + ], + "source": [ + "savefig('chap01_fig01.pdf')" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "**Exercise:** The following function definitions start with print statements so they display messages when they run. Run each of these functions (with appropriate arguments) and confirm that they do what you expect.\n", + "\n", + "Adding print statements like this to functions is a useful debugging technique. Keep it in mind!" + ] + }, + { + "cell_type": "code", + "execution_count": 51, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [ + "def move_bike_debug(n):\n", + " print('Running move_bike_debug with argument', n)\n", + " bikeshare.olin -= n\n", + " bikeshare.wellesley += n\n", + " \n", + "def bike_to_wellesley_debug():\n", + " print('Running bike_to_wellesley_debug')\n", + " move_bike_debug(1)\n", + " \n", + "def bike_to_olin_debug():\n", + " print('Running bike_to_olin_debug')\n", + " move_bike_debug(-1)" + ] + }, + { + "cell_type": "code", + "execution_count": 52, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Running move_bike_debug with argument 1\n" + ] + } + ], + "source": [ + "# Solution goes here\n", + "move_bike_debug(1)" + ] + }, + { + "cell_type": "code", + "execution_count": 53, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Running bike_to_wellesley_debug\n", + "Running move_bike_debug with argument 1\n" + ] + } + ], + "source": [ + "# Solution goes here\n", + "bike_to_wellesley_debug()" + ] + }, + { + "cell_type": "code", + "execution_count": 54, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Running bike_to_olin_debug\n", + "Running move_bike_debug with argument -1\n" + ] + } + ], + "source": [ + "# Solution goes here\n", + "bike_to_olin_debug()" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Conditionals" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "The function `flip` takes a probability and returns either `True` or `False`, which are special values defined by Python.\n", + "\n", + "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": 55, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "True" + ] + }, + "execution_count": 55, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "flip(0.8)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Modify the argument in the previous cell and see what effect it has.\n", + "\n", + "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": 56, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "heads\n" + ] + } + ], + "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": 57, + "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": [ + "Now let's get back to the bikeshare system. Again let's start with a new `System` object and a new plot." + ] + }, + { + "cell_type": "code", + "execution_count": 58, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [ + "bikeshare = System(olin=10, wellesley=2)\n", + "newfig()\n", + "plot_state()" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Suppose that in any given minute, there is a 70% 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": 59, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Moving a bike to Wellesley\n" + ] + }, + { + "data": { + "text/html": [ + "
\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
value
olin9
wellesley3
\n", + "
" + ], + "text/plain": [ + "olin 9\n", + "wellesley 3\n", + "dtype: int64" + ] + }, + "execution_count": 59, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "if flip(0.7):\n", + " bike_to_wellesley()\n", + " print('Moving a bike to Wellesley')\n", + "\n", + "plot_state()\n", + "bikeshare" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "And maybe at the same time, there is also a 60% chance that a student at Wellesley rides to Olin." + ] + }, + { + "cell_type": "code", + "execution_count": 60, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "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", + "
value
olin10
wellesley2
\n", + "
" + ], + "text/plain": [ + "olin 10\n", + "wellesley 2\n", + "dtype: int64" + ] + }, + "execution_count": 60, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "if flip(0.6):\n", + " bike_to_olin()\n", + " print('Moving a bike to Olin')\n", + "\n", + "plot_state()\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": 61, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [ + "def step():\n", + " if flip(0.7):\n", + " bike_to_wellesley()\n", + " print('Moving a bike to Wellesley')\n", + " \n", + " if flip(0.6):\n", + " bike_to_olin()\n", + " print('Moving a bike to Olin')" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "If you run `step` a few times, it should update the current figure. In each time step, the number of bikes at each location might go up, down, or stay the same." + ] + }, + { + "cell_type": "code", + "execution_count": 62, + "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", + "
value
olin10
wellesley2
\n", + "
" + ], + "text/plain": [ + "olin 10\n", + "wellesley 2\n", + "dtype: int64" + ] + }, + "execution_count": 62, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "step()\n", + "plot_state()\n", + "bikeshare" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "The following function labels the axes and adds a legend to the figure." + ] + }, + { + "cell_type": "code", + "execution_count": 83, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [ + "def decorate(): \n", + " legend(loc='best')\n", + " label_axes(title='Olin-Wellesley Bikeshare',\n", + " xlabel='Time step (min)', \n", + " ylabel='Number of bikes')" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "As always, when you define a function, it has no effect until you run it." + ] + }, + { + "cell_type": "code", + "execution_count": 64, + "metadata": {}, + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "C:\\ProgramData\\Miniconda3\\lib\\site-packages\\matplotlib\\legend.py:326: UserWarning: Unrecognized location \"random string\". Falling back on \"best\"; valid locations are\n", + "\tbest\n", + "\tupper right\n", + "\tupper left\n", + "\tlower left\n", + "\tlower right\n", + "\tright\n", + "\tcenter left\n", + "\tcenter right\n", + "\tlower center\n", + "\tupper center\n", + "\tcenter\n", + "\n", + " six.iterkeys(self.codes))))\n" + ] + } + ], + "source": [ + "decorate()\n", + "legend(loc='random string')" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "**Exercise:** Change the argument of `legend` to `'random string'` and run `decorate` again. You should get an error message that lists the valid location where you can put the legend." + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Optional parameters" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Again let's start with a new `System` object and a new plot." + ] + }, + { + "cell_type": "code", + "execution_count": 98, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [ + "bikeshare = System(olin=10, wellesley=2)\n", + "newfig()\n", + "plot_state()" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "We can make `step` more general by adding parameters. Because these parameters have default values, they are optional." + ] + }, + { + "cell_type": "code", + "execution_count": 99, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [ + "def step(p1=0.5, p2=0.5):\n", + " print('p1 ->', p1)\n", + " print('p2 ->', p2)\n", + " if flip(p1):\n", + " bike_to_wellesley()\n", + " \n", + " if flip(p2):\n", + " bike_to_olin()" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "I added print statements, so each time we run `step` we can see the arguments.\n", + "\n", + "If you provide no arguments, you get the default values:" + ] + }, + { + "cell_type": "code", + "execution_count": 127, + "metadata": {}, + "outputs": [], + "source": [ + "step()\n", + "plot_state()" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "If you provide one argument, it overrides the first parameter." + ] + }, + { + "cell_type": "code", + "execution_count": 101, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "p1 -> 0.4\n", + "p2 -> 0.5\n" + ] + } + ], + "source": [ + "step(0.4)\n", + "plot_state()" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "If you provide two arguments, they override both." + ] + }, + { + "cell_type": "code", + "execution_count": 70, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "p1 -> 0.4\n", + "p2 -> 0.2\n" + ] + } + ], + "source": [ + "step(0.4, 0.2)\n", + "plot_state()" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "You can specify the names of the parameters you want to override." + ] + }, + { + "cell_type": "code", + "execution_count": 71, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "p1 -> 0.4\n", + "p2 -> 0.2\n" + ] + } + ], + "source": [ + "step(p1=0.4, p2=0.2)\n", + "plot_state()" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Which means you can override the second parameter and use the default for the first." + ] + }, + { + "cell_type": "code", + "execution_count": 72, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "p1 -> 0.5\n", + "p2 -> 0.2\n" + ] + } + ], + "source": [ + "step(p2=0.2)\n", + "plot_state()" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "You can combine both forms, but it is not very common:" + ] + }, + { + "cell_type": "code", + "execution_count": 103, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "p1 -> 0.4\n", + "p2 -> 0.2\n" + ] + } + ], + "source": [ + "step(0.4, p2=0.2)\n", + "plot_state()" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "One reason it's not common is that it's error prone. The following example causes an error." + ] + }, + { + "cell_type": "code", + "execution_count": 104, + "metadata": {}, + "outputs": [ + { + "ename": "SyntaxError", + "evalue": "positional argument follows keyword argument (, line 4)", + "output_type": "error", + "traceback": [ + "\u001b[1;36m File \u001b[1;32m\"\"\u001b[1;36m, line \u001b[1;32m4\u001b[0m\n\u001b[1;33m step(p1=0.4, 0.2)\u001b[0m\n\u001b[1;37m ^\u001b[0m\n\u001b[1;31mSyntaxError\u001b[0m\u001b[1;31m:\u001b[0m positional argument follows keyword argument\n" + ] + } + ], + "source": [ + "# If you remove the # at the beginning of the next line and run it, you get\n", + "# SyntaxError: positional argument follows keyword argument\n", + "\n", + "step(p1=0.4, 0.2)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "From the error message, you might infer that arguments like `step(0.4, 0.2)` are called \"positional\" and arguments like `step(p1=0.4, p2=0.2)` are called \"keyword arguments\"." + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "**Exercise:** Write a version of `decorate` that takes an optional parameter named `loc` with default value `'best'`. It should pass the value of `loc` along as an argument to `legend.` Test your function with different values of `loc`. [You can see the list of legal values here](https://matplotlib.org/api/pyplot_api.html#matplotlib.pyplot.legend)." + ] + }, + { + "cell_type": "code", + "execution_count": 105, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [ + "# Solution goes he\n", + "def decorate(p1='best'): \n", + " legend(loc=p1)\n", + " label_axes(title='Olin-Wellesley Bikeshare',\n", + " xlabel='Time step (min)', \n", + " ylabel='Number of bikes')" + ] + }, + { + "cell_type": "code", + "execution_count": 106, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [ + "# Solution goes here\n", + "decorate(p1='upper left')" + ] + }, + { + "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": 107, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [ + "def step(p1=0.5, p2=0.5):\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 `System` object and a new figure." + ] + }, + { + "cell_type": "code", + "execution_count": 108, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [ + "bikeshare = System(olin=10, wellesley=2)\n", + "newfig()\n", + "plot_state()\n", + "decorate()" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "We can use a for loop to move 4 bikes from Olin to Wellesley." + ] + }, + { + "cell_type": "code", + "execution_count": 109, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [ + "for i in range(4):\n", + " bike_to_wellesley()\n", + " plot_state()" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Or we can simulate 4 random time steps." + ] + }, + { + "cell_type": "code", + "execution_count": 110, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [ + "for i in range(4):\n", + " step()\n", + " plot_state()" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "If each step corresponds to a minute, we can simulate the rest of the hour like this." + ] + }, + { + "cell_type": "code", + "execution_count": 111, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [ + "for i in range(52):\n", + " step(p1=0.4, p2=0.2)\n", + " plot_state()" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "**Exercise:** Combine the examples from the previous two sections to write a function named `run_steps` that takes three parameters, named `num_steps`, `p1`, and `p2`. It should use a for loop to run `step` the number of times specified by `num_steps`, passing along the specified values of `p1` and `p2`. After each step, it should plot the updated state.\n", + "\n", + "Test your function by creating a new `System` object, creating a new figure, and running `run_steps`." + ] + }, + { + "cell_type": "code", + "execution_count": 118, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [ + "# Solution goes here\n", + "def run_steps(num_steps='a', p1=.'b', p2=.'c'):\n", + " for i in range(num_steps):\n", + " step(p1, p2)\n", + " plot_state()" + ] + }, + { + "cell_type": "code", + "execution_count": 128, + "metadata": {}, + "outputs": [], + "source": [ + "a= 2\n", + "b= 4\n", + "c= 8\n", + "run_steps()" + ] + }, + { + "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/code/chap02mine.ipynb b/code/chap02mine.ipynb new file mode 100644 index 00000000..e1664deb --- /dev/null +++ b/code/chap02mine.ipynb @@ -0,0 +1,9420 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# Modeling and Simulation in Python\n", + "\n", + "Chapter 2: Simulation\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": [ + "We'll start with the same code we saw last time: the magic command that tells Jupyter where to put the figures, and the import statement that gets the functions defined in the `modsim` module." + ] + }, + { + "cell_type": "code", + "execution_count": 9, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [ + "# If you want the figures to appear in the notebook, \n", + "# and you want to interact with them, use\n", + "# %matplotlib notebook\n", + "\n", + "# If you want the figures to appear in the notebook, \n", + "# and you don't want to interact with them, use\n", + "# %matplotlib inline\n", + "\n", + "# If you want the figures to appear in separate windows, use\n", + "# %matplotlib qt5\n", + "\n", + "%matplotlib notebook\n", + "\n", + "from modsim import *" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## More than one System 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 `system` to the functions so they work with whatever `System` object we give them, instead of always using `bikeshare`. That will be useful soon when we have more than one `System` object." + ] + }, + { + "cell_type": "code", + "execution_count": 10, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [ + "def run_steps(system, num_steps=1, p1=0.5, p2=0.5):\n", + " \"\"\"Simulate the given number of time steps.\n", + " \n", + " system: bikeshare System object\n", + " num_steps: number of time steps\n", + " p1: probability of an Olin->Wellesley customer arrival\n", + " p2: probability of a Wellesley->Olin customer arrival\n", + " \"\"\"\n", + " for i in range(num_steps):\n", + " step(system, p1, p2)\n", + " plot_system(system)\n", + " \n", + "def step(system, p1=0.5, p2=0.5):\n", + " \"\"\"Simulate one minute of time.\n", + " \n", + " system: bikeshare System 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(system)\n", + " \n", + " if flip(p2):\n", + " bike_to_olin(system)\n", + " \n", + "def bike_to_wellesley(system):\n", + " \"\"\"Move one bike from Olin to Wellesley.\n", + " \n", + " system: bikeshare System object\n", + " \"\"\"\n", + " move_bike(system, 1)\n", + " \n", + "def bike_to_olin(system):\n", + " \"\"\"Move one bike from Wellesley to Olin.\n", + " \n", + " system: bikeshare System object\n", + " \"\"\"\n", + " move_bike(system, -1)\n", + " \n", + "def move_bike(system, n):\n", + " \"\"\"Move a bike.\n", + " \n", + " system: bikeshare System object\n", + " n: +1 to move from Olin to Wellesley or\n", + " -1 to move from Wellesley to Olin\n", + " \"\"\"\n", + " system.olin -= n\n", + " system.wellesley += n\n", + " \n", + "def plot_system(system):\n", + " \"\"\"Plot the current system of the bikeshare system.\n", + " \n", + " system: bikeshare System object\n", + " \"\"\"\n", + " plot(system.olin, 'rs-', label='Olin')\n", + " plot(system.wellesley, 'bo-', label='Wellesley')\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": [ + "Now we can create more than one `System` object:" + ] + }, + { + "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", + "
value
olin10
wellesley2
\n", + "
" + ], + "text/plain": [ + "olin 10\n", + "wellesley 2\n", + "dtype: int64" + ] + }, + "execution_count": 11, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "bikeshare1 = System(olin=10, wellesley=2)\n", + "bikeshare1" + ] + }, + { + "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", + "
value
olin10
wellesley2
\n", + "
" + ], + "text/plain": [ + "olin 10\n", + "wellesley 2\n", + "dtype: int64" + ] + }, + "execution_count": 12, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "bikeshare2 = System(olin=10, wellesley=2)\n", + "bikeshare2" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "And whenever we call a function, we indicate which `System` object to work with:" + ] + }, + { + "cell_type": "code", + "execution_count": 13, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [ + "bike_to_olin(bikeshare1)" + ] + }, + { + "cell_type": "code", + "execution_count": 14, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [ + "bike_to_wellesley(bikeshare2)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "And you can confirm that the different systems are getting updated independently:" + ] + }, + { + "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", + "
value
olin11
wellesley1
\n", + "
" + ], + "text/plain": [ + "olin 11\n", + "wellesley 1\n", + "dtype: int64" + ] + }, + "execution_count": 15, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "bikeshare1" + ] + }, + { + "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", + "
value
olin9
wellesley3
\n", + "
" + ], + "text/plain": [ + "olin 9\n", + "wellesley 3\n", + "dtype: int64" + ] + }, + "execution_count": 16, + "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 quite often." + ] + }, + { + "cell_type": "code", + "execution_count": 17, + "metadata": {}, + "outputs": [ + { + "data": { + "application/javascript": [ + "/* Put everything inside the global mpl namespace */\n", + "window.mpl = {};\n", + "\n", + "\n", + "mpl.get_websocket_type = function() {\n", + " if (typeof(WebSocket) !== 'undefined') {\n", + " return WebSocket;\n", + " } else if (typeof(MozWebSocket) !== 'undefined') {\n", + " return MozWebSocket;\n", + " } else {\n", + " alert('Your browser does not have WebSocket support.' +\n", + " 'Please try Chrome, Safari or Firefox ≥ 6. ' +\n", + " 'Firefox 4 and 5 are also supported but you ' +\n", + " 'have to enable WebSockets in about:config.');\n", + " };\n", + "}\n", + "\n", + "mpl.figure = function(figure_id, websocket, ondownload, parent_element) {\n", + " this.id = figure_id;\n", + "\n", + " this.ws = websocket;\n", + "\n", + " this.supports_binary = (this.ws.binaryType != undefined);\n", + "\n", + " if (!this.supports_binary) {\n", + " var warnings = document.getElementById(\"mpl-warnings\");\n", + " if (warnings) {\n", + " warnings.style.display = 'block';\n", + " warnings.textContent = (\n", + " \"This browser does not support binary websocket messages. \" +\n", + " \"Performance may be slow.\");\n", + " }\n", + " }\n", + "\n", + " this.imageObj = new Image();\n", + "\n", + " this.context = undefined;\n", + " this.message = undefined;\n", + " this.canvas = undefined;\n", + " this.rubberband_canvas = undefined;\n", + " this.rubberband_context = undefined;\n", + " this.format_dropdown = undefined;\n", + "\n", + " this.image_mode = 'full';\n", + "\n", + " this.root = $('
');\n", + " this._root_extra_style(this.root)\n", + " this.root.attr('style', 'display: inline-block');\n", + "\n", + " $(parent_element).append(this.root);\n", + "\n", + " this._init_header(this);\n", + " this._init_canvas(this);\n", + " this._init_toolbar(this);\n", + "\n", + " var fig = this;\n", + "\n", + " this.waiting = false;\n", + "\n", + " this.ws.onopen = function () {\n", + " fig.send_message(\"supports_binary\", {value: fig.supports_binary});\n", + " fig.send_message(\"send_image_mode\", {});\n", + " if (mpl.ratio != 1) {\n", + " fig.send_message(\"set_dpi_ratio\", {'dpi_ratio': mpl.ratio});\n", + " }\n", + " fig.send_message(\"refresh\", {});\n", + " }\n", + "\n", + " this.imageObj.onload = function() {\n", + " if (fig.image_mode == 'full') {\n", + " // Full images could contain transparency (where diff images\n", + " // almost always do), so we need to clear the canvas so that\n", + " // there is no ghosting.\n", + " fig.context.clearRect(0, 0, fig.canvas.width, fig.canvas.height);\n", + " }\n", + " fig.context.drawImage(fig.imageObj, 0, 0);\n", + " };\n", + "\n", + " this.imageObj.onunload = function() {\n", + " this.ws.close();\n", + " }\n", + "\n", + " this.ws.onmessage = this._make_on_message_function(this);\n", + "\n", + " this.ondownload = ondownload;\n", + "}\n", + "\n", + "mpl.figure.prototype._init_header = function() {\n", + " var titlebar = $(\n", + " '
');\n", + " var titletext = $(\n", + " '
');\n", + " titlebar.append(titletext)\n", + " this.root.append(titlebar);\n", + " this.header = titletext[0];\n", + "}\n", + "\n", + "\n", + "\n", + "mpl.figure.prototype._canvas_extra_style = function(canvas_div) {\n", + "\n", + "}\n", + "\n", + "\n", + "mpl.figure.prototype._root_extra_style = function(canvas_div) {\n", + "\n", + "}\n", + "\n", + "mpl.figure.prototype._init_canvas = function() {\n", + " var fig = this;\n", + "\n", + " var canvas_div = $('
');\n", + "\n", + " canvas_div.attr('style', 'position: relative; clear: both; outline: 0');\n", + "\n", + " function canvas_keyboard_event(event) {\n", + " return fig.key_event(event, event['data']);\n", + " }\n", + "\n", + " canvas_div.keydown('key_press', canvas_keyboard_event);\n", + " canvas_div.keyup('key_release', canvas_keyboard_event);\n", + " this.canvas_div = canvas_div\n", + " this._canvas_extra_style(canvas_div)\n", + " this.root.append(canvas_div);\n", + "\n", + " var canvas = $('');\n", + " canvas.addClass('mpl-canvas');\n", + " canvas.attr('style', \"left: 0; top: 0; z-index: 0; outline: 0\")\n", + "\n", + " this.canvas = canvas[0];\n", + " this.context = canvas[0].getContext(\"2d\");\n", + "\n", + " var backingStore = this.context.backingStorePixelRatio ||\n", + "\tthis.context.webkitBackingStorePixelRatio ||\n", + "\tthis.context.mozBackingStorePixelRatio ||\n", + "\tthis.context.msBackingStorePixelRatio ||\n", + "\tthis.context.oBackingStorePixelRatio ||\n", + "\tthis.context.backingStorePixelRatio || 1;\n", + "\n", + " mpl.ratio = (window.devicePixelRatio || 1) / backingStore;\n", + "\n", + " var rubberband = $('');\n", + " rubberband.attr('style', \"position: absolute; left: 0; top: 0; z-index: 1;\")\n", + "\n", + " var pass_mouse_events = true;\n", + "\n", + " canvas_div.resizable({\n", + " start: function(event, ui) {\n", + " pass_mouse_events = false;\n", + " },\n", + " resize: function(event, ui) {\n", + " fig.request_resize(ui.size.width, ui.size.height);\n", + " },\n", + " stop: function(event, ui) {\n", + " pass_mouse_events = true;\n", + " fig.request_resize(ui.size.width, ui.size.height);\n", + " },\n", + " });\n", + "\n", + " function mouse_event_fn(event) {\n", + " if (pass_mouse_events)\n", + " return fig.mouse_event(event, event['data']);\n", + " }\n", + "\n", + " rubberband.mousedown('button_press', mouse_event_fn);\n", + " rubberband.mouseup('button_release', mouse_event_fn);\n", + " // Throttle sequential mouse events to 1 every 20ms.\n", + " rubberband.mousemove('motion_notify', mouse_event_fn);\n", + "\n", + " rubberband.mouseenter('figure_enter', mouse_event_fn);\n", + " rubberband.mouseleave('figure_leave', mouse_event_fn);\n", + "\n", + " canvas_div.on(\"wheel\", function (event) {\n", + " event = event.originalEvent;\n", + " event['data'] = 'scroll'\n", + " if (event.deltaY < 0) {\n", + " event.step = 1;\n", + " } else {\n", + " event.step = -1;\n", + " }\n", + " mouse_event_fn(event);\n", + " });\n", + "\n", + " canvas_div.append(canvas);\n", + " canvas_div.append(rubberband);\n", + "\n", + " this.rubberband = rubberband;\n", + " this.rubberband_canvas = rubberband[0];\n", + " this.rubberband_context = rubberband[0].getContext(\"2d\");\n", + " this.rubberband_context.strokeStyle = \"#000000\";\n", + "\n", + " this._resize_canvas = function(width, height) {\n", + " // Keep the size of the canvas, canvas container, and rubber band\n", + " // canvas in synch.\n", + " canvas_div.css('width', width)\n", + " canvas_div.css('height', height)\n", + "\n", + " canvas.attr('width', width * mpl.ratio);\n", + " canvas.attr('height', height * mpl.ratio);\n", + " canvas.attr('style', 'width: ' + width + 'px; height: ' + height + 'px;');\n", + "\n", + " rubberband.attr('width', width);\n", + " rubberband.attr('height', height);\n", + " }\n", + "\n", + " // Set the figure to an initial 600x600px, this will subsequently be updated\n", + " // upon first draw.\n", + " this._resize_canvas(600, 600);\n", + "\n", + " // Disable right mouse context menu.\n", + " $(this.rubberband_canvas).bind(\"contextmenu\",function(e){\n", + " return false;\n", + " });\n", + "\n", + " function set_focus () {\n", + " canvas.focus();\n", + " canvas_div.focus();\n", + " }\n", + "\n", + " window.setTimeout(set_focus, 100);\n", + "}\n", + "\n", + "mpl.figure.prototype._init_toolbar = function() {\n", + " var fig = this;\n", + "\n", + " var nav_element = $('
')\n", + " nav_element.attr('style', 'width: 100%');\n", + " this.root.append(nav_element);\n", + "\n", + " // Define a callback function for later on.\n", + " function toolbar_event(event) {\n", + " return fig.toolbar_button_onclick(event['data']);\n", + " }\n", + " function toolbar_mouse_event(event) {\n", + " return fig.toolbar_button_onmouseover(event['data']);\n", + " }\n", + "\n", + " for(var toolbar_ind in mpl.toolbar_items) {\n", + " var name = mpl.toolbar_items[toolbar_ind][0];\n", + " var tooltip = mpl.toolbar_items[toolbar_ind][1];\n", + " var image = mpl.toolbar_items[toolbar_ind][2];\n", + " var method_name = mpl.toolbar_items[toolbar_ind][3];\n", + "\n", + " if (!name) {\n", + " // put a spacer in here.\n", + " continue;\n", + " }\n", + " var button = $('');\n", + " button.click(method_name, toolbar_event);\n", + " button.mouseover(tooltip, toolbar_mouse_event);\n", + " nav_element.append(button);\n", + " }\n", + "\n", + " // Add the status bar.\n", + " var status_bar = $('');\n", + " nav_element.append(status_bar);\n", + " this.message = status_bar[0];\n", + "\n", + " // Add the close button to the window.\n", + " var buttongrp = $('
');\n", + " var button = $('');\n", + " button.click(function (evt) { fig.handle_close(fig, {}); } );\n", + " button.mouseover('Stop Interaction', toolbar_mouse_event);\n", + " buttongrp.append(button);\n", + " var titlebar = this.root.find($('.ui-dialog-titlebar'));\n", + " titlebar.prepend(buttongrp);\n", + "}\n", + "\n", + "mpl.figure.prototype._root_extra_style = function(el){\n", + " var fig = this\n", + " el.on(\"remove\", function(){\n", + "\tfig.close_ws(fig, {});\n", + " });\n", + "}\n", + "\n", + "mpl.figure.prototype._canvas_extra_style = function(el){\n", + " // this is important to make the div 'focusable\n", + " el.attr('tabindex', 0)\n", + " // reach out to IPython and tell the keyboard manager to turn it's self\n", + " // off when our div gets focus\n", + "\n", + " // location in version 3\n", + " if (IPython.notebook.keyboard_manager) {\n", + " IPython.notebook.keyboard_manager.register_events(el);\n", + " }\n", + " else {\n", + " // location in version 2\n", + " IPython.keyboard_manager.register_events(el);\n", + " }\n", + "\n", + "}\n", + "\n", + "mpl.figure.prototype._key_event_extra = function(event, name) {\n", + " var manager = IPython.notebook.keyboard_manager;\n", + " if (!manager)\n", + " manager = IPython.keyboard_manager;\n", + "\n", + " // Check for shift+enter\n", + " if (event.shiftKey && event.which == 13) {\n", + " this.canvas_div.blur();\n", + " // select the cell after this one\n", + " var index = IPython.notebook.find_cell_index(this.cell_info[0]);\n", + " IPython.notebook.select(index + 1);\n", + " }\n", + "}\n", + "\n", + "mpl.figure.prototype.handle_save = function(fig, msg) {\n", + " fig.ondownload(fig, null);\n", + "}\n", + "\n", + "\n", + "mpl.find_output_cell = function(html_output) {\n", + " // Return the cell and output element which can be found *uniquely* in the notebook.\n", + " // Note - this is a bit hacky, but it is done because the \"notebook_saving.Notebook\"\n", + " // IPython event is triggered only after the cells have been serialised, which for\n", + " // our purposes (turning an active figure into a static one), is too late.\n", + " var cells = IPython.notebook.get_cells();\n", + " var ncells = cells.length;\n", + " for (var i=0; i= 3 moved mimebundle to data attribute of output\n", + " data = data.data;\n", + " }\n", + " if (data['text/html'] == html_output) {\n", + " return [cell, data, j];\n", + " }\n", + " }\n", + " }\n", + " }\n", + "}\n", + "\n", + "// Register the function which deals with the matplotlib target/channel.\n", + "// The kernel may be null if the page has been refreshed.\n", + "if (IPython.notebook.kernel != null) {\n", + " IPython.notebook.kernel.comm_manager.register_target('matplotlib', mpl.mpl_figure_comm);\n", + "}\n" + ], + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "text/html": [ + "" + ], + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "IOPub data rate exceeded.\n", + "The notebook server will temporarily stop sending output\n", + "to the client in order to avoid crashing it.\n", + "To change this limit, set the config variable\n", + "`--NotebookApp.iopub_data_rate_limit`.\n" + ] + } + ], + "source": [ + "bikeshare = System(olin=10, wellesley=2)\n", + "newfig()\n", + "plot_system(bikeshare)\n", + "decorate_bikeshare()\n", + "run_steps(bikeshare, 60, 0.4, 0.2)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "The variables `olin` and `wellesley` are created inside `move_bike`, so they are local. When the function ends, they go away.\n", + "\n", + "If you try to access a local variable from outside its function, you get an error:" + ] + }, + { + "cell_type": "code", + "execution_count": 20, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [ + "# If you remove the # from the last line in this cell and run it, you'll get\n", + "# NameError: name 'olin' is not defined\n", + "\n", + "#olin" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "**Exercise:** Add print statements in `move_bike` so it prints a message each time a customer arrives and doesn't find a bike. Run the simulation again to confirm that it works as you expect. Then you might want to remove the print statements before you go on." + ] + }, + { + "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": 21, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [ + "x = 5" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Whereas `==` compared two values and returns `True` if they are equal." + ] + }, + { + "cell_type": "code", + "execution_count": 22, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "True" + ] + }, + "execution_count": 22, + "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": 23, + "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": 24, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "nope\n" + ] + } + ], + "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('yup')\n", + "else:\n", + " print('nope')" + ] + }, + { + "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 `System` object that creates and initializes the system variables that will keep track of the metrics." + ] + }, + { + "cell_type": "code", + "execution_count": 25, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [ + "bikeshare = System(olin=10, wellesley=2, \n", + " olin_empty=0, wellesley_empty=0, clock=0)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Next we need a version of `move_bike` that updates the metrics." + ] + }, + { + "cell_type": "code", + "execution_count": 26, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [ + "def move_bike(system, n):\n", + " olin_temp = system.olin - n\n", + " if olin_temp < 0:\n", + " system.olin_empty += 1\n", + " return\n", + " \n", + " wellesley_temp = system.wellesley + n\n", + " if wellesley_temp < 0:\n", + " system.wellesley_empty += 1\n", + " return\n", + " \n", + " system.olin = olin_temp\n", + " system.wellesley = wellesley_temp" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Now when we run a simulation, it keeps track of unhappy customers." + ] + }, + { + "cell_type": "code", + "execution_count": 27, + "metadata": {}, + "outputs": [ + { + "data": { + "application/javascript": [ + "/* Put everything inside the global mpl namespace */\n", + "window.mpl = {};\n", + "\n", + "\n", + "mpl.get_websocket_type = function() {\n", + " if (typeof(WebSocket) !== 'undefined') {\n", + " return WebSocket;\n", + " } else if (typeof(MozWebSocket) !== 'undefined') {\n", + " return MozWebSocket;\n", + " } else {\n", + " alert('Your browser does not have WebSocket support.' +\n", + " 'Please try Chrome, Safari or Firefox ≥ 6. ' +\n", + " 'Firefox 4 and 5 are also supported but you ' +\n", + " 'have to enable WebSockets in about:config.');\n", + " };\n", + "}\n", + "\n", + "mpl.figure = function(figure_id, websocket, ondownload, parent_element) {\n", + " this.id = figure_id;\n", + "\n", + " this.ws = websocket;\n", + "\n", + " this.supports_binary = (this.ws.binaryType != undefined);\n", + "\n", + " if (!this.supports_binary) {\n", + " var warnings = document.getElementById(\"mpl-warnings\");\n", + " if (warnings) {\n", + " warnings.style.display = 'block';\n", + " warnings.textContent = (\n", + " \"This browser does not support binary websocket messages. \" +\n", + " \"Performance may be slow.\");\n", + " }\n", + " }\n", + "\n", + " this.imageObj = new Image();\n", + "\n", + " this.context = undefined;\n", + " this.message = undefined;\n", + " this.canvas = undefined;\n", + " this.rubberband_canvas = undefined;\n", + " this.rubberband_context = undefined;\n", + " this.format_dropdown = undefined;\n", + "\n", + " this.image_mode = 'full';\n", + "\n", + " this.root = $('
');\n", + " this._root_extra_style(this.root)\n", + " this.root.attr('style', 'display: inline-block');\n", + "\n", + " $(parent_element).append(this.root);\n", + "\n", + " this._init_header(this);\n", + " this._init_canvas(this);\n", + " this._init_toolbar(this);\n", + "\n", + " var fig = this;\n", + "\n", + " this.waiting = false;\n", + "\n", + " this.ws.onopen = function () {\n", + " fig.send_message(\"supports_binary\", {value: fig.supports_binary});\n", + " fig.send_message(\"send_image_mode\", {});\n", + " if (mpl.ratio != 1) {\n", + " fig.send_message(\"set_dpi_ratio\", {'dpi_ratio': mpl.ratio});\n", + " }\n", + " fig.send_message(\"refresh\", {});\n", + " }\n", + "\n", + " this.imageObj.onload = function() {\n", + " if (fig.image_mode == 'full') {\n", + " // Full images could contain transparency (where diff images\n", + " // almost always do), so we need to clear the canvas so that\n", + " // there is no ghosting.\n", + " fig.context.clearRect(0, 0, fig.canvas.width, fig.canvas.height);\n", + " }\n", + " fig.context.drawImage(fig.imageObj, 0, 0);\n", + " };\n", + "\n", + " this.imageObj.onunload = function() {\n", + " this.ws.close();\n", + " }\n", + "\n", + " this.ws.onmessage = this._make_on_message_function(this);\n", + "\n", + " this.ondownload = ondownload;\n", + "}\n", + "\n", + "mpl.figure.prototype._init_header = function() {\n", + " var titlebar = $(\n", + " '
');\n", + " var titletext = $(\n", + " '
');\n", + " titlebar.append(titletext)\n", + " this.root.append(titlebar);\n", + " this.header = titletext[0];\n", + "}\n", + "\n", + "\n", + "\n", + "mpl.figure.prototype._canvas_extra_style = function(canvas_div) {\n", + "\n", + "}\n", + "\n", + "\n", + "mpl.figure.prototype._root_extra_style = function(canvas_div) {\n", + "\n", + "}\n", + "\n", + "mpl.figure.prototype._init_canvas = function() {\n", + " var fig = this;\n", + "\n", + " var canvas_div = $('
');\n", + "\n", + " canvas_div.attr('style', 'position: relative; clear: both; outline: 0');\n", + "\n", + " function canvas_keyboard_event(event) {\n", + " return fig.key_event(event, event['data']);\n", + " }\n", + "\n", + " canvas_div.keydown('key_press', canvas_keyboard_event);\n", + " canvas_div.keyup('key_release', canvas_keyboard_event);\n", + " this.canvas_div = canvas_div\n", + " this._canvas_extra_style(canvas_div)\n", + " this.root.append(canvas_div);\n", + "\n", + " var canvas = $('');\n", + " canvas.addClass('mpl-canvas');\n", + " canvas.attr('style', \"left: 0; top: 0; z-index: 0; outline: 0\")\n", + "\n", + " this.canvas = canvas[0];\n", + " this.context = canvas[0].getContext(\"2d\");\n", + "\n", + " var backingStore = this.context.backingStorePixelRatio ||\n", + "\tthis.context.webkitBackingStorePixelRatio ||\n", + "\tthis.context.mozBackingStorePixelRatio ||\n", + "\tthis.context.msBackingStorePixelRatio ||\n", + "\tthis.context.oBackingStorePixelRatio ||\n", + "\tthis.context.backingStorePixelRatio || 1;\n", + "\n", + " mpl.ratio = (window.devicePixelRatio || 1) / backingStore;\n", + "\n", + " var rubberband = $('');\n", + " rubberband.attr('style', \"position: absolute; left: 0; top: 0; z-index: 1;\")\n", + "\n", + " var pass_mouse_events = true;\n", + "\n", + " canvas_div.resizable({\n", + " start: function(event, ui) {\n", + " pass_mouse_events = false;\n", + " },\n", + " resize: function(event, ui) {\n", + " fig.request_resize(ui.size.width, ui.size.height);\n", + " },\n", + " stop: function(event, ui) {\n", + " pass_mouse_events = true;\n", + " fig.request_resize(ui.size.width, ui.size.height);\n", + " },\n", + " });\n", + "\n", + " function mouse_event_fn(event) {\n", + " if (pass_mouse_events)\n", + " return fig.mouse_event(event, event['data']);\n", + " }\n", + "\n", + " rubberband.mousedown('button_press', mouse_event_fn);\n", + " rubberband.mouseup('button_release', mouse_event_fn);\n", + " // Throttle sequential mouse events to 1 every 20ms.\n", + " rubberband.mousemove('motion_notify', mouse_event_fn);\n", + "\n", + " rubberband.mouseenter('figure_enter', mouse_event_fn);\n", + " rubberband.mouseleave('figure_leave', mouse_event_fn);\n", + "\n", + " canvas_div.on(\"wheel\", function (event) {\n", + " event = event.originalEvent;\n", + " event['data'] = 'scroll'\n", + " if (event.deltaY < 0) {\n", + " event.step = 1;\n", + " } else {\n", + " event.step = -1;\n", + " }\n", + " mouse_event_fn(event);\n", + " });\n", + "\n", + " canvas_div.append(canvas);\n", + " canvas_div.append(rubberband);\n", + "\n", + " this.rubberband = rubberband;\n", + " this.rubberband_canvas = rubberband[0];\n", + " this.rubberband_context = rubberband[0].getContext(\"2d\");\n", + " this.rubberband_context.strokeStyle = \"#000000\";\n", + "\n", + " this._resize_canvas = function(width, height) {\n", + " // Keep the size of the canvas, canvas container, and rubber band\n", + " // canvas in synch.\n", + " canvas_div.css('width', width)\n", + " canvas_div.css('height', height)\n", + "\n", + " canvas.attr('width', width * mpl.ratio);\n", + " canvas.attr('height', height * mpl.ratio);\n", + " canvas.attr('style', 'width: ' + width + 'px; height: ' + height + 'px;');\n", + "\n", + " rubberband.attr('width', width);\n", + " rubberband.attr('height', height);\n", + " }\n", + "\n", + " // Set the figure to an initial 600x600px, this will subsequently be updated\n", + " // upon first draw.\n", + " this._resize_canvas(600, 600);\n", + "\n", + " // Disable right mouse context menu.\n", + " $(this.rubberband_canvas).bind(\"contextmenu\",function(e){\n", + " return false;\n", + " });\n", + "\n", + " function set_focus () {\n", + " canvas.focus();\n", + " canvas_div.focus();\n", + " }\n", + "\n", + " window.setTimeout(set_focus, 100);\n", + "}\n", + "\n", + "mpl.figure.prototype._init_toolbar = function() {\n", + " var fig = this;\n", + "\n", + " var nav_element = $('
')\n", + " nav_element.attr('style', 'width: 100%');\n", + " this.root.append(nav_element);\n", + "\n", + " // Define a callback function for later on.\n", + " function toolbar_event(event) {\n", + " return fig.toolbar_button_onclick(event['data']);\n", + " }\n", + " function toolbar_mouse_event(event) {\n", + " return fig.toolbar_button_onmouseover(event['data']);\n", + " }\n", + "\n", + " for(var toolbar_ind in mpl.toolbar_items) {\n", + " var name = mpl.toolbar_items[toolbar_ind][0];\n", + " var tooltip = mpl.toolbar_items[toolbar_ind][1];\n", + " var image = mpl.toolbar_items[toolbar_ind][2];\n", + " var method_name = mpl.toolbar_items[toolbar_ind][3];\n", + "\n", + " if (!name) {\n", + " // put a spacer in here.\n", + " continue;\n", + " }\n", + " var button = $('');\n", + " button.click(method_name, toolbar_event);\n", + " button.mouseover(tooltip, toolbar_mouse_event);\n", + " nav_element.append(button);\n", + " }\n", + "\n", + " // Add the status bar.\n", + " var status_bar = $('');\n", + " nav_element.append(status_bar);\n", + " this.message = status_bar[0];\n", + "\n", + " // Add the close button to the window.\n", + " var buttongrp = $('
');\n", + " var button = $('');\n", + " button.click(function (evt) { fig.handle_close(fig, {}); } );\n", + " button.mouseover('Stop Interaction', toolbar_mouse_event);\n", + " buttongrp.append(button);\n", + " var titlebar = this.root.find($('.ui-dialog-titlebar'));\n", + " titlebar.prepend(buttongrp);\n", + "}\n", + "\n", + "mpl.figure.prototype._root_extra_style = function(el){\n", + " var fig = this\n", + " el.on(\"remove\", function(){\n", + "\tfig.close_ws(fig, {});\n", + " });\n", + "}\n", + "\n", + "mpl.figure.prototype._canvas_extra_style = function(el){\n", + " // this is important to make the div 'focusable\n", + " el.attr('tabindex', 0)\n", + " // reach out to IPython and tell the keyboard manager to turn it's self\n", + " // off when our div gets focus\n", + "\n", + " // location in version 3\n", + " if (IPython.notebook.keyboard_manager) {\n", + " IPython.notebook.keyboard_manager.register_events(el);\n", + " }\n", + " else {\n", + " // location in version 2\n", + " IPython.keyboard_manager.register_events(el);\n", + " }\n", + "\n", + "}\n", + "\n", + "mpl.figure.prototype._key_event_extra = function(event, name) {\n", + " var manager = IPython.notebook.keyboard_manager;\n", + " if (!manager)\n", + " manager = IPython.keyboard_manager;\n", + "\n", + " // Check for shift+enter\n", + " if (event.shiftKey && event.which == 13) {\n", + " this.canvas_div.blur();\n", + " // select the cell after this one\n", + " var index = IPython.notebook.find_cell_index(this.cell_info[0]);\n", + " IPython.notebook.select(index + 1);\n", + " }\n", + "}\n", + "\n", + "mpl.figure.prototype.handle_save = function(fig, msg) {\n", + " fig.ondownload(fig, null);\n", + "}\n", + "\n", + "\n", + "mpl.find_output_cell = function(html_output) {\n", + " // Return the cell and output element which can be found *uniquely* in the notebook.\n", + " // Note - this is a bit hacky, but it is done because the \"notebook_saving.Notebook\"\n", + " // IPython event is triggered only after the cells have been serialised, which for\n", + " // our purposes (turning an active figure into a static one), is too late.\n", + " var cells = IPython.notebook.get_cells();\n", + " var ncells = cells.length;\n", + " for (var i=0; i= 3 moved mimebundle to data attribute of output\n", + " data = data.data;\n", + " }\n", + " if (data['text/html'] == html_output) {\n", + " return [cell, data, j];\n", + " }\n", + " }\n", + " }\n", + " }\n", + "}\n", + "\n", + "// Register the function which deals with the matplotlib target/channel.\n", + "// The kernel may be null if the page has been refreshed.\n", + "if (IPython.notebook.kernel != null) {\n", + " IPython.notebook.kernel.comm_manager.register_target('matplotlib', mpl.mpl_figure_comm);\n", + "}\n" + ], + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "text/html": [ + "" + ], + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "newfig()\n", + "plot_system(bikeshare)\n", + "decorate_bikeshare()\n", + "run_steps(bikeshare, 60, 0.4, 0.2)" + ] + }, + { + "cell_type": "code", + "execution_count": 33, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "60" + ] + }, + "execution_count": 33, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "# Solution goes here\n", + "bikeshare.clock\n", + "\n", + "#### WHY IS IT BIKESHARE.CLOCK AGAIN AND NOT SYSTEM.CLOCK?????" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "After the simulation, check the final value of `clock`." + ] + }, + { + "cell_type": "code", + "execution_count": 34, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "60\n" + ] + } + ], + "source": [ + "print(bikeshare.clock)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "**Exercise:** Now suppose we'd like to know how long it takes to run out of bikes at either location. Modify `move_bike` so the first time a student arrives at Olin and doesn't find a bike, it records the value of `clock` in a system variable.\n", + "\n", + "Hint: create a system variable named `t_first_empty` and initialize it to `-1` to indicate that it has not been set yet.\n", + "\n", + "Test your code by running a simulation for 60 minutes and checking the metrics." + ] + }, + { + "cell_type": "code", + "execution_count": 35, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [ + "# Solution goes here\n", + "bikeshare = System(olin=10, wellesley=2, \n", + " olin_empty=0, wellesley_empty=0, clock=0, t_first_empty=-1)" + ] + }, + { + "cell_type": "code", + "execution_count": 36, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [ + "# Solution goes here\n", + "def move_bike(system, n):\n", + " olin_temp = system.olin - n\n", + " if olin_temp < 0:\n", + " system.olin_empty += 1\n", + " system.t_first_empty += 1\n", + " if system.t_first_empty == 0:\n", + " print('time first empty:', bikeshare.clock)\n", + " return\n", + " \n", + " wellesley_temp = system.wellesley + n\n", + " if wellesley_temp < 0:\n", + " system.wellesley_empty += 1\n", + " system.t_first_empty += 1\n", + " if system.t_first_empty == 0:\n", + " print('time first empty:', bikeshare.clock)\n", + " return\n", + " \n", + " \n", + " system.olin = olin_temp\n", + " system.wellesley = wellesley_temp\n", + " " + ] + }, + { + "cell_type": "code", + "execution_count": 37, + "metadata": {}, + "outputs": [ + { + "data": { + "application/javascript": [ + "/* Put everything inside the global mpl namespace */\n", + "window.mpl = {};\n", + "\n", + "\n", + "mpl.get_websocket_type = function() {\n", + " if (typeof(WebSocket) !== 'undefined') {\n", + " return WebSocket;\n", + " } else if (typeof(MozWebSocket) !== 'undefined') {\n", + " return MozWebSocket;\n", + " } else {\n", + " alert('Your browser does not have WebSocket support.' +\n", + " 'Please try Chrome, Safari or Firefox ≥ 6. ' +\n", + " 'Firefox 4 and 5 are also supported but you ' +\n", + " 'have to enable WebSockets in about:config.');\n", + " };\n", + "}\n", + "\n", + "mpl.figure = function(figure_id, websocket, ondownload, parent_element) {\n", + " this.id = figure_id;\n", + "\n", + " this.ws = websocket;\n", + "\n", + " this.supports_binary = (this.ws.binaryType != undefined);\n", + "\n", + " if (!this.supports_binary) {\n", + " var warnings = document.getElementById(\"mpl-warnings\");\n", + " if (warnings) {\n", + " warnings.style.display = 'block';\n", + " warnings.textContent = (\n", + " \"This browser does not support binary websocket messages. \" +\n", + " \"Performance may be slow.\");\n", + " }\n", + " }\n", + "\n", + " this.imageObj = new Image();\n", + "\n", + " this.context = undefined;\n", + " this.message = undefined;\n", + " this.canvas = undefined;\n", + " this.rubberband_canvas = undefined;\n", + " this.rubberband_context = undefined;\n", + " this.format_dropdown = undefined;\n", + "\n", + " this.image_mode = 'full';\n", + "\n", + " this.root = $('
');\n", + " this._root_extra_style(this.root)\n", + " this.root.attr('style', 'display: inline-block');\n", + "\n", + " $(parent_element).append(this.root);\n", + "\n", + " this._init_header(this);\n", + " this._init_canvas(this);\n", + " this._init_toolbar(this);\n", + "\n", + " var fig = this;\n", + "\n", + " this.waiting = false;\n", + "\n", + " this.ws.onopen = function () {\n", + " fig.send_message(\"supports_binary\", {value: fig.supports_binary});\n", + " fig.send_message(\"send_image_mode\", {});\n", + " if (mpl.ratio != 1) {\n", + " fig.send_message(\"set_dpi_ratio\", {'dpi_ratio': mpl.ratio});\n", + " }\n", + " fig.send_message(\"refresh\", {});\n", + " }\n", + "\n", + " this.imageObj.onload = function() {\n", + " if (fig.image_mode == 'full') {\n", + " // Full images could contain transparency (where diff images\n", + " // almost always do), so we need to clear the canvas so that\n", + " // there is no ghosting.\n", + " fig.context.clearRect(0, 0, fig.canvas.width, fig.canvas.height);\n", + " }\n", + " fig.context.drawImage(fig.imageObj, 0, 0);\n", + " };\n", + "\n", + " this.imageObj.onunload = function() {\n", + " this.ws.close();\n", + " }\n", + "\n", + " this.ws.onmessage = this._make_on_message_function(this);\n", + "\n", + " this.ondownload = ondownload;\n", + "}\n", + "\n", + "mpl.figure.prototype._init_header = function() {\n", + " var titlebar = $(\n", + " '
');\n", + " var titletext = $(\n", + " '
');\n", + " titlebar.append(titletext)\n", + " this.root.append(titlebar);\n", + " this.header = titletext[0];\n", + "}\n", + "\n", + "\n", + "\n", + "mpl.figure.prototype._canvas_extra_style = function(canvas_div) {\n", + "\n", + "}\n", + "\n", + "\n", + "mpl.figure.prototype._root_extra_style = function(canvas_div) {\n", + "\n", + "}\n", + "\n", + "mpl.figure.prototype._init_canvas = function() {\n", + " var fig = this;\n", + "\n", + " var canvas_div = $('
');\n", + "\n", + " canvas_div.attr('style', 'position: relative; clear: both; outline: 0');\n", + "\n", + " function canvas_keyboard_event(event) {\n", + " return fig.key_event(event, event['data']);\n", + " }\n", + "\n", + " canvas_div.keydown('key_press', canvas_keyboard_event);\n", + " canvas_div.keyup('key_release', canvas_keyboard_event);\n", + " this.canvas_div = canvas_div\n", + " this._canvas_extra_style(canvas_div)\n", + " this.root.append(canvas_div);\n", + "\n", + " var canvas = $('');\n", + " canvas.addClass('mpl-canvas');\n", + " canvas.attr('style', \"left: 0; top: 0; z-index: 0; outline: 0\")\n", + "\n", + " this.canvas = canvas[0];\n", + " this.context = canvas[0].getContext(\"2d\");\n", + "\n", + " var backingStore = this.context.backingStorePixelRatio ||\n", + "\tthis.context.webkitBackingStorePixelRatio ||\n", + "\tthis.context.mozBackingStorePixelRatio ||\n", + "\tthis.context.msBackingStorePixelRatio ||\n", + "\tthis.context.oBackingStorePixelRatio ||\n", + "\tthis.context.backingStorePixelRatio || 1;\n", + "\n", + " mpl.ratio = (window.devicePixelRatio || 1) / backingStore;\n", + "\n", + " var rubberband = $('');\n", + " rubberband.attr('style', \"position: absolute; left: 0; top: 0; z-index: 1;\")\n", + "\n", + " var pass_mouse_events = true;\n", + "\n", + " canvas_div.resizable({\n", + " start: function(event, ui) {\n", + " pass_mouse_events = false;\n", + " },\n", + " resize: function(event, ui) {\n", + " fig.request_resize(ui.size.width, ui.size.height);\n", + " },\n", + " stop: function(event, ui) {\n", + " pass_mouse_events = true;\n", + " fig.request_resize(ui.size.width, ui.size.height);\n", + " },\n", + " });\n", + "\n", + " function mouse_event_fn(event) {\n", + " if (pass_mouse_events)\n", + " return fig.mouse_event(event, event['data']);\n", + " }\n", + "\n", + " rubberband.mousedown('button_press', mouse_event_fn);\n", + " rubberband.mouseup('button_release', mouse_event_fn);\n", + " // Throttle sequential mouse events to 1 every 20ms.\n", + " rubberband.mousemove('motion_notify', mouse_event_fn);\n", + "\n", + " rubberband.mouseenter('figure_enter', mouse_event_fn);\n", + " rubberband.mouseleave('figure_leave', mouse_event_fn);\n", + "\n", + " canvas_div.on(\"wheel\", function (event) {\n", + " event = event.originalEvent;\n", + " event['data'] = 'scroll'\n", + " if (event.deltaY < 0) {\n", + " event.step = 1;\n", + " } else {\n", + " event.step = -1;\n", + " }\n", + " mouse_event_fn(event);\n", + " });\n", + "\n", + " canvas_div.append(canvas);\n", + " canvas_div.append(rubberband);\n", + "\n", + " this.rubberband = rubberband;\n", + " this.rubberband_canvas = rubberband[0];\n", + " this.rubberband_context = rubberband[0].getContext(\"2d\");\n", + " this.rubberband_context.strokeStyle = \"#000000\";\n", + "\n", + " this._resize_canvas = function(width, height) {\n", + " // Keep the size of the canvas, canvas container, and rubber band\n", + " // canvas in synch.\n", + " canvas_div.css('width', width)\n", + " canvas_div.css('height', height)\n", + "\n", + " canvas.attr('width', width * mpl.ratio);\n", + " canvas.attr('height', height * mpl.ratio);\n", + " canvas.attr('style', 'width: ' + width + 'px; height: ' + height + 'px;');\n", + "\n", + " rubberband.attr('width', width);\n", + " rubberband.attr('height', height);\n", + " }\n", + "\n", + " // Set the figure to an initial 600x600px, this will subsequently be updated\n", + " // upon first draw.\n", + " this._resize_canvas(600, 600);\n", + "\n", + " // Disable right mouse context menu.\n", + " $(this.rubberband_canvas).bind(\"contextmenu\",function(e){\n", + " return false;\n", + " });\n", + "\n", + " function set_focus () {\n", + " canvas.focus();\n", + " canvas_div.focus();\n", + " }\n", + "\n", + " window.setTimeout(set_focus, 100);\n", + "}\n", + "\n", + "mpl.figure.prototype._init_toolbar = function() {\n", + " var fig = this;\n", + "\n", + " var nav_element = $('
')\n", + " nav_element.attr('style', 'width: 100%');\n", + " this.root.append(nav_element);\n", + "\n", + " // Define a callback function for later on.\n", + " function toolbar_event(event) {\n", + " return fig.toolbar_button_onclick(event['data']);\n", + " }\n", + " function toolbar_mouse_event(event) {\n", + " return fig.toolbar_button_onmouseover(event['data']);\n", + " }\n", + "\n", + " for(var toolbar_ind in mpl.toolbar_items) {\n", + " var name = mpl.toolbar_items[toolbar_ind][0];\n", + " var tooltip = mpl.toolbar_items[toolbar_ind][1];\n", + " var image = mpl.toolbar_items[toolbar_ind][2];\n", + " var method_name = mpl.toolbar_items[toolbar_ind][3];\n", + "\n", + " if (!name) {\n", + " // put a spacer in here.\n", + " continue;\n", + " }\n", + " var button = $('');\n", + " button.click(method_name, toolbar_event);\n", + " button.mouseover(tooltip, toolbar_mouse_event);\n", + " nav_element.append(button);\n", + " }\n", + "\n", + " // Add the status bar.\n", + " var status_bar = $('');\n", + " nav_element.append(status_bar);\n", + " this.message = status_bar[0];\n", + "\n", + " // Add the close button to the window.\n", + " var buttongrp = $('
');\n", + " var button = $('');\n", + " button.click(function (evt) { fig.handle_close(fig, {}); } );\n", + " button.mouseover('Stop Interaction', toolbar_mouse_event);\n", + " buttongrp.append(button);\n", + " var titlebar = this.root.find($('.ui-dialog-titlebar'));\n", + " titlebar.prepend(buttongrp);\n", + "}\n", + "\n", + "mpl.figure.prototype._root_extra_style = function(el){\n", + " var fig = this\n", + " el.on(\"remove\", function(){\n", + "\tfig.close_ws(fig, {});\n", + " });\n", + "}\n", + "\n", + "mpl.figure.prototype._canvas_extra_style = function(el){\n", + " // this is important to make the div 'focusable\n", + " el.attr('tabindex', 0)\n", + " // reach out to IPython and tell the keyboard manager to turn it's self\n", + " // off when our div gets focus\n", + "\n", + " // location in version 3\n", + " if (IPython.notebook.keyboard_manager) {\n", + " IPython.notebook.keyboard_manager.register_events(el);\n", + " }\n", + " else {\n", + " // location in version 2\n", + " IPython.keyboard_manager.register_events(el);\n", + " }\n", + "\n", + "}\n", + "\n", + "mpl.figure.prototype._key_event_extra = function(event, name) {\n", + " var manager = IPython.notebook.keyboard_manager;\n", + " if (!manager)\n", + " manager = IPython.keyboard_manager;\n", + "\n", + " // Check for shift+enter\n", + " if (event.shiftKey && event.which == 13) {\n", + " this.canvas_div.blur();\n", + " // select the cell after this one\n", + " var index = IPython.notebook.find_cell_index(this.cell_info[0]);\n", + " IPython.notebook.select(index + 1);\n", + " }\n", + "}\n", + "\n", + "mpl.figure.prototype.handle_save = function(fig, msg) {\n", + " fig.ondownload(fig, null);\n", + "}\n", + "\n", + "\n", + "mpl.find_output_cell = function(html_output) {\n", + " // Return the cell and output element which can be found *uniquely* in the notebook.\n", + " // Note - this is a bit hacky, but it is done because the \"notebook_saving.Notebook\"\n", + " // IPython event is triggered only after the cells have been serialised, which for\n", + " // our purposes (turning an active figure into a static one), is too late.\n", + " var cells = IPython.notebook.get_cells();\n", + " var ncells = cells.length;\n", + " for (var i=0; i= 3 moved mimebundle to data attribute of output\n", + " data = data.data;\n", + " }\n", + " if (data['text/html'] == html_output) {\n", + " return [cell, data, j];\n", + " }\n", + " }\n", + " }\n", + " }\n", + "}\n", + "\n", + "// Register the function which deals with the matplotlib target/channel.\n", + "// The kernel may be null if the page has been refreshed.\n", + "if (IPython.notebook.kernel != null) {\n", + " IPython.notebook.kernel.comm_manager.register_target('matplotlib', mpl.mpl_figure_comm);\n", + "}\n" + ], + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "text/html": [ + "" + ], + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "newfig()\n", + "for p1 in p1_array:\n", + " system = run_simulation(p1=p1)\n", + " plot(p1, system.olin_empty, 'rs', label='olin')" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "As always, we should decorate the figure. This version of `decorate_bikeshare` takes `xlabel` as a parameter, for reasons you will see soon." + ] + }, + { + "cell_type": "code", + "execution_count": 66, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [ + "def decorate_bikeshare(xlabel):\n", + " decorate(title='Olin-Wellesley Bikeshare',\n", + " xlabel=xlabel, \n", + " ylabel='Number of unhappy customers')" + ] + }, + { + "cell_type": "code", + "execution_count": 67, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [ + "decorate_bikeshare(xlabel='Arrival rate at Olin (p1 in customers/min)')" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "**Exercise:** Wrap this code in a function named `parameter_sweep` that takes an array called `p1_array` as a parameter. It should create a new figure, run a simulation for each value of `p1` in `p1_array`, and plot the results.\n", + "\n", + "Once you have the function working, modify it so it also plots the number of unhappy customers at Wellesley. Looking at the plot, can you estimate a range of values for `p1` that minimizes the total number of unhappy customers?" + ] + }, + { + "cell_type": "code", + "execution_count": 68, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [ + "\n", + "def parameter_sweep(p1_array):\n", + " for p1 in p1_array:\n", + " bikeshare = run_simulation(p1)\n", + " plot(p1, bikeshare.olin_empty, 'rs', label='Olin')\n", + " plot(p1, bikeshare.wellesley_empty, 'bs', label='wellesley')\n", + "\n" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [] + }, + { + "cell_type": "code", + "execution_count": 69, + "metadata": {}, + "outputs": [ + { + "data": { + "application/javascript": [ + "/* Put everything inside the global mpl namespace */\n", + "window.mpl = {};\n", + "\n", + "\n", + "mpl.get_websocket_type = function() {\n", + " if (typeof(WebSocket) !== 'undefined') {\n", + " return WebSocket;\n", + " } else if (typeof(MozWebSocket) !== 'undefined') {\n", + " return MozWebSocket;\n", + " } else {\n", + " alert('Your browser does not have WebSocket support.' +\n", + " 'Please try Chrome, Safari or Firefox ≥ 6. ' +\n", + " 'Firefox 4 and 5 are also supported but you ' +\n", + " 'have to enable WebSockets in about:config.');\n", + " };\n", + "}\n", + "\n", + "mpl.figure = function(figure_id, websocket, ondownload, parent_element) {\n", + " this.id = figure_id;\n", + "\n", + " this.ws = websocket;\n", + "\n", + " this.supports_binary = (this.ws.binaryType != undefined);\n", + "\n", + " if (!this.supports_binary) {\n", + " var warnings = document.getElementById(\"mpl-warnings\");\n", + " if (warnings) {\n", + " warnings.style.display = 'block';\n", + " warnings.textContent = (\n", + " \"This browser does not support binary websocket messages. \" +\n", + " \"Performance may be slow.\");\n", + " }\n", + " }\n", + "\n", + " this.imageObj = new Image();\n", + "\n", + " this.context = undefined;\n", + " this.message = undefined;\n", + " this.canvas = undefined;\n", + " this.rubberband_canvas = undefined;\n", + " this.rubberband_context = undefined;\n", + " this.format_dropdown = undefined;\n", + "\n", + " this.image_mode = 'full';\n", + "\n", + " this.root = $('
');\n", + " this._root_extra_style(this.root)\n", + " this.root.attr('style', 'display: inline-block');\n", + "\n", + " $(parent_element).append(this.root);\n", + "\n", + " this._init_header(this);\n", + " this._init_canvas(this);\n", + " this._init_toolbar(this);\n", + "\n", + " var fig = this;\n", + "\n", + " this.waiting = false;\n", + "\n", + " this.ws.onopen = function () {\n", + " fig.send_message(\"supports_binary\", {value: fig.supports_binary});\n", + " fig.send_message(\"send_image_mode\", {});\n", + " if (mpl.ratio != 1) {\n", + " fig.send_message(\"set_dpi_ratio\", {'dpi_ratio': mpl.ratio});\n", + " }\n", + " fig.send_message(\"refresh\", {});\n", + " }\n", + "\n", + " this.imageObj.onload = function() {\n", + " if (fig.image_mode == 'full') {\n", + " // Full images could contain transparency (where diff images\n", + " // almost always do), so we need to clear the canvas so that\n", + " // there is no ghosting.\n", + " fig.context.clearRect(0, 0, fig.canvas.width, fig.canvas.height);\n", + " }\n", + " fig.context.drawImage(fig.imageObj, 0, 0);\n", + " };\n", + "\n", + " this.imageObj.onunload = function() {\n", + " this.ws.close();\n", + " }\n", + "\n", + " this.ws.onmessage = this._make_on_message_function(this);\n", + "\n", + " this.ondownload = ondownload;\n", + "}\n", + "\n", + "mpl.figure.prototype._init_header = function() {\n", + " var titlebar = $(\n", + " '
');\n", + " var titletext = $(\n", + " '
');\n", + " titlebar.append(titletext)\n", + " this.root.append(titlebar);\n", + " this.header = titletext[0];\n", + "}\n", + "\n", + "\n", + "\n", + "mpl.figure.prototype._canvas_extra_style = function(canvas_div) {\n", + "\n", + "}\n", + "\n", + "\n", + "mpl.figure.prototype._root_extra_style = function(canvas_div) {\n", + "\n", + "}\n", + "\n", + "mpl.figure.prototype._init_canvas = function() {\n", + " var fig = this;\n", + "\n", + " var canvas_div = $('
');\n", + "\n", + " canvas_div.attr('style', 'position: relative; clear: both; outline: 0');\n", + "\n", + " function canvas_keyboard_event(event) {\n", + " return fig.key_event(event, event['data']);\n", + " }\n", + "\n", + " canvas_div.keydown('key_press', canvas_keyboard_event);\n", + " canvas_div.keyup('key_release', canvas_keyboard_event);\n", + " this.canvas_div = canvas_div\n", + " this._canvas_extra_style(canvas_div)\n", + " this.root.append(canvas_div);\n", + "\n", + " var canvas = $('');\n", + " canvas.addClass('mpl-canvas');\n", + " canvas.attr('style', \"left: 0; top: 0; z-index: 0; outline: 0\")\n", + "\n", + " this.canvas = canvas[0];\n", + " this.context = canvas[0].getContext(\"2d\");\n", + "\n", + " var backingStore = this.context.backingStorePixelRatio ||\n", + "\tthis.context.webkitBackingStorePixelRatio ||\n", + "\tthis.context.mozBackingStorePixelRatio ||\n", + "\tthis.context.msBackingStorePixelRatio ||\n", + "\tthis.context.oBackingStorePixelRatio ||\n", + "\tthis.context.backingStorePixelRatio || 1;\n", + "\n", + " mpl.ratio = (window.devicePixelRatio || 1) / backingStore;\n", + "\n", + " var rubberband = $('');\n", + " rubberband.attr('style', \"position: absolute; left: 0; top: 0; z-index: 1;\")\n", + "\n", + " var pass_mouse_events = true;\n", + "\n", + " canvas_div.resizable({\n", + " start: function(event, ui) {\n", + " pass_mouse_events = false;\n", + " },\n", + " resize: function(event, ui) {\n", + " fig.request_resize(ui.size.width, ui.size.height);\n", + " },\n", + " stop: function(event, ui) {\n", + " pass_mouse_events = true;\n", + " fig.request_resize(ui.size.width, ui.size.height);\n", + " },\n", + " });\n", + "\n", + " function mouse_event_fn(event) {\n", + " if (pass_mouse_events)\n", + " return fig.mouse_event(event, event['data']);\n", + " }\n", + "\n", + " rubberband.mousedown('button_press', mouse_event_fn);\n", + " rubberband.mouseup('button_release', mouse_event_fn);\n", + " // Throttle sequential mouse events to 1 every 20ms.\n", + " rubberband.mousemove('motion_notify', mouse_event_fn);\n", + "\n", + " rubberband.mouseenter('figure_enter', mouse_event_fn);\n", + " rubberband.mouseleave('figure_leave', mouse_event_fn);\n", + "\n", + " canvas_div.on(\"wheel\", function (event) {\n", + " event = event.originalEvent;\n", + " event['data'] = 'scroll'\n", + " if (event.deltaY < 0) {\n", + " event.step = 1;\n", + " } else {\n", + " event.step = -1;\n", + " }\n", + " mouse_event_fn(event);\n", + " });\n", + "\n", + " canvas_div.append(canvas);\n", + " canvas_div.append(rubberband);\n", + "\n", + " this.rubberband = rubberband;\n", + " this.rubberband_canvas = rubberband[0];\n", + " this.rubberband_context = rubberband[0].getContext(\"2d\");\n", + " this.rubberband_context.strokeStyle = \"#000000\";\n", + "\n", + " this._resize_canvas = function(width, height) {\n", + " // Keep the size of the canvas, canvas container, and rubber band\n", + " // canvas in synch.\n", + " canvas_div.css('width', width)\n", + " canvas_div.css('height', height)\n", + "\n", + " canvas.attr('width', width * mpl.ratio);\n", + " canvas.attr('height', height * mpl.ratio);\n", + " canvas.attr('style', 'width: ' + width + 'px; height: ' + height + 'px;');\n", + "\n", + " rubberband.attr('width', width);\n", + " rubberband.attr('height', height);\n", + " }\n", + "\n", + " // Set the figure to an initial 600x600px, this will subsequently be updated\n", + " // upon first draw.\n", + " this._resize_canvas(600, 600);\n", + "\n", + " // Disable right mouse context menu.\n", + " $(this.rubberband_canvas).bind(\"contextmenu\",function(e){\n", + " return false;\n", + " });\n", + "\n", + " function set_focus () {\n", + " canvas.focus();\n", + " canvas_div.focus();\n", + " }\n", + "\n", + " window.setTimeout(set_focus, 100);\n", + "}\n", + "\n", + "mpl.figure.prototype._init_toolbar = function() {\n", + " var fig = this;\n", + "\n", + " var nav_element = $('
')\n", + " nav_element.attr('style', 'width: 100%');\n", + " this.root.append(nav_element);\n", + "\n", + " // Define a callback function for later on.\n", + " function toolbar_event(event) {\n", + " return fig.toolbar_button_onclick(event['data']);\n", + " }\n", + " function toolbar_mouse_event(event) {\n", + " return fig.toolbar_button_onmouseover(event['data']);\n", + " }\n", + "\n", + " for(var toolbar_ind in mpl.toolbar_items) {\n", + " var name = mpl.toolbar_items[toolbar_ind][0];\n", + " var tooltip = mpl.toolbar_items[toolbar_ind][1];\n", + " var image = mpl.toolbar_items[toolbar_ind][2];\n", + " var method_name = mpl.toolbar_items[toolbar_ind][3];\n", + "\n", + " if (!name) {\n", + " // put a spacer in here.\n", + " continue;\n", + " }\n", + " var button = $('');\n", + " button.click(method_name, toolbar_event);\n", + " button.mouseover(tooltip, toolbar_mouse_event);\n", + " nav_element.append(button);\n", + " }\n", + "\n", + " // Add the status bar.\n", + " var status_bar = $('');\n", + " nav_element.append(status_bar);\n", + " this.message = status_bar[0];\n", + "\n", + " // Add the close button to the window.\n", + " var buttongrp = $('
');\n", + " var button = $('');\n", + " button.click(function (evt) { fig.handle_close(fig, {}); } );\n", + " button.mouseover('Stop Interaction', toolbar_mouse_event);\n", + " buttongrp.append(button);\n", + " var titlebar = this.root.find($('.ui-dialog-titlebar'));\n", + " titlebar.prepend(buttongrp);\n", + "}\n", + "\n", + "mpl.figure.prototype._root_extra_style = function(el){\n", + " var fig = this\n", + " el.on(\"remove\", function(){\n", + "\tfig.close_ws(fig, {});\n", + " });\n", + "}\n", + "\n", + "mpl.figure.prototype._canvas_extra_style = function(el){\n", + " // this is important to make the div 'focusable\n", + " el.attr('tabindex', 0)\n", + " // reach out to IPython and tell the keyboard manager to turn it's self\n", + " // off when our div gets focus\n", + "\n", + " // location in version 3\n", + " if (IPython.notebook.keyboard_manager) {\n", + " IPython.notebook.keyboard_manager.register_events(el);\n", + " }\n", + " else {\n", + " // location in version 2\n", + " IPython.keyboard_manager.register_events(el);\n", + " }\n", + "\n", + "}\n", + "\n", + "mpl.figure.prototype._key_event_extra = function(event, name) {\n", + " var manager = IPython.notebook.keyboard_manager;\n", + " if (!manager)\n", + " manager = IPython.keyboard_manager;\n", + "\n", + " // Check for shift+enter\n", + " if (event.shiftKey && event.which == 13) {\n", + " this.canvas_div.blur();\n", + " // select the cell after this one\n", + " var index = IPython.notebook.find_cell_index(this.cell_info[0]);\n", + " IPython.notebook.select(index + 1);\n", + " }\n", + "}\n", + "\n", + "mpl.figure.prototype.handle_save = function(fig, msg) {\n", + " fig.ondownload(fig, null);\n", + "}\n", + "\n", + "\n", + "mpl.find_output_cell = function(html_output) {\n", + " // Return the cell and output element which can be found *uniquely* in the notebook.\n", + " // Note - this is a bit hacky, but it is done because the \"notebook_saving.Notebook\"\n", + " // IPython event is triggered only after the cells have been serialised, which for\n", + " // our purposes (turning an active figure into a static one), is too late.\n", + " var cells = IPython.notebook.get_cells();\n", + " var ncells = cells.length;\n", + " for (var i=0; i= 3 moved mimebundle to data attribute of output\n", + " data = data.data;\n", + " }\n", + " if (data['text/html'] == html_output) {\n", + " return [cell, data, j];\n", + " }\n", + " }\n", + " }\n", + " }\n", + "}\n", + "\n", + "// Register the function which deals with the matplotlib target/channel.\n", + "// The kernel may be null if the page has been refreshed.\n", + "if (IPython.notebook.kernel != null) {\n", + " IPython.notebook.kernel.comm_manager.register_target('matplotlib', mpl.mpl_figure_comm);\n", + "}\n" + ], + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "text/html": [ + "" + ], + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "# Solution goes here\n", + "newfig()\n", + "p2_array = linspace(0, 1, 11)\n", + "parameter_sweep2(p2_array)\n", + "decorate_bikeshare(xlabel='Arrival rate at Olin (p1 in customers/min)')" + ] + }, + { + "cell_type": "code", + "execution_count": 72, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [ + "# Solution goes here" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "**Exercise:** Hold `p1=0.4` and `p2=0.2`, and sweep a range of values for `num_steps`.\n", + "\n", + "Hint: You will need a version of `run_simulation` that takes `num_steps` as a parameter.\n", + "\n", + "Hint: Because `num_steps` is supposed to be an integer use `range` rather than `linrange`." + ] + }, + { + "cell_type": "code", + "execution_count": 73, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [ + "# Solution goes here\n", + "def run_simulation(p1=0.4, p2=0.2, olin=10, wellesley=2, olin_empty=0, wellesley_empty=0, num_steps=60):\n", + " bikeshare = System(olin=10, wellesley=2, olin_empty=0, wellesley_empty=0)\n", + " run_steps(bikeshare, 60, p1, p2, plot_flag=False)\n", + " return bikeshare" + ] + }, + { + "cell_type": "code", + "execution_count": 74, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [ + "# Solution goes here\n", + "def parameter_sweep3(num_steps_array):\n", + " for num_steps in num_steps_array:\n", + " poppy = run_simulation(p1=.4, p2=.2)\n", + " plot(num_steps, poppy.olin_empty, 'rs', label='Olin')\n", + " plot(num_steps, poppy.wellesley_empty, 'bs', label='wellesley')" + ] + }, + { + "cell_type": "code", + "execution_count": 75, + "metadata": { + "scrolled": false + }, + "outputs": [ + { + "data": { + "application/javascript": [ + "/* Put everything inside the global mpl namespace */\n", + "window.mpl = {};\n", + "\n", + "\n", + "mpl.get_websocket_type = function() {\n", + " if (typeof(WebSocket) !== 'undefined') {\n", + " return WebSocket;\n", + " } else if (typeof(MozWebSocket) !== 'undefined') {\n", + " return MozWebSocket;\n", + " } else {\n", + " alert('Your browser does not have WebSocket support.' +\n", + " 'Please try Chrome, Safari or Firefox ≥ 6. ' +\n", + " 'Firefox 4 and 5 are also supported but you ' +\n", + " 'have to enable WebSockets in about:config.');\n", + " };\n", + "}\n", + "\n", + "mpl.figure = function(figure_id, websocket, ondownload, parent_element) {\n", + " this.id = figure_id;\n", + "\n", + " this.ws = websocket;\n", + "\n", + " this.supports_binary = (this.ws.binaryType != undefined);\n", + "\n", + " if (!this.supports_binary) {\n", + " var warnings = document.getElementById(\"mpl-warnings\");\n", + " if (warnings) {\n", + " warnings.style.display = 'block';\n", + " warnings.textContent = (\n", + " \"This browser does not support binary websocket messages. \" +\n", + " \"Performance may be slow.\");\n", + " }\n", + " }\n", + "\n", + " this.imageObj = new Image();\n", + "\n", + " this.context = undefined;\n", + " this.message = undefined;\n", + " this.canvas = undefined;\n", + " this.rubberband_canvas = undefined;\n", + " this.rubberband_context = undefined;\n", + " this.format_dropdown = undefined;\n", + "\n", + " this.image_mode = 'full';\n", + "\n", + " this.root = $('
');\n", + " this._root_extra_style(this.root)\n", + " this.root.attr('style', 'display: inline-block');\n", + "\n", + " $(parent_element).append(this.root);\n", + "\n", + " this._init_header(this);\n", + " this._init_canvas(this);\n", + " this._init_toolbar(this);\n", + "\n", + " var fig = this;\n", + "\n", + " this.waiting = false;\n", + "\n", + " this.ws.onopen = function () {\n", + " fig.send_message(\"supports_binary\", {value: fig.supports_binary});\n", + " fig.send_message(\"send_image_mode\", {});\n", + " if (mpl.ratio != 1) {\n", + " fig.send_message(\"set_dpi_ratio\", {'dpi_ratio': mpl.ratio});\n", + " }\n", + " fig.send_message(\"refresh\", {});\n", + " }\n", + "\n", + " this.imageObj.onload = function() {\n", + " if (fig.image_mode == 'full') {\n", + " // Full images could contain transparency (where diff images\n", + " // almost always do), so we need to clear the canvas so that\n", + " // there is no ghosting.\n", + " fig.context.clearRect(0, 0, fig.canvas.width, fig.canvas.height);\n", + " }\n", + " fig.context.drawImage(fig.imageObj, 0, 0);\n", + " };\n", + "\n", + " this.imageObj.onunload = function() {\n", + " this.ws.close();\n", + " }\n", + "\n", + " this.ws.onmessage = this._make_on_message_function(this);\n", + "\n", + " this.ondownload = ondownload;\n", + "}\n", + "\n", + "mpl.figure.prototype._init_header = function() {\n", + " var titlebar = $(\n", + " '
');\n", + " var titletext = $(\n", + " '
');\n", + " titlebar.append(titletext)\n", + " this.root.append(titlebar);\n", + " this.header = titletext[0];\n", + "}\n", + "\n", + "\n", + "\n", + "mpl.figure.prototype._canvas_extra_style = function(canvas_div) {\n", + "\n", + "}\n", + "\n", + "\n", + "mpl.figure.prototype._root_extra_style = function(canvas_div) {\n", + "\n", + "}\n", + "\n", + "mpl.figure.prototype._init_canvas = function() {\n", + " var fig = this;\n", + "\n", + " var canvas_div = $('
');\n", + "\n", + " canvas_div.attr('style', 'position: relative; clear: both; outline: 0');\n", + "\n", + " function canvas_keyboard_event(event) {\n", + " return fig.key_event(event, event['data']);\n", + " }\n", + "\n", + " canvas_div.keydown('key_press', canvas_keyboard_event);\n", + " canvas_div.keyup('key_release', canvas_keyboard_event);\n", + " this.canvas_div = canvas_div\n", + " this._canvas_extra_style(canvas_div)\n", + " this.root.append(canvas_div);\n", + "\n", + " var canvas = $('');\n", + " canvas.addClass('mpl-canvas');\n", + " canvas.attr('style', \"left: 0; top: 0; z-index: 0; outline: 0\")\n", + "\n", + " this.canvas = canvas[0];\n", + " this.context = canvas[0].getContext(\"2d\");\n", + "\n", + " var backingStore = this.context.backingStorePixelRatio ||\n", + "\tthis.context.webkitBackingStorePixelRatio ||\n", + "\tthis.context.mozBackingStorePixelRatio ||\n", + "\tthis.context.msBackingStorePixelRatio ||\n", + "\tthis.context.oBackingStorePixelRatio ||\n", + "\tthis.context.backingStorePixelRatio || 1;\n", + "\n", + " mpl.ratio = (window.devicePixelRatio || 1) / backingStore;\n", + "\n", + " var rubberband = $('');\n", + " rubberband.attr('style', \"position: absolute; left: 0; top: 0; z-index: 1;\")\n", + "\n", + " var pass_mouse_events = true;\n", + "\n", + " canvas_div.resizable({\n", + " start: function(event, ui) {\n", + " pass_mouse_events = false;\n", + " },\n", + " resize: function(event, ui) {\n", + " fig.request_resize(ui.size.width, ui.size.height);\n", + " },\n", + " stop: function(event, ui) {\n", + " pass_mouse_events = true;\n", + " fig.request_resize(ui.size.width, ui.size.height);\n", + " },\n", + " });\n", + "\n", + " function mouse_event_fn(event) {\n", + " if (pass_mouse_events)\n", + " return fig.mouse_event(event, event['data']);\n", + " }\n", + "\n", + " rubberband.mousedown('button_press', mouse_event_fn);\n", + " rubberband.mouseup('button_release', mouse_event_fn);\n", + " // Throttle sequential mouse events to 1 every 20ms.\n", + " rubberband.mousemove('motion_notify', mouse_event_fn);\n", + "\n", + " rubberband.mouseenter('figure_enter', mouse_event_fn);\n", + " rubberband.mouseleave('figure_leave', mouse_event_fn);\n", + "\n", + " canvas_div.on(\"wheel\", function (event) {\n", + " event = event.originalEvent;\n", + " event['data'] = 'scroll'\n", + " if (event.deltaY < 0) {\n", + " event.step = 1;\n", + " } else {\n", + " event.step = -1;\n", + " }\n", + " mouse_event_fn(event);\n", + " });\n", + "\n", + " canvas_div.append(canvas);\n", + " canvas_div.append(rubberband);\n", + "\n", + " this.rubberband = rubberband;\n", + " this.rubberband_canvas = rubberband[0];\n", + " this.rubberband_context = rubberband[0].getContext(\"2d\");\n", + " this.rubberband_context.strokeStyle = \"#000000\";\n", + "\n", + " this._resize_canvas = function(width, height) {\n", + " // Keep the size of the canvas, canvas container, and rubber band\n", + " // canvas in synch.\n", + " canvas_div.css('width', width)\n", + " canvas_div.css('height', height)\n", + "\n", + " canvas.attr('width', width * mpl.ratio);\n", + " canvas.attr('height', height * mpl.ratio);\n", + " canvas.attr('style', 'width: ' + width + 'px; height: ' + height + 'px;');\n", + "\n", + " rubberband.attr('width', width);\n", + " rubberband.attr('height', height);\n", + " }\n", + "\n", + " // Set the figure to an initial 600x600px, this will subsequently be updated\n", + " // upon first draw.\n", + " this._resize_canvas(600, 600);\n", + "\n", + " // Disable right mouse context menu.\n", + " $(this.rubberband_canvas).bind(\"contextmenu\",function(e){\n", + " return false;\n", + " });\n", + "\n", + " function set_focus () {\n", + " canvas.focus();\n", + " canvas_div.focus();\n", + " }\n", + "\n", + " window.setTimeout(set_focus, 100);\n", + "}\n", + "\n", + "mpl.figure.prototype._init_toolbar = function() {\n", + " var fig = this;\n", + "\n", + " var nav_element = $('
')\n", + " nav_element.attr('style', 'width: 100%');\n", + " this.root.append(nav_element);\n", + "\n", + " // Define a callback function for later on.\n", + " function toolbar_event(event) {\n", + " return fig.toolbar_button_onclick(event['data']);\n", + " }\n", + " function toolbar_mouse_event(event) {\n", + " return fig.toolbar_button_onmouseover(event['data']);\n", + " }\n", + "\n", + " for(var toolbar_ind in mpl.toolbar_items) {\n", + " var name = mpl.toolbar_items[toolbar_ind][0];\n", + " var tooltip = mpl.toolbar_items[toolbar_ind][1];\n", + " var image = mpl.toolbar_items[toolbar_ind][2];\n", + " var method_name = mpl.toolbar_items[toolbar_ind][3];\n", + "\n", + " if (!name) {\n", + " // put a spacer in here.\n", + " continue;\n", + " }\n", + " var button = $('');\n", - " button.click(method_name, toolbar_event);\n", - " button.mouseover(tooltip, toolbar_mouse_event);\n", - " nav_element.append(button);\n", - " }\n", - "\n", - " // Add the status bar.\n", - " var status_bar = $('');\n", - " nav_element.append(status_bar);\n", - " this.message = status_bar[0];\n", - "\n", - " // Add the close button to the window.\n", - " var buttongrp = $('
');\n", - " var button = $('');\n", - " button.click(function (evt) { fig.handle_close(fig, {}); } );\n", - " button.mouseover('Stop Interaction', toolbar_mouse_event);\n", - " buttongrp.append(button);\n", - " var titlebar = this.root.find($('.ui-dialog-titlebar'));\n", - " titlebar.prepend(buttongrp);\n", - "}\n", - "\n", - "mpl.figure.prototype._root_extra_style = function(el){\n", - " var fig = this\n", - " el.on(\"remove\", function(){\n", - "\tfig.close_ws(fig, {});\n", - " });\n", - "}\n", - "\n", - "mpl.figure.prototype._canvas_extra_style = function(el){\n", - " // this is important to make the div 'focusable\n", - " el.attr('tabindex', 0)\n", - " // reach out to IPython and tell the keyboard manager to turn it's self\n", - " // off when our div gets focus\n", - "\n", - " // location in version 3\n", - " if (IPython.notebook.keyboard_manager) {\n", - " IPython.notebook.keyboard_manager.register_events(el);\n", - " }\n", - " else {\n", - " // location in version 2\n", - " IPython.keyboard_manager.register_events(el);\n", - " }\n", - "\n", - "}\n", - "\n", - "mpl.figure.prototype._key_event_extra = function(event, name) {\n", - " var manager = IPython.notebook.keyboard_manager;\n", - " if (!manager)\n", - " manager = IPython.keyboard_manager;\n", - "\n", - " // Check for shift+enter\n", - " if (event.shiftKey && event.which == 13) {\n", - " this.canvas_div.blur();\n", - " // select the cell after this one\n", - " var index = IPython.notebook.find_cell_index(this.cell_info[0]);\n", - " IPython.notebook.select(index + 1);\n", - " }\n", - "}\n", - "\n", - "mpl.figure.prototype.handle_save = function(fig, msg) {\n", - " fig.ondownload(fig, null);\n", - "}\n", - "\n", - "\n", - "mpl.find_output_cell = function(html_output) {\n", - " // Return the cell and output element which can be found *uniquely* in the notebook.\n", - " // Note - this is a bit hacky, but it is done because the \"notebook_saving.Notebook\"\n", - " // IPython event is triggered only after the cells have been serialised, which for\n", - " // our purposes (turning an active figure into a static one), is too late.\n", - " var cells = IPython.notebook.get_cells();\n", - " var ncells = cells.length;\n", - " for (var i=0; i= 3 moved mimebundle to data attribute of output\n", - " data = data.data;\n", - " }\n", - " if (data['text/html'] == html_output) {\n", - " return [cell, data, j];\n", - " }\n", - " }\n", - " }\n", - " }\n", - "}\n", - "\n", - "// Register the function which deals with the matplotlib target/channel.\n", - "// The kernel may be null if the page has been refreshed.\n", - "if (IPython.notebook.kernel != null) {\n", - " IPython.notebook.kernel.comm_manager.register_target('matplotlib', mpl.mpl_figure_comm);\n", - "}\n" - ], - "text/plain": [ - "" - ] - }, - "metadata": {}, - "output_type": "display_data" - }, - { - "data": { - "text/html": [ - "" - ], - "text/plain": [ - "" - ] - }, - "metadata": {}, - "output_type": "display_data" - } - ], - "source": [ - "# Solution\n", - "\n", - "newfig()\n", - "p1_array = linspace(0, 1, 101)\n", - "parameter_sweep(p1_array)\n", - "decorate_bikeshare(xlabel='Arrival rate at Olin (p1 in customers/min)')" - ] - }, - { - "cell_type": "markdown", - "metadata": { - "collapsed": true - }, - "source": [ - "**Exercise:** Write a function called `parameter_sweep2` that runs simulations with `p1=0.2` and a range of values for `p2`.\n", - "\n", - "Note: If you run `parameter_sweep2` a few times without calling `newfig`, you can plot multiple runs on the same axes, which will give you a sense of how much random variation there is from one run to the next. " - ] - }, - { - "cell_type": "code", - "execution_count": 87, - "metadata": { - "collapsed": true - }, - "outputs": [], - "source": [ - "# Solution\n", - "\n", - "def parameter_sweep2(p2_array):\n", - " for p2 in p2_array:\n", - " system = run_simulation(p1=0.2, p2=p2)\n", - " plot(p2, system.olin_empty, 'rs', label='Olin')\n", - " plot(p2, system.wellesley_empty, 'bo', label='Wellesley')" - ] - }, - { - "cell_type": "code", - "execution_count": 88, - "metadata": {}, - "outputs": [ - { - "data": { - "application/javascript": [ - "/* Put everything inside the global mpl namespace */\n", - "window.mpl = {};\n", - "\n", - "\n", - "mpl.get_websocket_type = function() {\n", - " if (typeof(WebSocket) !== 'undefined') {\n", - " return WebSocket;\n", - " } else if (typeof(MozWebSocket) !== 'undefined') {\n", - " return MozWebSocket;\n", - " } else {\n", - " alert('Your browser does not have WebSocket support.' +\n", - " 'Please try Chrome, Safari or Firefox ≥ 6. ' +\n", - " 'Firefox 4 and 5 are also supported but you ' +\n", - " 'have to enable WebSockets in about:config.');\n", - " };\n", - "}\n", - "\n", - "mpl.figure = function(figure_id, websocket, ondownload, parent_element) {\n", - " this.id = figure_id;\n", - "\n", - " this.ws = websocket;\n", - "\n", - " this.supports_binary = (this.ws.binaryType != undefined);\n", - "\n", - " if (!this.supports_binary) {\n", - " var warnings = document.getElementById(\"mpl-warnings\");\n", - " if (warnings) {\n", - " warnings.style.display = 'block';\n", - " warnings.textContent = (\n", - " \"This browser does not support binary websocket messages. \" +\n", - " \"Performance may be slow.\");\n", - " }\n", - " }\n", - "\n", - " this.imageObj = new Image();\n", - "\n", - " this.context = undefined;\n", - " this.message = undefined;\n", - " this.canvas = undefined;\n", - " this.rubberband_canvas = undefined;\n", - " this.rubberband_context = undefined;\n", - " this.format_dropdown = undefined;\n", - "\n", - " this.image_mode = 'full';\n", - "\n", - " this.root = $('
');\n", - " this._root_extra_style(this.root)\n", - " this.root.attr('style', 'display: inline-block');\n", - "\n", - " $(parent_element).append(this.root);\n", - "\n", - " this._init_header(this);\n", - " this._init_canvas(this);\n", - " this._init_toolbar(this);\n", - "\n", - " var fig = this;\n", - "\n", - " this.waiting = false;\n", - "\n", - " this.ws.onopen = function () {\n", - " fig.send_message(\"supports_binary\", {value: fig.supports_binary});\n", - " fig.send_message(\"send_image_mode\", {});\n", - " if (mpl.ratio != 1) {\n", - " fig.send_message(\"set_dpi_ratio\", {'dpi_ratio': mpl.ratio});\n", - " }\n", - " fig.send_message(\"refresh\", {});\n", - " }\n", - "\n", - " this.imageObj.onload = function() {\n", - " if (fig.image_mode == 'full') {\n", - " // Full images could contain transparency (where diff images\n", - " // almost always do), so we need to clear the canvas so that\n", - " // there is no ghosting.\n", - " fig.context.clearRect(0, 0, fig.canvas.width, fig.canvas.height);\n", - " }\n", - " fig.context.drawImage(fig.imageObj, 0, 0);\n", - " };\n", - "\n", - " this.imageObj.onunload = function() {\n", - " this.ws.close();\n", - " }\n", - "\n", - " this.ws.onmessage = this._make_on_message_function(this);\n", - "\n", - " this.ondownload = ondownload;\n", - "}\n", - "\n", - "mpl.figure.prototype._init_header = function() {\n", - " var titlebar = $(\n", - " '
');\n", - " var titletext = $(\n", - " '
');\n", - " titlebar.append(titletext)\n", - " this.root.append(titlebar);\n", - " this.header = titletext[0];\n", - "}\n", - "\n", - "\n", - "\n", - "mpl.figure.prototype._canvas_extra_style = function(canvas_div) {\n", - "\n", - "}\n", - "\n", - "\n", - "mpl.figure.prototype._root_extra_style = function(canvas_div) {\n", - "\n", - "}\n", - "\n", - "mpl.figure.prototype._init_canvas = function() {\n", - " var fig = this;\n", - "\n", - " var canvas_div = $('
');\n", - "\n", - " canvas_div.attr('style', 'position: relative; clear: both; outline: 0');\n", - "\n", - " function canvas_keyboard_event(event) {\n", - " return fig.key_event(event, event['data']);\n", - " }\n", - "\n", - " canvas_div.keydown('key_press', canvas_keyboard_event);\n", - " canvas_div.keyup('key_release', canvas_keyboard_event);\n", - " this.canvas_div = canvas_div\n", - " this._canvas_extra_style(canvas_div)\n", - " this.root.append(canvas_div);\n", - "\n", - " var canvas = $('');\n", - " canvas.addClass('mpl-canvas');\n", - " canvas.attr('style', \"left: 0; top: 0; z-index: 0; outline: 0\")\n", - "\n", - " this.canvas = canvas[0];\n", - " this.context = canvas[0].getContext(\"2d\");\n", - "\n", - " var backingStore = this.context.backingStorePixelRatio ||\n", - "\tthis.context.webkitBackingStorePixelRatio ||\n", - "\tthis.context.mozBackingStorePixelRatio ||\n", - "\tthis.context.msBackingStorePixelRatio ||\n", - "\tthis.context.oBackingStorePixelRatio ||\n", - "\tthis.context.backingStorePixelRatio || 1;\n", - "\n", - " mpl.ratio = (window.devicePixelRatio || 1) / backingStore;\n", - "\n", - " var rubberband = $('');\n", - " rubberband.attr('style', \"position: absolute; left: 0; top: 0; z-index: 1;\")\n", - "\n", - " var pass_mouse_events = true;\n", - "\n", - " canvas_div.resizable({\n", - " start: function(event, ui) {\n", - " pass_mouse_events = false;\n", - " },\n", - " resize: function(event, ui) {\n", - " fig.request_resize(ui.size.width, ui.size.height);\n", - " },\n", - " stop: function(event, ui) {\n", - " pass_mouse_events = true;\n", - " fig.request_resize(ui.size.width, ui.size.height);\n", - " },\n", - " });\n", - "\n", - " function mouse_event_fn(event) {\n", - " if (pass_mouse_events)\n", - " return fig.mouse_event(event, event['data']);\n", - " }\n", - "\n", - " rubberband.mousedown('button_press', mouse_event_fn);\n", - " rubberband.mouseup('button_release', mouse_event_fn);\n", - " // Throttle sequential mouse events to 1 every 20ms.\n", - " rubberband.mousemove('motion_notify', mouse_event_fn);\n", - "\n", - " rubberband.mouseenter('figure_enter', mouse_event_fn);\n", - " rubberband.mouseleave('figure_leave', mouse_event_fn);\n", - "\n", - " canvas_div.on(\"wheel\", function (event) {\n", - " event = event.originalEvent;\n", - " event['data'] = 'scroll'\n", - " if (event.deltaY < 0) {\n", - " event.step = 1;\n", - " } else {\n", - " event.step = -1;\n", - " }\n", - " mouse_event_fn(event);\n", - " });\n", - "\n", - " canvas_div.append(canvas);\n", - " canvas_div.append(rubberband);\n", - "\n", - " this.rubberband = rubberband;\n", - " this.rubberband_canvas = rubberband[0];\n", - " this.rubberband_context = rubberband[0].getContext(\"2d\");\n", - " this.rubberband_context.strokeStyle = \"#000000\";\n", - "\n", - " this._resize_canvas = function(width, height) {\n", - " // Keep the size of the canvas, canvas container, and rubber band\n", - " // canvas in synch.\n", - " canvas_div.css('width', width)\n", - " canvas_div.css('height', height)\n", - "\n", - " canvas.attr('width', width * mpl.ratio);\n", - " canvas.attr('height', height * mpl.ratio);\n", - " canvas.attr('style', 'width: ' + width + 'px; height: ' + height + 'px;');\n", - "\n", - " rubberband.attr('width', width);\n", - " rubberband.attr('height', height);\n", - " }\n", - "\n", - " // Set the figure to an initial 600x600px, this will subsequently be updated\n", - " // upon first draw.\n", - " this._resize_canvas(600, 600);\n", - "\n", - " // Disable right mouse context menu.\n", - " $(this.rubberband_canvas).bind(\"contextmenu\",function(e){\n", - " return false;\n", - " });\n", - "\n", - " function set_focus () {\n", - " canvas.focus();\n", - " canvas_div.focus();\n", - " }\n", - "\n", - " window.setTimeout(set_focus, 100);\n", - "}\n", - "\n", - "mpl.figure.prototype._init_toolbar = function() {\n", - " var fig = this;\n", - "\n", - " var nav_element = $('
')\n", - " nav_element.attr('style', 'width: 100%');\n", - " this.root.append(nav_element);\n", - "\n", - " // Define a callback function for later on.\n", - " function toolbar_event(event) {\n", - " return fig.toolbar_button_onclick(event['data']);\n", - " }\n", - " function toolbar_mouse_event(event) {\n", - " return fig.toolbar_button_onmouseover(event['data']);\n", - " }\n", - "\n", - " for(var toolbar_ind in mpl.toolbar_items) {\n", - " var name = mpl.toolbar_items[toolbar_ind][0];\n", - " var tooltip = mpl.toolbar_items[toolbar_ind][1];\n", - " var image = mpl.toolbar_items[toolbar_ind][2];\n", - " var method_name = mpl.toolbar_items[toolbar_ind][3];\n", - "\n", - " if (!name) {\n", - " // put a spacer in here.\n", - " continue;\n", - " }\n", - " var button = $('');\n", + " button.click(method_name, toolbar_event);\n", + " button.mouseover(tooltip, toolbar_mouse_event);\n", + " nav_element.append(button);\n", + " }\n", + "\n", + " // Add the status bar.\n", + " var status_bar = $('');\n", + " nav_element.append(status_bar);\n", + " this.message = status_bar[0];\n", + "\n", + " // Add the close button to the window.\n", + " var buttongrp = $('
');\n", + " var button = $('');\n", + " button.click(function (evt) { fig.handle_close(fig, {}); } );\n", + " button.mouseover('Stop Interaction', toolbar_mouse_event);\n", + " buttongrp.append(button);\n", + " var titlebar = this.root.find($('.ui-dialog-titlebar'));\n", + " titlebar.prepend(buttongrp);\n", + "}\n", + "\n", + "mpl.figure.prototype._root_extra_style = function(el){\n", + " var fig = this\n", + " el.on(\"remove\", function(){\n", + "\tfig.close_ws(fig, {});\n", + " });\n", + "}\n", + "\n", + "mpl.figure.prototype._canvas_extra_style = function(el){\n", + " // this is important to make the div 'focusable\n", + " el.attr('tabindex', 0)\n", + " // reach out to IPython and tell the keyboard manager to turn it's self\n", + " // off when our div gets focus\n", + "\n", + " // location in version 3\n", + " if (IPython.notebook.keyboard_manager) {\n", + " IPython.notebook.keyboard_manager.register_events(el);\n", + " }\n", + " else {\n", + " // location in version 2\n", + " IPython.keyboard_manager.register_events(el);\n", + " }\n", + "\n", + "}\n", + "\n", + "mpl.figure.prototype._key_event_extra = function(event, name) {\n", + " var manager = IPython.notebook.keyboard_manager;\n", + " if (!manager)\n", + " manager = IPython.keyboard_manager;\n", + "\n", + " // Check for shift+enter\n", + " if (event.shiftKey && event.which == 13) {\n", + " this.canvas_div.blur();\n", + " // select the cell after this one\n", + " var index = IPython.notebook.find_cell_index(this.cell_info[0]);\n", + " IPython.notebook.select(index + 1);\n", + " }\n", + "}\n", + "\n", + "mpl.figure.prototype.handle_save = function(fig, msg) {\n", + " fig.ondownload(fig, null);\n", + "}\n", + "\n", + "\n", + "mpl.find_output_cell = function(html_output) {\n", + " // Return the cell and output element which can be found *uniquely* in the notebook.\n", + " // Note - this is a bit hacky, but it is done because the \"notebook_saving.Notebook\"\n", + " // IPython event is triggered only after the cells have been serialised, which for\n", + " // our purposes (turning an active figure into a static one), is too late.\n", + " var cells = IPython.notebook.get_cells();\n", + " var ncells = cells.length;\n", + " for (var i=0; i= 3 moved mimebundle to data attribute of output\n", + " data = data.data;\n", + " }\n", + " if (data['text/html'] == html_output) {\n", + " return [cell, data, j];\n", + " }\n", + " }\n", + " }\n", + " }\n", + "}\n", + "\n", + "// Register the function which deals with the matplotlib target/channel.\n", + "// The kernel may be null if the page has been refreshed.\n", + "if (IPython.notebook.kernel != null) {\n", + " IPython.notebook.kernel.comm_manager.register_target('matplotlib', mpl.mpl_figure_comm);\n", + "}\n" + ], + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "text/html": [ + "" + ], + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Saving figure to file chap10-fig01.pdf\n" + ] + } + ], + "source": [ + "newfig()\n", + "plot(xs, label='x')\n", + "plot(ys, label='y')\n", + "\n", + "decorate(xlabel='Time (s)',\n", + " ylabel='Position (m)')\n", + "\n", + "savefig('chap10-fig01.pdf')" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "We can plot the velocities the same way." + ] + }, + { + "cell_type": "code", + "execution_count": 34, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [ + "vxs = system.results.vx\n", + "vys = system.results.vy" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "The x velocity slows down due to drag. The y velocity drops quickly while drag and gravity are in the same direction, then more slowly after the ball starts to fall." + ] + }, + { + "cell_type": "code", + "execution_count": 35, + "metadata": {}, + "outputs": [ + { + "data": { + "application/javascript": [ + "/* Put everything inside the global mpl namespace */\n", + "window.mpl = {};\n", + "\n", + "\n", + "mpl.get_websocket_type = function() {\n", + " if (typeof(WebSocket) !== 'undefined') {\n", + " return WebSocket;\n", + " } else if (typeof(MozWebSocket) !== 'undefined') {\n", + " return MozWebSocket;\n", + " } else {\n", + " alert('Your browser does not have WebSocket support.' +\n", + " 'Please try Chrome, Safari or Firefox ≥ 6. ' +\n", + " 'Firefox 4 and 5 are also supported but you ' +\n", + " 'have to enable WebSockets in about:config.');\n", + " };\n", + "}\n", + "\n", + "mpl.figure = function(figure_id, websocket, ondownload, parent_element) {\n", + " this.id = figure_id;\n", + "\n", + " this.ws = websocket;\n", + "\n", + " this.supports_binary = (this.ws.binaryType != undefined);\n", + "\n", + " if (!this.supports_binary) {\n", + " var warnings = document.getElementById(\"mpl-warnings\");\n", + " if (warnings) {\n", + " warnings.style.display = 'block';\n", + " warnings.textContent = (\n", + " \"This browser does not support binary websocket messages. \" +\n", + " \"Performance may be slow.\");\n", + " }\n", + " }\n", + "\n", + " this.imageObj = new Image();\n", + "\n", + " this.context = undefined;\n", + " this.message = undefined;\n", + " this.canvas = undefined;\n", + " this.rubberband_canvas = undefined;\n", + " this.rubberband_context = undefined;\n", + " this.format_dropdown = undefined;\n", + "\n", + " this.image_mode = 'full';\n", + "\n", + " this.root = $('
');\n", + " this._root_extra_style(this.root)\n", + " this.root.attr('style', 'display: inline-block');\n", + "\n", + " $(parent_element).append(this.root);\n", + "\n", + " this._init_header(this);\n", + " this._init_canvas(this);\n", + " this._init_toolbar(this);\n", + "\n", + " var fig = this;\n", + "\n", + " this.waiting = false;\n", + "\n", + " this.ws.onopen = function () {\n", + " fig.send_message(\"supports_binary\", {value: fig.supports_binary});\n", + " fig.send_message(\"send_image_mode\", {});\n", + " if (mpl.ratio != 1) {\n", + " fig.send_message(\"set_dpi_ratio\", {'dpi_ratio': mpl.ratio});\n", + " }\n", + " fig.send_message(\"refresh\", {});\n", + " }\n", + "\n", + " this.imageObj.onload = function() {\n", + " if (fig.image_mode == 'full') {\n", + " // Full images could contain transparency (where diff images\n", + " // almost always do), so we need to clear the canvas so that\n", + " // there is no ghosting.\n", + " fig.context.clearRect(0, 0, fig.canvas.width, fig.canvas.height);\n", + " }\n", + " fig.context.drawImage(fig.imageObj, 0, 0);\n", + " };\n", + "\n", + " this.imageObj.onunload = function() {\n", + " this.ws.close();\n", + " }\n", + "\n", + " this.ws.onmessage = this._make_on_message_function(this);\n", + "\n", + " this.ondownload = ondownload;\n", + "}\n", + "\n", + "mpl.figure.prototype._init_header = function() {\n", + " var titlebar = $(\n", + " '
');\n", + " var titletext = $(\n", + " '
');\n", + " titlebar.append(titletext)\n", + " this.root.append(titlebar);\n", + " this.header = titletext[0];\n", + "}\n", + "\n", + "\n", + "\n", + "mpl.figure.prototype._canvas_extra_style = function(canvas_div) {\n", + "\n", + "}\n", + "\n", + "\n", + "mpl.figure.prototype._root_extra_style = function(canvas_div) {\n", + "\n", + "}\n", + "\n", + "mpl.figure.prototype._init_canvas = function() {\n", + " var fig = this;\n", + "\n", + " var canvas_div = $('
');\n", + "\n", + " canvas_div.attr('style', 'position: relative; clear: both; outline: 0');\n", + "\n", + " function canvas_keyboard_event(event) {\n", + " return fig.key_event(event, event['data']);\n", + " }\n", + "\n", + " canvas_div.keydown('key_press', canvas_keyboard_event);\n", + " canvas_div.keyup('key_release', canvas_keyboard_event);\n", + " this.canvas_div = canvas_div\n", + " this._canvas_extra_style(canvas_div)\n", + " this.root.append(canvas_div);\n", + "\n", + " var canvas = $('');\n", + " canvas.addClass('mpl-canvas');\n", + " canvas.attr('style', \"left: 0; top: 0; z-index: 0; outline: 0\")\n", + "\n", + " this.canvas = canvas[0];\n", + " this.context = canvas[0].getContext(\"2d\");\n", + "\n", + " var backingStore = this.context.backingStorePixelRatio ||\n", + "\tthis.context.webkitBackingStorePixelRatio ||\n", + "\tthis.context.mozBackingStorePixelRatio ||\n", + "\tthis.context.msBackingStorePixelRatio ||\n", + "\tthis.context.oBackingStorePixelRatio ||\n", + "\tthis.context.backingStorePixelRatio || 1;\n", + "\n", + " mpl.ratio = (window.devicePixelRatio || 1) / backingStore;\n", + "\n", + " var rubberband = $('');\n", + " rubberband.attr('style', \"position: absolute; left: 0; top: 0; z-index: 1;\")\n", + "\n", + " var pass_mouse_events = true;\n", + "\n", + " canvas_div.resizable({\n", + " start: function(event, ui) {\n", + " pass_mouse_events = false;\n", + " },\n", + " resize: function(event, ui) {\n", + " fig.request_resize(ui.size.width, ui.size.height);\n", + " },\n", + " stop: function(event, ui) {\n", + " pass_mouse_events = true;\n", + " fig.request_resize(ui.size.width, ui.size.height);\n", + " },\n", + " });\n", + "\n", + " function mouse_event_fn(event) {\n", + " if (pass_mouse_events)\n", + " return fig.mouse_event(event, event['data']);\n", + " }\n", + "\n", + " rubberband.mousedown('button_press', mouse_event_fn);\n", + " rubberband.mouseup('button_release', mouse_event_fn);\n", + " // Throttle sequential mouse events to 1 every 20ms.\n", + " rubberband.mousemove('motion_notify', mouse_event_fn);\n", + "\n", + " rubberband.mouseenter('figure_enter', mouse_event_fn);\n", + " rubberband.mouseleave('figure_leave', mouse_event_fn);\n", + "\n", + " canvas_div.on(\"wheel\", function (event) {\n", + " event = event.originalEvent;\n", + " event['data'] = 'scroll'\n", + " if (event.deltaY < 0) {\n", + " event.step = 1;\n", + " } else {\n", + " event.step = -1;\n", + " }\n", + " mouse_event_fn(event);\n", + " });\n", + "\n", + " canvas_div.append(canvas);\n", + " canvas_div.append(rubberband);\n", + "\n", + " this.rubberband = rubberband;\n", + " this.rubberband_canvas = rubberband[0];\n", + " this.rubberband_context = rubberband[0].getContext(\"2d\");\n", + " this.rubberband_context.strokeStyle = \"#000000\";\n", + "\n", + " this._resize_canvas = function(width, height) {\n", + " // Keep the size of the canvas, canvas container, and rubber band\n", + " // canvas in synch.\n", + " canvas_div.css('width', width)\n", + " canvas_div.css('height', height)\n", + "\n", + " canvas.attr('width', width * mpl.ratio);\n", + " canvas.attr('height', height * mpl.ratio);\n", + " canvas.attr('style', 'width: ' + width + 'px; height: ' + height + 'px;');\n", + "\n", + " rubberband.attr('width', width);\n", + " rubberband.attr('height', height);\n", + " }\n", + "\n", + " // Set the figure to an initial 600x600px, this will subsequently be updated\n", + " // upon first draw.\n", + " this._resize_canvas(600, 600);\n", + "\n", + " // Disable right mouse context menu.\n", + " $(this.rubberband_canvas).bind(\"contextmenu\",function(e){\n", + " return false;\n", + " });\n", + "\n", + " function set_focus () {\n", + " canvas.focus();\n", + " canvas_div.focus();\n", + " }\n", + "\n", + " window.setTimeout(set_focus, 100);\n", + "}\n", + "\n", + "mpl.figure.prototype._init_toolbar = function() {\n", + " var fig = this;\n", + "\n", + " var nav_element = $('
')\n", + " nav_element.attr('style', 'width: 100%');\n", + " this.root.append(nav_element);\n", + "\n", + " // Define a callback function for later on.\n", + " function toolbar_event(event) {\n", + " return fig.toolbar_button_onclick(event['data']);\n", + " }\n", + " function toolbar_mouse_event(event) {\n", + " return fig.toolbar_button_onmouseover(event['data']);\n", + " }\n", + "\n", + " for(var toolbar_ind in mpl.toolbar_items) {\n", + " var name = mpl.toolbar_items[toolbar_ind][0];\n", + " var tooltip = mpl.toolbar_items[toolbar_ind][1];\n", + " var image = mpl.toolbar_items[toolbar_ind][2];\n", + " var method_name = mpl.toolbar_items[toolbar_ind][3];\n", + "\n", + " if (!name) {\n", + " // put a spacer in here.\n", + " continue;\n", + " }\n", + " var button = $('');\n", + " button.click(method_name, toolbar_event);\n", + " button.mouseover(tooltip, toolbar_mouse_event);\n", + " nav_element.append(button);\n", + " }\n", + "\n", + " // Add the status bar.\n", + " var status_bar = $('');\n", + " nav_element.append(status_bar);\n", + " this.message = status_bar[0];\n", + "\n", + " // Add the close button to the window.\n", + " var buttongrp = $('
');\n", + " var button = $('');\n", + " button.click(function (evt) { fig.handle_close(fig, {}); } );\n", + " button.mouseover('Stop Interaction', toolbar_mouse_event);\n", + " buttongrp.append(button);\n", + " var titlebar = this.root.find($('.ui-dialog-titlebar'));\n", + " titlebar.prepend(buttongrp);\n", + "}\n", + "\n", + "mpl.figure.prototype._root_extra_style = function(el){\n", + " var fig = this\n", + " el.on(\"remove\", function(){\n", + "\tfig.close_ws(fig, {});\n", + " });\n", + "}\n", + "\n", + "mpl.figure.prototype._canvas_extra_style = function(el){\n", + " // this is important to make the div 'focusable\n", + " el.attr('tabindex', 0)\n", + " // reach out to IPython and tell the keyboard manager to turn it's self\n", + " // off when our div gets focus\n", + "\n", + " // location in version 3\n", + " if (IPython.notebook.keyboard_manager) {\n", + " IPython.notebook.keyboard_manager.register_events(el);\n", + " }\n", + " else {\n", + " // location in version 2\n", + " IPython.keyboard_manager.register_events(el);\n", + " }\n", + "\n", + "}\n", + "\n", + "mpl.figure.prototype._key_event_extra = function(event, name) {\n", + " var manager = IPython.notebook.keyboard_manager;\n", + " if (!manager)\n", + " manager = IPython.keyboard_manager;\n", + "\n", + " // Check for shift+enter\n", + " if (event.shiftKey && event.which == 13) {\n", + " this.canvas_div.blur();\n", + " // select the cell after this one\n", + " var index = IPython.notebook.find_cell_index(this.cell_info[0]);\n", + " IPython.notebook.select(index + 1);\n", + " }\n", + "}\n", + "\n", + "mpl.figure.prototype.handle_save = function(fig, msg) {\n", + " fig.ondownload(fig, null);\n", + "}\n", + "\n", + "\n", + "mpl.find_output_cell = function(html_output) {\n", + " // Return the cell and output element which can be found *uniquely* in the notebook.\n", + " // Note - this is a bit hacky, but it is done because the \"notebook_saving.Notebook\"\n", + " // IPython event is triggered only after the cells have been serialised, which for\n", + " // our purposes (turning an active figure into a static one), is too late.\n", + " var cells = IPython.notebook.get_cells();\n", + " var ncells = cells.length;\n", + " for (var i=0; i= 3 moved mimebundle to data attribute of output\n", + " data = data.data;\n", + " }\n", + " if (data['text/html'] == html_output) {\n", + " return [cell, data, j];\n", + " }\n", + " }\n", + " }\n", + " }\n", + "}\n", + "\n", + "// Register the function which deals with the matplotlib target/channel.\n", + "// The kernel may be null if the page has been refreshed.\n", + "if (IPython.notebook.kernel != null) {\n", + " IPython.notebook.kernel.comm_manager.register_target('matplotlib', mpl.mpl_figure_comm);\n", + "}\n" + ], + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "text/html": [ + "" + ], + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Saving figure to file chap10-fig02.pdf\n" + ] + } + ], + "source": [ + "newfig()\n", + "plot(xs, ys, label='trajectory')\n", + "\n", + "decorate(xlabel='x position (m)',\n", + " ylabel='y position (m)')\n", + "\n", + "savefig('chap10-fig02.pdf')" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "We can also animate the flight of the ball. If there's an error in the simulation, we can sometimes spot it by looking at animations." + ] + }, + { + "cell_type": "code", + "execution_count": 37, + "metadata": { + "scrolled": false + }, + "outputs": [ + { + "data": { + "application/javascript": [ + "/* Put everything inside the global mpl namespace */\n", + "window.mpl = {};\n", + "\n", + "\n", + "mpl.get_websocket_type = function() {\n", + " if (typeof(WebSocket) !== 'undefined') {\n", + " return WebSocket;\n", + " } else if (typeof(MozWebSocket) !== 'undefined') {\n", + " return MozWebSocket;\n", + " } else {\n", + " alert('Your browser does not have WebSocket support.' +\n", + " 'Please try Chrome, Safari or Firefox ≥ 6. ' +\n", + " 'Firefox 4 and 5 are also supported but you ' +\n", + " 'have to enable WebSockets in about:config.');\n", + " };\n", + "}\n", + "\n", + "mpl.figure = function(figure_id, websocket, ondownload, parent_element) {\n", + " this.id = figure_id;\n", + "\n", + " this.ws = websocket;\n", + "\n", + " this.supports_binary = (this.ws.binaryType != undefined);\n", + "\n", + " if (!this.supports_binary) {\n", + " var warnings = document.getElementById(\"mpl-warnings\");\n", + " if (warnings) {\n", + " warnings.style.display = 'block';\n", + " warnings.textContent = (\n", + " \"This browser does not support binary websocket messages. \" +\n", + " \"Performance may be slow.\");\n", + " }\n", + " }\n", + "\n", + " this.imageObj = new Image();\n", + "\n", + " this.context = undefined;\n", + " this.message = undefined;\n", + " this.canvas = undefined;\n", + " this.rubberband_canvas = undefined;\n", + " this.rubberband_context = undefined;\n", + " this.format_dropdown = undefined;\n", + "\n", + " this.image_mode = 'full';\n", + "\n", + " this.root = $('
');\n", + " this._root_extra_style(this.root)\n", + " this.root.attr('style', 'display: inline-block');\n", + "\n", + " $(parent_element).append(this.root);\n", + "\n", + " this._init_header(this);\n", + " this._init_canvas(this);\n", + " this._init_toolbar(this);\n", + "\n", + " var fig = this;\n", + "\n", + " this.waiting = false;\n", + "\n", + " this.ws.onopen = function () {\n", + " fig.send_message(\"supports_binary\", {value: fig.supports_binary});\n", + " fig.send_message(\"send_image_mode\", {});\n", + " if (mpl.ratio != 1) {\n", + " fig.send_message(\"set_dpi_ratio\", {'dpi_ratio': mpl.ratio});\n", + " }\n", + " fig.send_message(\"refresh\", {});\n", + " }\n", + "\n", + " this.imageObj.onload = function() {\n", + " if (fig.image_mode == 'full') {\n", + " // Full images could contain transparency (where diff images\n", + " // almost always do), so we need to clear the canvas so that\n", + " // there is no ghosting.\n", + " fig.context.clearRect(0, 0, fig.canvas.width, fig.canvas.height);\n", + " }\n", + " fig.context.drawImage(fig.imageObj, 0, 0);\n", + " };\n", + "\n", + " this.imageObj.onunload = function() {\n", + " this.ws.close();\n", + " }\n", + "\n", + " this.ws.onmessage = this._make_on_message_function(this);\n", + "\n", + " this.ondownload = ondownload;\n", + "}\n", + "\n", + "mpl.figure.prototype._init_header = function() {\n", + " var titlebar = $(\n", + " '
');\n", + " var titletext = $(\n", + " '
');\n", + " titlebar.append(titletext)\n", + " this.root.append(titlebar);\n", + " this.header = titletext[0];\n", + "}\n", + "\n", + "\n", + "\n", + "mpl.figure.prototype._canvas_extra_style = function(canvas_div) {\n", + "\n", + "}\n", + "\n", + "\n", + "mpl.figure.prototype._root_extra_style = function(canvas_div) {\n", + "\n", + "}\n", + "\n", + "mpl.figure.prototype._init_canvas = function() {\n", + " var fig = this;\n", + "\n", + " var canvas_div = $('
');\n", + "\n", + " canvas_div.attr('style', 'position: relative; clear: both; outline: 0');\n", + "\n", + " function canvas_keyboard_event(event) {\n", + " return fig.key_event(event, event['data']);\n", + " }\n", + "\n", + " canvas_div.keydown('key_press', canvas_keyboard_event);\n", + " canvas_div.keyup('key_release', canvas_keyboard_event);\n", + " this.canvas_div = canvas_div\n", + " this._canvas_extra_style(canvas_div)\n", + " this.root.append(canvas_div);\n", + "\n", + " var canvas = $('');\n", + " canvas.addClass('mpl-canvas');\n", + " canvas.attr('style', \"left: 0; top: 0; z-index: 0; outline: 0\")\n", + "\n", + " this.canvas = canvas[0];\n", + " this.context = canvas[0].getContext(\"2d\");\n", + "\n", + " var backingStore = this.context.backingStorePixelRatio ||\n", + "\tthis.context.webkitBackingStorePixelRatio ||\n", + "\tthis.context.mozBackingStorePixelRatio ||\n", + "\tthis.context.msBackingStorePixelRatio ||\n", + "\tthis.context.oBackingStorePixelRatio ||\n", + "\tthis.context.backingStorePixelRatio || 1;\n", + "\n", + " mpl.ratio = (window.devicePixelRatio || 1) / backingStore;\n", + "\n", + " var rubberband = $('');\n", + " rubberband.attr('style', \"position: absolute; left: 0; top: 0; z-index: 1;\")\n", + "\n", + " var pass_mouse_events = true;\n", + "\n", + " canvas_div.resizable({\n", + " start: function(event, ui) {\n", + " pass_mouse_events = false;\n", + " },\n", + " resize: function(event, ui) {\n", + " fig.request_resize(ui.size.width, ui.size.height);\n", + " },\n", + " stop: function(event, ui) {\n", + " pass_mouse_events = true;\n", + " fig.request_resize(ui.size.width, ui.size.height);\n", + " },\n", + " });\n", + "\n", + " function mouse_event_fn(event) {\n", + " if (pass_mouse_events)\n", + " return fig.mouse_event(event, event['data']);\n", + " }\n", + "\n", + " rubberband.mousedown('button_press', mouse_event_fn);\n", + " rubberband.mouseup('button_release', mouse_event_fn);\n", + " // Throttle sequential mouse events to 1 every 20ms.\n", + " rubberband.mousemove('motion_notify', mouse_event_fn);\n", + "\n", + " rubberband.mouseenter('figure_enter', mouse_event_fn);\n", + " rubberband.mouseleave('figure_leave', mouse_event_fn);\n", + "\n", + " canvas_div.on(\"wheel\", function (event) {\n", + " event = event.originalEvent;\n", + " event['data'] = 'scroll'\n", + " if (event.deltaY < 0) {\n", + " event.step = 1;\n", + " } else {\n", + " event.step = -1;\n", + " }\n", + " mouse_event_fn(event);\n", + " });\n", + "\n", + " canvas_div.append(canvas);\n", + " canvas_div.append(rubberband);\n", + "\n", + " this.rubberband = rubberband;\n", + " this.rubberband_canvas = rubberband[0];\n", + " this.rubberband_context = rubberband[0].getContext(\"2d\");\n", + " this.rubberband_context.strokeStyle = \"#000000\";\n", + "\n", + " this._resize_canvas = function(width, height) {\n", + " // Keep the size of the canvas, canvas container, and rubber band\n", + " // canvas in synch.\n", + " canvas_div.css('width', width)\n", + " canvas_div.css('height', height)\n", + "\n", + " canvas.attr('width', width * mpl.ratio);\n", + " canvas.attr('height', height * mpl.ratio);\n", + " canvas.attr('style', 'width: ' + width + 'px; height: ' + height + 'px;');\n", + "\n", + " rubberband.attr('width', width);\n", + " rubberband.attr('height', height);\n", + " }\n", + "\n", + " // Set the figure to an initial 600x600px, this will subsequently be updated\n", + " // upon first draw.\n", + " this._resize_canvas(600, 600);\n", + "\n", + " // Disable right mouse context menu.\n", + " $(this.rubberband_canvas).bind(\"contextmenu\",function(e){\n", + " return false;\n", + " });\n", + "\n", + " function set_focus () {\n", + " canvas.focus();\n", + " canvas_div.focus();\n", + " }\n", + "\n", + " window.setTimeout(set_focus, 100);\n", + "}\n", + "\n", + "mpl.figure.prototype._init_toolbar = function() {\n", + " var fig = this;\n", + "\n", + " var nav_element = $('
')\n", + " nav_element.attr('style', 'width: 100%');\n", + " this.root.append(nav_element);\n", + "\n", + " // Define a callback function for later on.\n", + " function toolbar_event(event) {\n", + " return fig.toolbar_button_onclick(event['data']);\n", + " }\n", + " function toolbar_mouse_event(event) {\n", + " return fig.toolbar_button_onmouseover(event['data']);\n", + " }\n", + "\n", + " for(var toolbar_ind in mpl.toolbar_items) {\n", + " var name = mpl.toolbar_items[toolbar_ind][0];\n", + " var tooltip = mpl.toolbar_items[toolbar_ind][1];\n", + " var image = mpl.toolbar_items[toolbar_ind][2];\n", + " var method_name = mpl.toolbar_items[toolbar_ind][3];\n", + "\n", + " if (!name) {\n", + " // put a spacer in here.\n", + " continue;\n", + " }\n", + " var button = $('');\n", + " button.click(method_name, toolbar_event);\n", + " button.mouseover(tooltip, toolbar_mouse_event);\n", + " nav_element.append(button);\n", + " }\n", + "\n", + " // Add the status bar.\n", + " var status_bar = $('');\n", + " nav_element.append(status_bar);\n", + " this.message = status_bar[0];\n", + "\n", + " // Add the close button to the window.\n", + " var buttongrp = $('
');\n", + " var button = $('');\n", + " button.click(function (evt) { fig.handle_close(fig, {}); } );\n", + " button.mouseover('Stop Interaction', toolbar_mouse_event);\n", + " buttongrp.append(button);\n", + " var titlebar = this.root.find($('.ui-dialog-titlebar'));\n", + " titlebar.prepend(buttongrp);\n", + "}\n", + "\n", + "mpl.figure.prototype._root_extra_style = function(el){\n", + " var fig = this\n", + " el.on(\"remove\", function(){\n", + "\tfig.close_ws(fig, {});\n", + " });\n", + "}\n", + "\n", + "mpl.figure.prototype._canvas_extra_style = function(el){\n", + " // this is important to make the div 'focusable\n", + " el.attr('tabindex', 0)\n", + " // reach out to IPython and tell the keyboard manager to turn it's self\n", + " // off when our div gets focus\n", + "\n", + " // location in version 3\n", + " if (IPython.notebook.keyboard_manager) {\n", + " IPython.notebook.keyboard_manager.register_events(el);\n", + " }\n", + " else {\n", + " // location in version 2\n", + " IPython.keyboard_manager.register_events(el);\n", + " }\n", + "\n", + "}\n", + "\n", + "mpl.figure.prototype._key_event_extra = function(event, name) {\n", + " var manager = IPython.notebook.keyboard_manager;\n", + " if (!manager)\n", + " manager = IPython.keyboard_manager;\n", + "\n", + " // Check for shift+enter\n", + " if (event.shiftKey && event.which == 13) {\n", + " this.canvas_div.blur();\n", + " // select the cell after this one\n", + " var index = IPython.notebook.find_cell_index(this.cell_info[0]);\n", + " IPython.notebook.select(index + 1);\n", + " }\n", + "}\n", + "\n", + "mpl.figure.prototype.handle_save = function(fig, msg) {\n", + " fig.ondownload(fig, null);\n", + "}\n", + "\n", + "\n", + "mpl.find_output_cell = function(html_output) {\n", + " // Return the cell and output element which can be found *uniquely* in the notebook.\n", + " // Note - this is a bit hacky, but it is done because the \"notebook_saving.Notebook\"\n", + " // IPython event is triggered only after the cells have been serialised, which for\n", + " // our purposes (turning an active figure into a static one), is too late.\n", + " var cells = IPython.notebook.get_cells();\n", + " var ncells = cells.length;\n", + " for (var i=0; i= 3 moved mimebundle to data attribute of output\n", + " data = data.data;\n", + " }\n", + " if (data['text/html'] == html_output) {\n", + " return [cell, data, j];\n", + " }\n", + " }\n", + " }\n", + " }\n", + "}\n", + "\n", + "// Register the function which deals with the matplotlib target/channel.\n", + "// The kernel may be null if the page has been refreshed.\n", + "if (IPython.notebook.kernel != null) {\n", + " IPython.notebook.kernel.comm_manager.register_target('matplotlib', mpl.mpl_figure_comm);\n", + "}\n" + ], + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "text/html": [ + "" + ], + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "animate2d(system.results.x, system.results.y, 15)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "**Exercise:** Run the simulation for a few different launch angles and visualize the results. Are they consistent with your expectations?" + ] + }, + { + "cell_type": "code", + "execution_count": 40, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [ + "condition.set(angle = 20 * degree)\n", + "system_2 = make_system(condition)\n", + "slope_func(system_2.init, 0, system_2)\n", + "run_odeint(system_2, slope_func)\n" + ] + }, + { + "cell_type": "code", + "execution_count": 41, + "metadata": {}, + "outputs": [ + { + "data": { + "application/javascript": [ + "/* Put everything inside the global mpl namespace */\n", + "window.mpl = {};\n", + "\n", + "\n", + "mpl.get_websocket_type = function() {\n", + " if (typeof(WebSocket) !== 'undefined') {\n", + " return WebSocket;\n", + " } else if (typeof(MozWebSocket) !== 'undefined') {\n", + " return MozWebSocket;\n", + " } else {\n", + " alert('Your browser does not have WebSocket support.' +\n", + " 'Please try Chrome, Safari or Firefox ≥ 6. ' +\n", + " 'Firefox 4 and 5 are also supported but you ' +\n", + " 'have to enable WebSockets in about:config.');\n", + " };\n", + "}\n", + "\n", + "mpl.figure = function(figure_id, websocket, ondownload, parent_element) {\n", + " this.id = figure_id;\n", + "\n", + " this.ws = websocket;\n", + "\n", + " this.supports_binary = (this.ws.binaryType != undefined);\n", + "\n", + " if (!this.supports_binary) {\n", + " var warnings = document.getElementById(\"mpl-warnings\");\n", + " if (warnings) {\n", + " warnings.style.display = 'block';\n", + " warnings.textContent = (\n", + " \"This browser does not support binary websocket messages. \" +\n", + " \"Performance may be slow.\");\n", + " }\n", + " }\n", + "\n", + " this.imageObj = new Image();\n", + "\n", + " this.context = undefined;\n", + " this.message = undefined;\n", + " this.canvas = undefined;\n", + " this.rubberband_canvas = undefined;\n", + " this.rubberband_context = undefined;\n", + " this.format_dropdown = undefined;\n", + "\n", + " this.image_mode = 'full';\n", + "\n", + " this.root = $('
');\n", + " this._root_extra_style(this.root)\n", + " this.root.attr('style', 'display: inline-block');\n", + "\n", + " $(parent_element).append(this.root);\n", + "\n", + " this._init_header(this);\n", + " this._init_canvas(this);\n", + " this._init_toolbar(this);\n", + "\n", + " var fig = this;\n", + "\n", + " this.waiting = false;\n", + "\n", + " this.ws.onopen = function () {\n", + " fig.send_message(\"supports_binary\", {value: fig.supports_binary});\n", + " fig.send_message(\"send_image_mode\", {});\n", + " if (mpl.ratio != 1) {\n", + " fig.send_message(\"set_dpi_ratio\", {'dpi_ratio': mpl.ratio});\n", + " }\n", + " fig.send_message(\"refresh\", {});\n", + " }\n", + "\n", + " this.imageObj.onload = function() {\n", + " if (fig.image_mode == 'full') {\n", + " // Full images could contain transparency (where diff images\n", + " // almost always do), so we need to clear the canvas so that\n", + " // there is no ghosting.\n", + " fig.context.clearRect(0, 0, fig.canvas.width, fig.canvas.height);\n", + " }\n", + " fig.context.drawImage(fig.imageObj, 0, 0);\n", + " };\n", + "\n", + " this.imageObj.onunload = function() {\n", + " this.ws.close();\n", + " }\n", + "\n", + " this.ws.onmessage = this._make_on_message_function(this);\n", + "\n", + " this.ondownload = ondownload;\n", + "}\n", + "\n", + "mpl.figure.prototype._init_header = function() {\n", + " var titlebar = $(\n", + " '
');\n", + " var titletext = $(\n", + " '
');\n", + " titlebar.append(titletext)\n", + " this.root.append(titlebar);\n", + " this.header = titletext[0];\n", + "}\n", + "\n", + "\n", + "\n", + "mpl.figure.prototype._canvas_extra_style = function(canvas_div) {\n", + "\n", + "}\n", + "\n", + "\n", + "mpl.figure.prototype._root_extra_style = function(canvas_div) {\n", + "\n", + "}\n", + "\n", + "mpl.figure.prototype._init_canvas = function() {\n", + " var fig = this;\n", + "\n", + " var canvas_div = $('
');\n", + "\n", + " canvas_div.attr('style', 'position: relative; clear: both; outline: 0');\n", + "\n", + " function canvas_keyboard_event(event) {\n", + " return fig.key_event(event, event['data']);\n", + " }\n", + "\n", + " canvas_div.keydown('key_press', canvas_keyboard_event);\n", + " canvas_div.keyup('key_release', canvas_keyboard_event);\n", + " this.canvas_div = canvas_div\n", + " this._canvas_extra_style(canvas_div)\n", + " this.root.append(canvas_div);\n", + "\n", + " var canvas = $('');\n", + " canvas.addClass('mpl-canvas');\n", + " canvas.attr('style', \"left: 0; top: 0; z-index: 0; outline: 0\")\n", + "\n", + " this.canvas = canvas[0];\n", + " this.context = canvas[0].getContext(\"2d\");\n", + "\n", + " var backingStore = this.context.backingStorePixelRatio ||\n", + "\tthis.context.webkitBackingStorePixelRatio ||\n", + "\tthis.context.mozBackingStorePixelRatio ||\n", + "\tthis.context.msBackingStorePixelRatio ||\n", + "\tthis.context.oBackingStorePixelRatio ||\n", + "\tthis.context.backingStorePixelRatio || 1;\n", + "\n", + " mpl.ratio = (window.devicePixelRatio || 1) / backingStore;\n", + "\n", + " var rubberband = $('');\n", + " rubberband.attr('style', \"position: absolute; left: 0; top: 0; z-index: 1;\")\n", + "\n", + " var pass_mouse_events = true;\n", + "\n", + " canvas_div.resizable({\n", + " start: function(event, ui) {\n", + " pass_mouse_events = false;\n", + " },\n", + " resize: function(event, ui) {\n", + " fig.request_resize(ui.size.width, ui.size.height);\n", + " },\n", + " stop: function(event, ui) {\n", + " pass_mouse_events = true;\n", + " fig.request_resize(ui.size.width, ui.size.height);\n", + " },\n", + " });\n", + "\n", + " function mouse_event_fn(event) {\n", + " if (pass_mouse_events)\n", + " return fig.mouse_event(event, event['data']);\n", + " }\n", + "\n", + " rubberband.mousedown('button_press', mouse_event_fn);\n", + " rubberband.mouseup('button_release', mouse_event_fn);\n", + " // Throttle sequential mouse events to 1 every 20ms.\n", + " rubberband.mousemove('motion_notify', mouse_event_fn);\n", + "\n", + " rubberband.mouseenter('figure_enter', mouse_event_fn);\n", + " rubberband.mouseleave('figure_leave', mouse_event_fn);\n", + "\n", + " canvas_div.on(\"wheel\", function (event) {\n", + " event = event.originalEvent;\n", + " event['data'] = 'scroll'\n", + " if (event.deltaY < 0) {\n", + " event.step = 1;\n", + " } else {\n", + " event.step = -1;\n", + " }\n", + " mouse_event_fn(event);\n", + " });\n", + "\n", + " canvas_div.append(canvas);\n", + " canvas_div.append(rubberband);\n", + "\n", + " this.rubberband = rubberband;\n", + " this.rubberband_canvas = rubberband[0];\n", + " this.rubberband_context = rubberband[0].getContext(\"2d\");\n", + " this.rubberband_context.strokeStyle = \"#000000\";\n", + "\n", + " this._resize_canvas = function(width, height) {\n", + " // Keep the size of the canvas, canvas container, and rubber band\n", + " // canvas in synch.\n", + " canvas_div.css('width', width)\n", + " canvas_div.css('height', height)\n", + "\n", + " canvas.attr('width', width * mpl.ratio);\n", + " canvas.attr('height', height * mpl.ratio);\n", + " canvas.attr('style', 'width: ' + width + 'px; height: ' + height + 'px;');\n", + "\n", + " rubberband.attr('width', width);\n", + " rubberband.attr('height', height);\n", + " }\n", + "\n", + " // Set the figure to an initial 600x600px, this will subsequently be updated\n", + " // upon first draw.\n", + " this._resize_canvas(600, 600);\n", + "\n", + " // Disable right mouse context menu.\n", + " $(this.rubberband_canvas).bind(\"contextmenu\",function(e){\n", + " return false;\n", + " });\n", + "\n", + " function set_focus () {\n", + " canvas.focus();\n", + " canvas_div.focus();\n", + " }\n", + "\n", + " window.setTimeout(set_focus, 100);\n", + "}\n", + "\n", + "mpl.figure.prototype._init_toolbar = function() {\n", + " var fig = this;\n", + "\n", + " var nav_element = $('
')\n", + " nav_element.attr('style', 'width: 100%');\n", + " this.root.append(nav_element);\n", + "\n", + " // Define a callback function for later on.\n", + " function toolbar_event(event) {\n", + " return fig.toolbar_button_onclick(event['data']);\n", + " }\n", + " function toolbar_mouse_event(event) {\n", + " return fig.toolbar_button_onmouseover(event['data']);\n", + " }\n", + "\n", + " for(var toolbar_ind in mpl.toolbar_items) {\n", + " var name = mpl.toolbar_items[toolbar_ind][0];\n", + " var tooltip = mpl.toolbar_items[toolbar_ind][1];\n", + " var image = mpl.toolbar_items[toolbar_ind][2];\n", + " var method_name = mpl.toolbar_items[toolbar_ind][3];\n", + "\n", + " if (!name) {\n", + " // put a spacer in here.\n", + " continue;\n", + " }\n", + " var button = $('');\n", + " button.click(method_name, toolbar_event);\n", + " button.mouseover(tooltip, toolbar_mouse_event);\n", + " nav_element.append(button);\n", + " }\n", + "\n", + " // Add the status bar.\n", + " var status_bar = $('');\n", + " nav_element.append(status_bar);\n", + " this.message = status_bar[0];\n", + "\n", + " // Add the close button to the window.\n", + " var buttongrp = $('
');\n", + " var button = $('');\n", + " button.click(function (evt) { fig.handle_close(fig, {}); } );\n", + " button.mouseover('Stop Interaction', toolbar_mouse_event);\n", + " buttongrp.append(button);\n", + " var titlebar = this.root.find($('.ui-dialog-titlebar'));\n", + " titlebar.prepend(buttongrp);\n", + "}\n", + "\n", + "mpl.figure.prototype._root_extra_style = function(el){\n", + " var fig = this\n", + " el.on(\"remove\", function(){\n", + "\tfig.close_ws(fig, {});\n", + " });\n", + "}\n", + "\n", + "mpl.figure.prototype._canvas_extra_style = function(el){\n", + " // this is important to make the div 'focusable\n", + " el.attr('tabindex', 0)\n", + " // reach out to IPython and tell the keyboard manager to turn it's self\n", + " // off when our div gets focus\n", + "\n", + " // location in version 3\n", + " if (IPython.notebook.keyboard_manager) {\n", + " IPython.notebook.keyboard_manager.register_events(el);\n", + " }\n", + " else {\n", + " // location in version 2\n", + " IPython.keyboard_manager.register_events(el);\n", + " }\n", + "\n", + "}\n", + "\n", + "mpl.figure.prototype._key_event_extra = function(event, name) {\n", + " var manager = IPython.notebook.keyboard_manager;\n", + " if (!manager)\n", + " manager = IPython.keyboard_manager;\n", + "\n", + " // Check for shift+enter\n", + " if (event.shiftKey && event.which == 13) {\n", + " this.canvas_div.blur();\n", + " // select the cell after this one\n", + " var index = IPython.notebook.find_cell_index(this.cell_info[0]);\n", + " IPython.notebook.select(index + 1);\n", + " }\n", + "}\n", + "\n", + "mpl.figure.prototype.handle_save = function(fig, msg) {\n", + " fig.ondownload(fig, null);\n", + "}\n", + "\n", + "\n", + "mpl.find_output_cell = function(html_output) {\n", + " // Return the cell and output element which can be found *uniquely* in the notebook.\n", + " // Note - this is a bit hacky, but it is done because the \"notebook_saving.Notebook\"\n", + " // IPython event is triggered only after the cells have been serialised, which for\n", + " // our purposes (turning an active figure into a static one), is too late.\n", + " var cells = IPython.notebook.get_cells();\n", + " var ncells = cells.length;\n", + " for (var i=0; i= 3 moved mimebundle to data attribute of output\n", + " data = data.data;\n", + " }\n", + " if (data['text/html'] == html_output) {\n", + " return [cell, data, j];\n", + " }\n", + " }\n", + " }\n", + " }\n", + "}\n", + "\n", + "// Register the function which deals with the matplotlib target/channel.\n", + "// The kernel may be null if the page has been refreshed.\n", + "if (IPython.notebook.kernel != null) {\n", + " IPython.notebook.kernel.comm_manager.register_target('matplotlib', mpl.mpl_figure_comm);\n", + "}\n" + ], + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "text/html": [ + "" + ], + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Saving figure to file chap10-fig03.pdf\n" + ] + } + ], + "source": [ + "newfig()\n", + "plot(sweep)\n", + "decorate(xlabel='Launch angle (degree)',\n", + " ylabel='Range (m)',\n", + " legend=False)\n", + "\n", + "savefig('chap10-fig03.pdf')" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "We can use `max_bounded` to search for the peak efficiently." + ] + }, + { + "cell_type": "code", + "execution_count": 51, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "45.0\n", + "34.3769410125\n", + "55.6230589875\n", + "21.246117975\n", + "41.8191039876\n", + "41.6971472537\n", + "41.6051027031\n", + "41.6031028639\n", + "41.6034368143\n", + "41.6027689135\n", + "Wall time: 4.36 s\n" + ] + } + ], + "source": [ + "%time res = max_bounded(range_func, [0, 90], condition)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "The result is an `OptimizeResult` object." + ] + }, + { + "cell_type": "code", + "execution_count": 52, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "scipy.optimize.optimize.OptimizeResult" + ] + }, + "execution_count": 52, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "type(res)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "With the following variables." + ] + }, + { + "cell_type": "code", + "execution_count": 53, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + " fun: 109.69517452156008\n", + " message: 'Solution found.'\n", + " nfev: 9\n", + " status: 0\n", + " success: True\n", + " x: 41.603102863878036" + ] + }, + "execution_count": 53, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "res" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "So the optimal angle is about 41 degrees, and the resulting range is 103 meters." + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "**Exercise:** Add a print statement to `range_func` that prints `angle`. Then run `max_bounded` again so you can see how many times it calls `range_func` and what the arguments are." + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### Turning off units\n", + "\n", + "Each time `range_func` runs, it calls `odeint`, which runs `slope_func` many times. And each time `slop_func` runs, it checks the units for all computations, which takes some time. We can speed up the whole process by removing the units from the computation (now that we are satisfied that they are correct).\n", + "\n", + "Because of the way we organized the code, all units are in the `Condition` object, so we can \"turn off units\" by defining a new `Condition` object with no units:" + ] + }, + { + "cell_type": "code", + "execution_count": 54, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [ + "condition = Condition(g = 9.8,\n", + " mass = 145e-3,\n", + " diameter = 73e-3,\n", + " rho = 1.2,\n", + " C_d = 0.3,\n", + " angle = 45,\n", + " velocity = 40,\n", + " duration = 7)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Now `range_func` and `max_bounded` are substantially faster." + ] + }, + { + "cell_type": "code", + "execution_count": 55, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "45\n", + "Wall time: 83.2 ms\n" + ] + }, + { + "data": { + "text/plain": [ + "array(102.72237841710975)" + ] + }, + "execution_count": 55, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "%time range_func(45, condition)" + ] + }, + { + "cell_type": "code", + "execution_count": 56, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "45.0\n", + "34.3769410125\n", + "55.6230589875\n", + "21.246117975\n", + "41.4051852323\n", + "41.2368620421\n", + "41.1390964616\n", + "41.1364127407\n", + "41.1367466842\n", + "41.1360787972\n", + "Wall time: 615 ms\n" + ] + } + ], + "source": [ + "%time res = max_bounded(range_func, [0, 90], condition)" + ] + }, + { + "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 launches 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 condition 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": 83, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [ + "def height_func2(angle, condition):\n", + " condition.set(angle = angle)\n", + " system = make_system(condition)\n", + " run_odeint(system, slope_func)\n", + " \n", + " height_time = interp_inverse(system.results.x)\n", + " ### WHAT DOES THIS EVEN MEEEAN\n", + " t_wall = height_time(94.5)\n", + " \n", + " height = interpolate(system.results.y)\n", + " return height(t_wall)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Test your function with a launch angle of 45 degrees:" + ] + }, + { + "cell_type": "code", + "execution_count": 84, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "array(11.025366370142653)" + ] + }, + "execution_count": 84, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "height_func2(45, condition)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Now use `max_bounded` to find the optimal angle. Is it higher or lower than the angle that maximizes range?" + ] + }, + { + "cell_type": "code", + "execution_count": 85, + "metadata": {}, + "outputs": [], + "source": [ + "# Solution goes here\n", + "res = max_bounded(height_func2, [0,90], condition)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "The following lines compute the height of the ball at the wall, given that it's launched at the optimal angle." + ] + }, + { + "cell_type": "code", + "execution_count": 86, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "array(11.045254540088495)" + ] + }, + "execution_count": 86, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "angle = res.x\n", + "height = height_func2(angle, condition)\n", + "height" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Next, we need to find the height of the ball at the wall, for a given velocity, given that it's launched at the optimal angle.\n", + "\n", + "Write a function called `best_height` that takes velocity and a `Condition` object as parameters. It should use `max_bounded` to find the optimal launch angle, then compute and the highest possible height of the ball at the wall, for the given velocity." + ] + }, + { + "cell_type": "code", + "execution_count": 102, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [ + "# Solution goes here\n", + "def best_height(velocity, condition):\n", + " opt = max_bounded(height_func2, [0,90], condition)\n", + " \n", + " # y_vel = sin(opt.x) * velocity\n", + " # y_max = -(y_vel**2) / 19.6\n", + " \n", + " y_max = height_func2(opt.x, condition)\n", + " return y_max" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Use this code to test `best_height`" + ] + }, + { + "cell_type": "code", + "execution_count": 103, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "array(11.045254540088495)" + ] + }, + "execution_count": 103, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "best_height(40, condition)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Finally, we want to use `fsolve` to find the initial velocity that makes the height of the ball exactly 11 meters when it reaches the wall.\n", + "\n", + "To use `fsolve`, we need an error function that returns 0 when we have the right velocity. Write a function called `error_func` that takes a velocity and a `Condition` object, uses `best_height` to find the height of the ball at the wall, and returns the difference between the result and the target value (11 meters)." + ] + }, + { + "cell_type": "code", + "execution_count": 104, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [ + "# Solution goes here\n", + "def error_func(velocity, condition):\n", + " best = best_height(velocity, condition)\n", + " return abs(best-11)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Test your error function like this:" + ] + }, + { + "cell_type": "code", + "execution_count": 112, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "0.045254540088494721" + ] + }, + "execution_count": 112, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "error_func(40, condition)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Then use `fsolve` to find the answer to the problem, the minimum velocity that gets the ball out of the park." + ] + }, + { + "cell_type": "code", + "execution_count": 120, + "metadata": {}, + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "C:\\ProgramData\\Miniconda3\\lib\\site-packages\\scipy\\optimize\\minpack.py:161: RuntimeWarning: The iteration is not making good progress, as measured by the \n", + " improvement from the last ten iterations.\n", + " warnings.warn(msg, RuntimeWarning)\n" + ] + } + ], + "source": [ + "# Solution goes here\n", + "min_velocity = fsolve(error_func, 40, condition)" + ] + }, + { + "cell_type": "code", + "execution_count": 121, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "array([ 40.])" + ] + }, + "execution_count": 121, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "# Solution goes here\n", + "min_velocity" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "And just to check, run `best_height` with the value you found. The result should be 11 meters." + ] + }, + { + "cell_type": "code", + "execution_count": 122, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "array(11.045254540088495)" + ] + }, + "execution_count": 122, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "best_height(min_velocity, condition)" + ] + }, + { + "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/code/chap10soln.ipynb b/code/chap10soln.ipynb index 09b302ad..3ec8b45b 100644 --- a/code/chap10soln.ipynb +++ b/code/chap10soln.ipynb @@ -15,7 +15,7 @@ }, { "cell_type": "code", - "execution_count": 1, + "execution_count": 3, "metadata": { "collapsed": true }, @@ -57,7 +57,7 @@ }, { "cell_type": "code", - "execution_count": 2, + "execution_count": 4, "metadata": { "collapsed": true }, @@ -77,7 +77,7 @@ }, { "cell_type": "code", - "execution_count": 3, + "execution_count": 5, "metadata": { "collapsed": true }, @@ -95,7 +95,7 @@ }, { "cell_type": "code", - "execution_count": 4, + "execution_count": 6, "metadata": {}, "outputs": [ { @@ -110,7 +110,7 @@ "" ] }, - "execution_count": 4, + "execution_count": 6, "metadata": {}, "output_type": "execute_result" } @@ -121,7 +121,7 @@ }, { "cell_type": "code", - "execution_count": 5, + "execution_count": 7, "metadata": {}, "outputs": [ { @@ -136,7 +136,7 @@ "" ] }, - "execution_count": 5, + "execution_count": 7, "metadata": {}, "output_type": "execute_result" } @@ -154,7 +154,7 @@ }, { "cell_type": "code", - "execution_count": 6, + "execution_count": 8, "metadata": {}, "outputs": [ { @@ -169,7 +169,7 @@ "" ] }, - "execution_count": 6, + "execution_count": 8, "metadata": {}, "output_type": "execute_result" } @@ -187,7 +187,7 @@ }, { "cell_type": "code", - "execution_count": 7, + "execution_count": 9, "metadata": {}, "outputs": [ { @@ -202,7 +202,7 @@ "" ] }, - "execution_count": 7, + "execution_count": 9, "metadata": {}, "output_type": "execute_result" } @@ -220,7 +220,7 @@ }, { "cell_type": "code", - "execution_count": 8, + "execution_count": 10, "metadata": { "collapsed": true }, @@ -238,7 +238,7 @@ }, { "cell_type": "code", - "execution_count": 9, + "execution_count": 11, "metadata": {}, "outputs": [ { @@ -253,7 +253,7 @@ "" ] }, - "execution_count": 9, + "execution_count": 11, "metadata": {}, "output_type": "execute_result" } @@ -271,7 +271,7 @@ }, { "cell_type": "code", - "execution_count": 10, + "execution_count": 12, "metadata": {}, "outputs": [ { @@ -286,7 +286,7 @@ "" ] }, - "execution_count": 10, + "execution_count": 12, "metadata": {}, "output_type": "execute_result" } @@ -304,7 +304,7 @@ }, { "cell_type": "code", - "execution_count": 11, + "execution_count": 13, "metadata": {}, "outputs": [ { @@ -319,7 +319,7 @@ "" ] }, - "execution_count": 11, + "execution_count": 13, "metadata": {}, "output_type": "execute_result" } @@ -337,7 +337,7 @@ }, { "cell_type": "code", - "execution_count": 12, + "execution_count": 14, "metadata": {}, "outputs": [ { @@ -352,7 +352,7 @@ "" ] }, - "execution_count": 12, + "execution_count": 14, "metadata": {}, "output_type": "execute_result" } @@ -370,7 +370,7 @@ }, { "cell_type": "code", - "execution_count": 13, + "execution_count": 15, "metadata": { "collapsed": true }, @@ -391,7 +391,7 @@ }, { "cell_type": "code", - "execution_count": 14, + "execution_count": 16, "metadata": {}, "outputs": [ { @@ -406,7 +406,7 @@ "" ] }, - "execution_count": 14, + "execution_count": 16, "metadata": {}, "output_type": "execute_result" } @@ -425,7 +425,7 @@ }, { "cell_type": "code", - "execution_count": 15, + "execution_count": 17, "metadata": {}, "outputs": [ { @@ -440,7 +440,7 @@ "" ] }, - "execution_count": 15, + "execution_count": 17, "metadata": {}, "output_type": "execute_result" } @@ -463,7 +463,7 @@ }, { "cell_type": "code", - "execution_count": 16, + "execution_count": 18, "metadata": { "collapsed": true }, @@ -482,7 +482,7 @@ }, { "cell_type": "code", - "execution_count": 17, + "execution_count": 19, "metadata": {}, "outputs": [ { @@ -497,7 +497,7 @@ "" ] }, - "execution_count": 17, + "execution_count": 19, "metadata": {}, "output_type": "execute_result" } @@ -516,7 +516,7 @@ }, { "cell_type": "code", - "execution_count": 18, + "execution_count": 20, "metadata": {}, "outputs": [ { @@ -531,7 +531,7 @@ "" ] }, - "execution_count": 18, + "execution_count": 20, "metadata": {}, "output_type": "execute_result" } @@ -550,7 +550,7 @@ }, { "cell_type": "code", - "execution_count": 19, + "execution_count": 21, "metadata": {}, "outputs": [ { @@ -565,7 +565,7 @@ "" ] }, - "execution_count": 19, + "execution_count": 21, "metadata": {}, "output_type": "execute_result" } @@ -583,7 +583,7 @@ }, { "cell_type": "code", - "execution_count": 20, + "execution_count": 22, "metadata": {}, "outputs": [ { @@ -598,7 +598,7 @@ "" ] }, - "execution_count": 20, + "execution_count": 22, "metadata": {}, "output_type": "execute_result" } @@ -616,7 +616,7 @@ }, { "cell_type": "code", - "execution_count": 21, + "execution_count": 23, "metadata": {}, "outputs": [ { @@ -631,7 +631,7 @@ "" ] }, - "execution_count": 21, + "execution_count": 23, "metadata": {}, "output_type": "execute_result" } @@ -651,7 +651,7 @@ }, { "cell_type": "code", - "execution_count": 22, + "execution_count": 24, "metadata": {}, "outputs": [ { @@ -666,7 +666,7 @@ "" ] }, - "execution_count": 22, + "execution_count": 24, "metadata": {}, "output_type": "execute_result" } @@ -687,7 +687,7 @@ }, { "cell_type": "code", - "execution_count": 23, + "execution_count": 25, "metadata": {}, "outputs": [ { @@ -702,7 +702,7 @@ "" ] }, - "execution_count": 23, + "execution_count": 25, "metadata": {}, "output_type": "execute_result" } @@ -729,7 +729,7 @@ }, { "cell_type": "code", - "execution_count": 24, + "execution_count": 26, "metadata": { "collapsed": true }, @@ -756,7 +756,7 @@ }, { "cell_type": "code", - "execution_count": 25, + "execution_count": 27, "metadata": { "collapsed": true }, @@ -800,7 +800,7 @@ }, { "cell_type": "code", - "execution_count": 26, + "execution_count": 28, "metadata": {}, "outputs": [ { @@ -873,7 +873,7 @@ "dtype: object" ] }, - "execution_count": 26, + "execution_count": 28, "metadata": {}, "output_type": "execute_result" } @@ -892,7 +892,7 @@ }, { "cell_type": "code", - "execution_count": 27, + "execution_count": 29, "metadata": { "collapsed": true }, @@ -931,19 +931,19 @@ }, { "cell_type": "code", - "execution_count": 28, + "execution_count": 30, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "(,\n", - " ,\n", + " ,\n", " ,\n", - " )" + " )" ] }, - "execution_count": 28, + "execution_count": 30, "metadata": {}, "output_type": "execute_result" } @@ -961,7 +961,7 @@ }, { "cell_type": "code", - "execution_count": 29, + "execution_count": 31, "metadata": { "collapsed": true }, @@ -979,7 +979,7 @@ }, { "cell_type": "code", - "execution_count": 30, + "execution_count": 32, "metadata": {}, "outputs": [ { @@ -1058,7 +1058,7 @@ "0.204 5.652384 6.451211 27.153433 25.193958" ] }, - "execution_count": 30, + "execution_count": 32, "metadata": {}, "output_type": "execute_result" } @@ -1076,7 +1076,7 @@ }, { "cell_type": "code", - "execution_count": 31, + "execution_count": 33, "metadata": {}, "outputs": [ { @@ -1155,7 +1155,7 @@ "5.100 103.319572 -0.913800 14.714856 -22.714157" ] }, - "execution_count": 31, + "execution_count": 33, "metadata": {}, "output_type": "execute_result" } @@ -1175,7 +1175,7 @@ }, { "cell_type": "code", - "execution_count": 32, + "execution_count": 34, "metadata": { "collapsed": true }, @@ -1194,7 +1194,7 @@ }, { "cell_type": "code", - "execution_count": 33, + "execution_count": 35, "metadata": {}, "outputs": [ { @@ -1756,7 +1756,7 @@ "};\n", "mpl.toolbar_items = [[\"Home\", \"Reset original view\", \"fa fa-home icon-home\", \"home\"], [\"Back\", \"Back to previous view\", \"fa fa-arrow-left icon-arrow-left\", \"back\"], [\"Forward\", \"Forward to next view\", \"fa fa-arrow-right icon-arrow-right\", \"forward\"], [\"\", \"\", \"\", \"\"], [\"Pan\", \"Pan axes with left mouse, zoom with right\", \"fa fa-arrows icon-move\", \"pan\"], [\"Zoom\", \"Zoom to rectangle\", \"fa fa-square-o icon-check-empty\", \"zoom\"], [\"\", \"\", \"\", \"\"], [\"Download\", \"Download plot\", \"fa fa-floppy-o icon-save\", \"download\"]];\n", "\n", - "mpl.extensions = [\"eps\", \"jpeg\", \"pdf\", \"png\", \"ps\", \"raw\", \"svg\", \"tif\"];\n", + "mpl.extensions = [\"eps\", \"pdf\", \"png\", \"ps\", \"raw\", \"svg\"];\n", "\n", "mpl.default_extension = \"png\";var comm_websocket_adapter = function(comm) {\n", " // Create a \"websocket\"-like object which calls the given IPython comm\n", @@ -1977,7 +1977,7 @@ { "data": { "text/html": [ - "" + "" ], "text/plain": [ "" @@ -2014,7 +2014,7 @@ }, { "cell_type": "code", - "execution_count": 34, + "execution_count": 36, "metadata": { "collapsed": true }, @@ -2033,7 +2033,7 @@ }, { "cell_type": "code", - "execution_count": 35, + "execution_count": 37, "metadata": {}, "outputs": [ { @@ -2595,7 +2595,7 @@ "};\n", "mpl.toolbar_items = [[\"Home\", \"Reset original view\", \"fa fa-home icon-home\", \"home\"], [\"Back\", \"Back to previous view\", \"fa fa-arrow-left icon-arrow-left\", \"back\"], [\"Forward\", \"Forward to next view\", \"fa fa-arrow-right icon-arrow-right\", \"forward\"], [\"\", \"\", \"\", \"\"], [\"Pan\", \"Pan axes with left mouse, zoom with right\", \"fa fa-arrows icon-move\", \"pan\"], [\"Zoom\", \"Zoom to rectangle\", \"fa fa-square-o icon-check-empty\", \"zoom\"], [\"\", \"\", \"\", \"\"], [\"Download\", \"Download plot\", \"fa fa-floppy-o icon-save\", \"download\"]];\n", "\n", - "mpl.extensions = [\"eps\", \"jpeg\", \"pdf\", \"png\", \"ps\", \"raw\", \"svg\", \"tif\"];\n", + "mpl.extensions = [\"eps\", \"pdf\", \"png\", \"ps\", \"raw\", \"svg\"];\n", "\n", "mpl.default_extension = \"png\";var comm_websocket_adapter = function(comm) {\n", " // Create a \"websocket\"-like object which calls the given IPython comm\n", @@ -2816,7 +2816,7 @@ { "data": { "text/html": [ - "" + "" ], "text/plain": [ "" @@ -2844,7 +2844,7 @@ }, { "cell_type": "code", - "execution_count": 36, + "execution_count": 38, "metadata": {}, "outputs": [ { @@ -3406,7 +3406,7 @@ "};\n", "mpl.toolbar_items = [[\"Home\", \"Reset original view\", \"fa fa-home icon-home\", \"home\"], [\"Back\", \"Back to previous view\", \"fa fa-arrow-left icon-arrow-left\", \"back\"], [\"Forward\", \"Forward to next view\", \"fa fa-arrow-right icon-arrow-right\", \"forward\"], [\"\", \"\", \"\", \"\"], [\"Pan\", \"Pan axes with left mouse, zoom with right\", \"fa fa-arrows icon-move\", \"pan\"], [\"Zoom\", \"Zoom to rectangle\", \"fa fa-square-o icon-check-empty\", \"zoom\"], [\"\", \"\", \"\", \"\"], [\"Download\", \"Download plot\", \"fa fa-floppy-o icon-save\", \"download\"]];\n", "\n", - "mpl.extensions = [\"eps\", \"jpeg\", \"pdf\", \"png\", \"ps\", \"raw\", \"svg\", \"tif\"];\n", + "mpl.extensions = [\"eps\", \"pdf\", \"png\", \"ps\", \"raw\", \"svg\"];\n", "\n", "mpl.default_extension = \"png\";var comm_websocket_adapter = function(comm) {\n", " // Create a \"websocket\"-like object which calls the given IPython comm\n", @@ -3627,7 +3627,7 @@ { "data": { "text/html": [ - "" + "" ], "text/plain": [ "" @@ -3663,7 +3663,7 @@ }, { "cell_type": "code", - "execution_count": 37, + "execution_count": 39, "metadata": { "scrolled": false }, @@ -4227,7 +4227,7 @@ "};\n", "mpl.toolbar_items = [[\"Home\", \"Reset original view\", \"fa fa-home icon-home\", \"home\"], [\"Back\", \"Back to previous view\", \"fa fa-arrow-left icon-arrow-left\", \"back\"], [\"Forward\", \"Forward to next view\", \"fa fa-arrow-right icon-arrow-right\", \"forward\"], [\"\", \"\", \"\", \"\"], [\"Pan\", \"Pan axes with left mouse, zoom with right\", \"fa fa-arrows icon-move\", \"pan\"], [\"Zoom\", \"Zoom to rectangle\", \"fa fa-square-o icon-check-empty\", \"zoom\"], [\"\", \"\", \"\", \"\"], [\"Download\", \"Download plot\", \"fa fa-floppy-o icon-save\", \"download\"]];\n", "\n", - "mpl.extensions = [\"eps\", \"jpeg\", \"pdf\", \"png\", \"ps\", \"raw\", \"svg\", \"tif\"];\n", + "mpl.extensions = [\"eps\", \"pdf\", \"png\", \"ps\", \"raw\", \"svg\"];\n", "\n", "mpl.default_extension = \"png\";var comm_websocket_adapter = function(comm) {\n", " // Create a \"websocket\"-like object which calls the given IPython comm\n", @@ -4448,7 +4448,7 @@ { "data": { "text/html": [ - "" + "" ], "text/plain": [ "" @@ -4480,7 +4480,7 @@ }, { "cell_type": "code", - "execution_count": 38, + "execution_count": 40, "metadata": { "collapsed": true }, @@ -4515,7 +4515,7 @@ }, { "cell_type": "code", - "execution_count": 39, + "execution_count": 41, "metadata": { "scrolled": false }, @@ -5079,7 +5079,7 @@ "};\n", "mpl.toolbar_items = [[\"Home\", \"Reset original view\", \"fa fa-home icon-home\", \"home\"], [\"Back\", \"Back to previous view\", \"fa fa-arrow-left icon-arrow-left\", \"back\"], [\"Forward\", \"Forward to next view\", \"fa fa-arrow-right icon-arrow-right\", \"forward\"], [\"\", \"\", \"\", \"\"], [\"Pan\", \"Pan axes with left mouse, zoom with right\", \"fa fa-arrows icon-move\", \"pan\"], [\"Zoom\", \"Zoom to rectangle\", \"fa fa-square-o icon-check-empty\", \"zoom\"], [\"\", \"\", \"\", \"\"], [\"Download\", \"Download plot\", \"fa fa-floppy-o icon-save\", \"download\"]];\n", "\n", - "mpl.extensions = [\"eps\", \"jpeg\", \"pdf\", \"png\", \"ps\", \"raw\", \"svg\", \"tif\"];\n", + "mpl.extensions = [\"eps\", \"pdf\", \"png\", \"ps\", \"raw\", \"svg\"];\n", "\n", "mpl.default_extension = \"png\";var comm_websocket_adapter = function(comm) {\n", " // Create a \"websocket\"-like object which calls the given IPython comm\n", @@ -5300,7 +5300,7 @@ { "data": { "text/html": [ - "" + "" ], "text/plain": [ "" @@ -5337,7 +5337,7 @@ }, { "cell_type": "code", - "execution_count": 40, + "execution_count": 42, "metadata": { "collapsed": true }, @@ -5357,7 +5357,7 @@ }, { "cell_type": "code", - "execution_count": 41, + "execution_count": 43, "metadata": { "collapsed": true }, @@ -5398,16 +5398,16 @@ }, { "cell_type": "code", - "execution_count": 42, + "execution_count": 44, "metadata": {}, "outputs": [ { "data": { "text/plain": [ - "array(102.72237841710873)" + "array(102.72237841710975)" ] }, - "execution_count": 42, + "execution_count": 44, "metadata": {}, "output_type": "execute_result" } @@ -5425,20 +5425,9 @@ }, { "cell_type": "code", - "execution_count": 46, + "execution_count": 45, "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "modsim.Condition" - ] - }, - "execution_count": 46, - "metadata": {}, - "output_type": "execute_result" - } - ], + "outputs": [], "source": [ "# Hint: rather than modify `condition`, make a copy\n", "\n", @@ -5447,16 +5436,16 @@ }, { "cell_type": "code", - "execution_count": 47, + "execution_count": 46, "metadata": {}, "outputs": [ { "data": { "text/plain": [ - "array(109.07212101030471)" + "array(109.07212101030548)" ] }, - "execution_count": 47, + "execution_count": 46, "metadata": {}, "output_type": "execute_result" } @@ -5481,7 +5470,7 @@ }, { "cell_type": "code", - "execution_count": 48, + "execution_count": 47, "metadata": { "collapsed": true }, @@ -5511,24 +5500,23 @@ }, { "cell_type": "code", - "execution_count": 49, + "execution_count": 48, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ - "CPU times: user 512 ms, sys: 0 ns, total: 512 ms\n", - "Wall time: 498 ms\n" + "Wall time: 289 ms\n" ] }, { "data": { "text/plain": [ - "array(109.07212101030471)" + "array(109.07212101030548)" ] }, - "execution_count": 49, + "execution_count": 48, "metadata": {}, "output_type": "execute_result" } @@ -5546,23 +5534,23 @@ }, { "cell_type": "code", - "execution_count": 51, + "execution_count": 49, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ - "30.0 102.2251288061195\n", + "30.0 102.22512880611951\n", "33.0 105.61073422582602\n", "36.0 107.97200490961362\n", "39.0 109.32525682573122\n", - "42.0 109.6866222500251\n", - "45.0 109.07212101030471\n", - "48.0 107.49791212235655\n", + "42.0 109.68662225002511\n", + "45.0 109.07212101030548\n", + "48.0 107.49791212235652\n", "51.0 104.98068732786591\n", "54.0 101.53816371252147\n", - "57.0 97.18969823610271\n", + "57.0 97.1896982361027\n", "60.0 91.95703077946803\n" ] } @@ -5586,7 +5574,7 @@ }, { "cell_type": "code", - "execution_count": 52, + "execution_count": 50, "metadata": {}, "outputs": [ { @@ -6148,7 +6136,7 @@ "};\n", "mpl.toolbar_items = [[\"Home\", \"Reset original view\", \"fa fa-home icon-home\", \"home\"], [\"Back\", \"Back to previous view\", \"fa fa-arrow-left icon-arrow-left\", \"back\"], [\"Forward\", \"Forward to next view\", \"fa fa-arrow-right icon-arrow-right\", \"forward\"], [\"\", \"\", \"\", \"\"], [\"Pan\", \"Pan axes with left mouse, zoom with right\", \"fa fa-arrows icon-move\", \"pan\"], [\"Zoom\", \"Zoom to rectangle\", \"fa fa-square-o icon-check-empty\", \"zoom\"], [\"\", \"\", \"\", \"\"], [\"Download\", \"Download plot\", \"fa fa-floppy-o icon-save\", \"download\"]];\n", "\n", - "mpl.extensions = [\"eps\", \"jpeg\", \"pdf\", \"png\", \"ps\", \"raw\", \"svg\", \"tif\"];\n", + "mpl.extensions = [\"eps\", \"pdf\", \"png\", \"ps\", \"raw\", \"svg\"];\n", "\n", "mpl.default_extension = \"png\";var comm_websocket_adapter = function(comm) {\n", " // Create a \"websocket\"-like object which calls the given IPython comm\n", @@ -6369,7 +6357,7 @@ { "data": { "text/html": [ - "" + "" ], "text/plain": [ "" @@ -6405,15 +6393,14 @@ }, { "cell_type": "code", - "execution_count": 53, + "execution_count": 51, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ - "CPU times: user 4.64 s, sys: 8 ms, total: 4.65 s\n", - "Wall time: 4.62 s\n" + "Wall time: 3.4 s\n" ] } ], @@ -6430,7 +6417,7 @@ }, { "cell_type": "code", - "execution_count": 54, + "execution_count": 52, "metadata": {}, "outputs": [ { @@ -6439,7 +6426,7 @@ "scipy.optimize.optimize.OptimizeResult" ] }, - "execution_count": 54, + "execution_count": 52, "metadata": {}, "output_type": "execute_result" } @@ -6457,21 +6444,21 @@ }, { "cell_type": "code", - "execution_count": 55, + "execution_count": 53, "metadata": {}, "outputs": [ { "data": { "text/plain": [ - " fun: 109.69517452154857\n", + " fun: 109.69517452156008\n", " message: 'Solution found.'\n", " nfev: 9\n", " status: 0\n", " success: True\n", - " x: 41.603102862839918" + " x: 41.603102863878036" ] }, - "execution_count": 55, + "execution_count": 53, "metadata": {}, "output_type": "execute_result" } @@ -6507,7 +6494,7 @@ }, { "cell_type": "code", - "execution_count": 56, + "execution_count": 54, "metadata": { "collapsed": true }, @@ -6532,24 +6519,23 @@ }, { "cell_type": "code", - "execution_count": 57, + "execution_count": 55, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ - "CPU times: user 120 ms, sys: 0 ns, total: 120 ms\n", - "Wall time: 117 ms\n" + "Wall time: 58.2 ms\n" ] }, { "data": { "text/plain": [ - "array(102.72237841710873)" + "array(102.72237841710975)" ] }, - "execution_count": 57, + "execution_count": 55, "metadata": {}, "output_type": "execute_result" } @@ -6560,15 +6546,14 @@ }, { "cell_type": "code", - "execution_count": 58, + "execution_count": 56, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ - "CPU times: user 716 ms, sys: 8 ms, total: 724 ms\n", - "Wall time: 715 ms\n" + "Wall time: 513 ms\n" ] } ], @@ -6599,7 +6584,7 @@ }, { "cell_type": "code", - "execution_count": 59, + "execution_count": 57, "metadata": { "collapsed": true }, @@ -6637,7 +6622,7 @@ }, { "cell_type": "code", - "execution_count": 60, + "execution_count": 58, "metadata": {}, "outputs": [ { @@ -6650,10 +6635,10 @@ { "data": { "text/plain": [ - "array(11.025366370141436)" + "array(11.025366370142653)" ] }, - "execution_count": 60, + "execution_count": 58, "metadata": {}, "output_type": "execute_result" } diff --git a/code/chap11-fig01.pdf b/code/chap11-fig01.pdf new file mode 100644 index 00000000..c8a534c4 Binary files /dev/null and b/code/chap11-fig01.pdf differ diff --git a/code/chap11-fig02.pdf b/code/chap11-fig02.pdf new file mode 100644 index 00000000..f9f901c3 Binary files /dev/null and b/code/chap11-fig02.pdf differ diff --git a/code/chap11mine.ipynb b/code/chap11mine.ipynb new file mode 100644 index 00000000..55cdb7d3 --- /dev/null +++ b/code/chap11mine.ipynb @@ -0,0 +1,1988 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# Modeling and Simulation in Python\n", + "\n", + "Chapter 11: Rotation\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": 3, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [ + "# If you want the figures to appear in the notebook, \n", + "# and you want to interact with them, use\n", + "# %matplotlib notebook\n", + "\n", + "# If you want the figures to appear in the notebook, \n", + "# and you don't want to interact with them, use\n", + "# %matplotlib inline\n", + "\n", + "# If you want the figures to appear in separate windows, use\n", + "# %matplotlib qt5\n", + "\n", + "# tempo switch from one to another, you have to select Kernel->Restart\n", + "\n", + "%matplotlib inline\n", + "\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": 4, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [ + "radian = UNITS.radian\n", + "m = UNITS.meter\n", + "s = UNITS.second" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "And creating a `Condition` object with the system parameters" + ] + }, + { + "cell_type": "code", + "execution_count": 5, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [ + "condition = Condition(Rmin = 0.02 * m,\n", + " Rmax = 0.055 * m,\n", + " L = 47 * m,\n", + " duration = 130 * 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": 6, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [ + "def estimate_k(condition):\n", + " \"\"\"Estimates the parameter `k`.\n", + " \n", + " condition: Condition with Rmin, Rmax, and L\n", + " \n", + " returns: k in meters per radian\n", + " \"\"\"\n", + " unpack(condition)\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 `Condition` object and returns a `System` object." + ] + }, + { + "cell_type": "code", + "execution_count": 7, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [ + "def make_system(condition):\n", + " \"\"\"Make a system object.\n", + " \n", + " condition: Condition with Rmin, Rmax, and L\n", + " \n", + " returns: System with init, k, and ts\n", + " \"\"\"\n", + " unpack(condition)\n", + " \n", + " init = State(theta = 0 * radian,\n", + " y = 0 * m,\n", + " r = Rmin)\n", + " \n", + " k = estimate_k(condition)\n", + " ts = linspace(0, duration, 101)\n", + " \n", + " return System(init=init, k=k, ts=ts)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Testing `make_system`" + ] + }, + { + "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", + "
value
inittheta 0 radian\n", + "y 0 meter\n", + "r ...
k2.7925531914893616e-05 meter
ts[0.0 second, 1.3 second, 2.6 second, 3.9000000...
\n", + "
" + ], + "text/plain": [ + "init theta 0 radian\n", + "y 0 meter\n", + "r ...\n", + "k 2.7925531914893616e-05 meter\n", + "ts [0.0 second, 1.3 second, 2.6 second, 3.9000000...\n", + "dtype: object" + ] + }, + "execution_count": 8, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "system = make_system(condition)\n", + "system" + ] + }, + { + "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", + "
value
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": 9, + "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": 10, + "metadata": { + "collapsed": true + }, + "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", + " unpack(system)\n", + " \n", + " omega = 10 * radian / s\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": 11, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "(,\n", + " ,\n", + " )" + ] + }, + "execution_count": 11, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "slope_func(system.init, 0*s, system)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Now we can run the simulation." + ] + }, + { + "cell_type": "code", + "execution_count": 12, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [ + "run_odeint(system, slope_func)" + ] + }, + { + "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
124.81248.046.7070640.054851
126.11261.047.4224870.055214
127.41274.048.1426300.055577
128.71287.048.8674930.055940
130.01300.049.5970740.056303
\n", + "
" + ], + "text/plain": [ + " theta y r\n", + "124.8 1248.0 46.707064 0.054851\n", + "126.1 1261.0 47.422487 0.055214\n", + "127.4 1274.0 48.142630 0.055577\n", + "128.7 1287.0 48.867493 0.055940\n", + "130.0 1300.0 49.597074 0.056303" + ] + }, + "execution_count": 13, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "system.results.tail()" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Extracting one time series per variable (and converting `r` to radians):" + ] + }, + { + "cell_type": "code", + "execution_count": 14, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [ + "thetas = system.results.theta\n", + "ys = system.results.y\n", + "rs = system.results.r * 1000" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "***WHY TF DO WE MULTIPLY BY 1000" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Plotting `theta`" + ] + }, + { + "cell_type": "code", + "execution_count": 15, + "metadata": {}, + "outputs": [ + { + "data": { + "image/png": "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\n", + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "plot(thetas, label='theta')\n", + "\n", + "decorate(xlabel='Time (s)',\n", + " ylabel='Angle (rad)')" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Plotting `y`" + ] + }, + { + "cell_type": "code", + "execution_count": 16, + "metadata": {}, + "outputs": [ + { + "data": { + "image/png": "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\nA6ef1MpfzGxDAAAAAElFTkSuQmCC\n", + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "plot(ys, color='green', label='y')\n", + "\n", + "decorate(xlabel='Time (s)',\n", + " ylabel='Length (m)')" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Plotting `r`" + ] + }, + { + "cell_type": "code", + "execution_count": 17, + "metadata": {}, + "outputs": [ + { + "data": { + "image/png": "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\n", + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "plot(rs, color='red', label='r')\n", + "\n", + "decorate(xlabel='Time (s)',\n", + " ylabel='Radius (mm)')" + ] + }, + { + "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": 18, + "metadata": {}, + "outputs": [ + { + "data": { + "image/png": "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\n", + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "plot(rs, ys, color='purple')\n", + "\n", + "decorate(xlabel='Radius (mm)',\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": 19, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Saving figure to file chap11-fig01.pdf\n" + ] + }, + { + "data": { + "image/png": "iVBORw0KGgoAAAANSUhEUgAAAggAAAJWCAYAAAA9eH/kAAAABHNCSVQICAgIfAhkiAAAAAlwSFlz\nAAALEgAACxIB0t1+/AAAIABJREFUeJzs3Xl0k1X+BvAnadOme9J9TUpLU2STzaJSdgsom6I4CojL\nyCAgbj/GDVBHmFFBUFFmHMGjgzDjMlJkkUFEQNERpKhjFbpBk+5r0j1plvf3RyEak0opzdY+n3M8\nR957m35zgeYh+b73igRBEEBERET0C2J3F0BERESehwGBiIiI7DAgEBERkR0GBCIiIrLDgEBERER2\nfN1dgKfQ6/XIzc1FVFQUfHx83F0OERGRU5nNZtTU1GDw4MGQSqV24wwI5+Xm5mL+/PnuLoOIiMil\nduzYgVGjRtldZ0A4LyoqCkDHQsXGxrq5GiIiou6zWAS0tZsQ4O8LsUjkcE5lZSXmz59vff37NQaE\n8y58rBAbG4vExEQ3V0NERHRpBEFARW0L8jRaFJbqYGg3Iy1JhqlXJ//m13X2sToDAhERkRera2hD\nvkaHghItGlvabcYqalu6/bgMCERERF6muc2IAo0W+RotanRtDueEBvlhwojuvyPOgEBEROQF2o1m\nFJU2IE+jRVlNMxwdpST180X/xDCkK8MRGxEIUSf9B13BgEBEROShzGYLNFVNyNdoca68ESazxW6O\nj1iEfvFhSFfKoYgJgY9Pz2xxxIBARETkQQRBQGVda0ezYYkO+naT3RyRSISEqGCkK+RISQyDv6Tn\n9+9hQCAiIvIA2kY98s73Ffy62fCCSFkAVAo5VAo5ggMkTq2HAYGIiMhNWvVGFGh0yNNoUa1tdTgn\nOEAClUKOdKUcEWEBLquNAYGIiMiFjCYzisoakK/RoqTKcbOhv8QH/ZNkSFfIERcZdFnNht3FgEBE\nRORkZouA0qomnFFrUVzeAGMnzYbJcaFQKeRIjgvtsWbD7mJAICIicgJBEFBV34p8jRYFJTq0Geyb\nDQEgISoYKoUcqYlhkPp5zsuy51RCRETUC+iaDMgv0SJfrYWu2eBwTkSoFOnKcKQpZAgJ9HNxhV3D\ngNCHFBYWorS0FBMmTMCkSZNwyy23YOnSpd1+vG+//RYWiwUjR47swSqJiLxPq96IwlId8tRaVNV3\n3myYppBDlSRHpEzqlr6CS8GA0IcsXboUM2fOxIQJE3rk8RYsWIA1a9YwIBBRn2Q0WXCuvKPZUFPZ\nBIuDZkM/iQ9SE8KgUsiREBUMsdizQ8EvMSD0IY46ZT3p8YiIPJ3FIqC0umNnw6KyBhhN9s2GYpEI\nyrhQpCvkSI4Pha+bmw27iwGhj7jjjjug0Wjw2muvITs7GwBQVVWF++67D//9738REhKCBQsW4L77\n7rN+zaeffopNmzbh3LlzSEhIwNy5c3H33XdDLBZj0qRJMJvNeOKJJ5CdnY133nkHZ86cwYYNG/Dt\nt99Cr9cjISEBS5YswY033uiup01EdNkEQUCNtq2jr0CjQ6ve6HBeXEQQVEo5+ifKEODv/S+v3v8M\n3OjbvGqc+KnSYYJ0NomvGBkDYzE8PbpL81999VXMmTMHU6dOxaJFi3DLLbfgww8/xMqVK7Fy5Urs\n378fGzZswMiRI3HVVVfh6NGjWLFiBVatWoWMjAwUFBTg2WefRVtbG+6//378+9//RmZmJh577DHM\nnj0bra2tuOeeezBx4kS8//77EAQBb731FlatWoXMzExERkY6eUWIiHpWQ7MBBSUdfQXaJr3DObIQ\nfwxQhiMtSYawYH8XV+hcDAiX4bv8GreEA6Djs6/v8mu6HBBkMhl8fHwQGBiI8PBwAMDUqVNx++23\nAwD+8Ic/4I033kBubi6uuuoqvP7667j99ttxyy23AAAUCgVaWlqwevVqLF261PoYISEhkMlkqKur\nw1133YU77rgDAQEdO30tXrwYH3zwAYqLixkQiMgr6A0mFJTqkK/WoqKuxeGcQKkEaec3MYqSB3h8\ns2F3MSBchmGqKLe+gzBMFXVZj9GvXz+bX4eGhkKv70jJp0+fxg8//IB3333XOm6xWKDX61FWVoak\npCSbr42IiMC8efOwa9cunD59GsXFxThz5gwAwGw2X1adRETOZDJbUFzeiDyNFurKRlgs9v1VEl8x\nUhPCkKaQIyk6xKuaDbuLAeEyDE+P7vK/4D2RWGzfOHOh8VAikeDee+/FzJkz7ebExMTYXauqqsJt\nt92GmJgYTJw4ERMmTEB0dDRuvvnmni+ciOgyWSwCymqarc2G7Ub7f8iIRSIkxYQgXSlHv/hQSHx7\n/sRET8aA0Idcyttg/fv3R3FxMZRKpfXawYMHsW/fPqxbt87u8fbt24eWlhbs2LEDPj4df4m++OIL\nALzbgYg8gyAIqGvoODGxQKNFc5vjZsPYiCCoFDL0T5QhUOrcExM9GQNCHxIUFITi4mJUVVVddO6S\nJUuwePFiqFQqTJkyBcXFxXjqqacwfvx4+Pn5WR+vsLAQdXV1iI2NRXNzMw4cOIArr7wSZ86cwZ//\n/GcAQHu742NLiYhcoam1Hfmajp0N6xo7aTYM9rceoywL6V3Nht3FgNCH3HXXXVi7di2OHTtmbSTs\nzLhx47Bu3Tq88cYb2LRpE8LDw3HjjTfi4Ycfts5ZtGgR/vrXv+Krr75CdnY2fvjhB6xduxatra1Q\nKBRYunQp3njjDfzwww8YN26cs58eEZGVvt2EotIG5Km1KK9tdjgnwN+3o9lQGY7oXtxs2F0ige//\nAgBKS0sxefJkHDp0CImJie4uh4iILpHJbIG6ohH5Gi2KKxphdtBs6OsjRkpCGNIVciTGhMCnDzQb\nduZir3t8B4GIiLyWIAgor21BnlqLojIdDO32zYYikQhJ0cFQKeVIiQ+Dn6RvNRt2FwMCERF5nbqG\nNuRrtMhTd95sGC0PRLpCjjRF32427C4GBCIi8grNbcaOZkONFrW6NodzQoP8kK6QQ6WUQx4idXGF\nvQsDAhEReSyD0YyzpQ3I02hRVtPs8LZpqZ8v+p/f2TA2IpDNhj2EAYGIiDyK2WyBpqoJeeqOZkOT\n2X63Wl8fMfrFh0KlkEMREwIfLz0x0ZMxIBARkdsJgoDKulbkqetRWNoAfbvJbo5IJEJCVDDSFXKk\nJrLZ0NkYEIiIyG20jR07G+ZrtGhscbypWpQsAGnnNzEKDmCzoau4NSA89dRTMJvN1h33AODYsWNY\nv349zp07B6VSiRUrVmD8+PHW8bq6Ojz77LP48ssvIZFIMGfOHDz88MPw9f35qbz99tv4xz/+gfr6\neowYMQJPP/00kpOTXfnUiIioEy1tRhSUaJGn0aJG67jZMCTQ7/zOhjJEhP32xm7kHG4JCIIgYNOm\nTXjvvfesxwkDQGFhIZYsWYKlS5diypQp2LNnD5YtW4bs7GykpaUBAJYvXw6RSITt27ejqqoKjz/+\nOHx9fa07/H3wwQfYtGkT/vKXv6Bfv3546aWXcO+99+Ljjz+2bhFMRESu1W4042x5x86GpdWOmw39\n/XzQP7Gj2TAuMojNhm7m8oBQUlKCJ598EgUFBYiPj7cZ27ZtG4YNG4YlS5YAAB566CHk5ORg27Zt\nWLNmDb799lvk5OTg008/RVJSEgYMGIBHH30Ua9aswbJly+Dn54etW7fi7rvvxrRp0wAAGzZsQGZm\nJg4cOODwZEIiInIOs0VAaVUTzqi1OFfe4LDZ0EcsQnJcR7Nhclwomw09iMsDwqlTpxAXF4eNGzfi\nkUcesRk7efIkrr/+eptro0ePxr59+6zjCQkJSEpKso5nZGSgpaUFp0+fRmJiIoqLi5GRkWEdDwoK\nwuDBg3Hy5EkGBCIiJxMEAVX1rcjXaFFQokObwb7ZEAASooKhOt9sKPVjO5wncvnvyuzZszF79myH\nY5WVlYiJibG5Fh0djcrKSgBAVVUVoqOj7cYBoKKiwtqH8FuPQUREPU/XZLBuYqRrNjicExEqRboy\nHGkKGUIC+ZGvp/Oo2KbX6+36BPz8/GAwdPxha2trg7+/7TGcEokEIpEIBoMBbW0dzS6/nvPLxyAi\nop7RqjeisFSHPLUWVfWtDucEB0iQppAjXSFHpIzNht7EowKCv78/jEbbPbXb29utRxNLpVK0t9ve\nBmM0GiEIAgIDAyGVSq1f09ljEBFR9xlNZpwrb0SeWouSqiZYHDQb+kl80D8xDCqFHPGRwRD34RMT\nvdklBQS1Wo2ysjI0NTVBLpcjLi7Oph/gcsXFxaG6utrmWnV1tfUjg9jYWBw9etRuHOj4WCEuLg4A\nUFNTA6VSaTMnNTW1x+okIupLLBYBJdVNKNBoUVTWAKPJvtlQLBZBGRuKdIUcyfGh8GWzode7aECo\nra3FW2+9hb1796K6utrm1hSRSASFQoGpU6di4cKFiIyMvKxiRo4ciW+++cbm2vHjxzFq1Cjr+Isv\nvoiKigprGDh+/DiCgoIwYMAA+Pn5ITk5GSdOnLB+TUtLC3Jzc3HbbbddVm1ERH2JIAio0bYh73yz\nYave8YmJ8ZFBUCnk6J8og9Tfo96UpsvU6e+m2WzG5s2bsXXrViQmJmLOnDkYPHgwEhISEBgYiIaG\nBlRVVSEnJweHDx/Gtm3bcOedd+L++++HRNK9na4WLFiAm2++GZs2bcL06dOxd+9efP/993jmmWcA\nAMOHD8ewYcPw8MMPY/Xq1aitrcX69etx9913W3sX7rrrLqxbtw5KpRJpaWnYuHEjoqOjkZWV1a2a\niIj6kobmjmbDPI0WuibHvVvyECnSlR07G4YGsdmwt+o0INxyyy1QKBR47733cMUVVzicM2TIEFx3\n3XV47LHHkJOTgzfffBNz587Frl27ulVMeno6XnvtNaxfvx5btmxBSkoKXn/9devHAyKRCK+99hqe\neeYZzJ8/H0FBQZg7dy6WLVtmfYzbb78djY2NeO6559DS0oIRI0Zg69at3CSJiKgTbQYTCkt1yFdr\nUVHX4nBOoFQClUIGVZIcUfIAbmLUB4gER9tZoWPPgQtv01+KEydO2OxD4C1KS0sxefJkHDp0CImJ\nie4uh4jIqUxmC86VNyBfrYW60nGzocRXjNSEMKQrw5EQxWbD3uZir3udvoPQnXAAwCvDARFRX2Cx\nCCiraUb++WbDdqPZbo5YJIIiNgQqhRz94sMg8WWzYV/VaUDYs2fPJT0QdykkIvI8giCgVqe3bmLU\n0kmzYWxEkPUY5UApT0yk3wgIf/zjH21+feHzpl/fxXABAwIRkedobGm3hoL6Rr3DObJgf6iUHZsY\nhQX7O5xDfVenAeHQoUPW/z99+jT++Mc/YunSpbj++usRHR0NrVaLzz77DK+++iqee+45lxRLRESd\n07ebUFTacWJieW2zwzkB/r5QJcmhUsoRzWZD+g2dBoSEhATr/y9fvhxLly7FokWLrNdiYmJw++23\nw2AwYP369Rg/frxzKyUiIjsmswXFFY0o0GhRXNEIs8VBs6GPGCkJHTsbJsWEsNmQuqRLu1oUFRVh\n4MCBDsdSU1NRWlrao0UREVHnBEFAeW0L8tRaFJXqYHDQbCgSiZAUE4x0hRwpCWGQ+Pq4oVLyZl0K\nCMnJydizZw/GjBljN/bBBx9ApVL1eGFERGSrrqENeeqOvoLmNsfNhjHhgVAlyZGmkLHZkC5LlwLC\nsmXL8OCDD0KtVmPSpEkIDw9HXV0d/vOf/yA/Px9btmxxdp1ERH1Sc2s78kt0yNdoUatrczgnNMgP\nKoUc6Uo55CFSF1dIvVWXAsKUKVOwefNmbN68GRs3boQgCBCLxRg+fDjefvvtbu+ZQERE9gxGM4pK\nO0JBWU0LHO1nJ/XzRVqSDOlKOWLCA9lsSD2uyydrTJo0CZMmTYLBYEBDQwNkMhm3LyYi6iFmswWa\nqiacUWtRXN7gsNnQ10eMfvGhUCnkUMSEwIcnJpITXdLRW1qtFkajEYIgQKvVQhAEtLa2IicnB3Pn\nznVWjUREvZIgCKioa0G+WovC0gbo2012c0QiERKjg6FK6tjEyE/CZkNyjS4FhLy8PKxYsQKFhYUO\nx0UiEQMCEVEX1TfqkafWoqBEi8aWdodzomQBSFfK0T9JjuAANhuS63UpIKxbtw46nQ6PPfYYDh8+\nDD8/P0ycOBGff/45Pv/8c2zbts3ZdRIRebWWNiMKSjqOUa7Rdt5smJbU0WwYHspmQ3KvLgWE7777\nDk888QRuueUWBAQEYM+ePZg3bx7mzZuHBx54AO+88w4bFYmIfqXdaMbZsgbkabQorW522Gzo7+eD\n/okypCvkiIsMYrMheYwuBYT29nYkJycD6NgT4cyZM9axOXPm4Omnn3ZKcURE3sZsEaCpbES+Rodz\n5Q0wmS12c3zEIiTHhyFdIYcyls2G5Jm6FBDi4+NRWlqKUaNGITk5Gc3NzSgrK0NCQgL8/f3R0NDg\n7DqJiDyWIAioqm9FnlqLwlId2gyOmw3jI4OQruzY2VDqd0k94kQu16U/oddddx1efPFFBAUFISsr\nCykpKXjllVewePFivP3220hKSnJ2nUREHkfXZEC+pqOvoKHZ4HBOpCyg43AkhQzBgbw1nLxHlwLC\n/fffD7Vajffffx9ZWVl44okncP/992PPnj3w8fHBxo0bnV0nEZFHaNUbUXB+Z8Oq+laHc4IDJFAp\n5FAp5IiUBbi4QqKe0eX3uF577TW0t3fcjjN27Fjs3bsXubm5GDRoEBQKhdMKJCJyN6PpF82GVc2w\nOGg29JP4oH9ix4mJCVHBbDYkr9elgHD99dfjiSeewNSpU63XkpKS+NECEfVaFouAkuom5Ku1OFve\nAKPJvtlQLBZBGRuKdKUcyXGh8GWzIfUiXQoIra2tCA0NdXYtRERuJQgCqrVtyNd0nJjoqNkQAOIj\ng6FSyNA/UQapP5sNqXfq0p/sO+64A6+88gqCgoIwYMAAnsFARL1KQ/PPzYa6JsfNhuGhUmtfQWgQ\nfwZS79elgPDxxx+jpKQEv/vd7wAAPj72e4Hn5ub2bGVERE7UZjChsESHPI0WlXUtDucESSVIU8iQ\nrghHpEzKvgLqU7oUEKZPn+7sOoiInM5osqC4ogH5ai3UlU0Omw0lvmKkJnQco5wQFQyxmKGA+qYu\n3+ZIROSNLBYBZTXNyFNrUVSmc9xsKBJBGRuCNIUc/eLDIPFlsyFRpwHhb3/7G37/+99fUr+BwWDA\n1q1bsWzZsh4pjoioOwRBQK1OjzxNPQo0OrTojQ7nxUYEIV0hR/8kGQLYbEhko9O/ERUVFZg2bRru\nueceXH/99YiIiOj0Qerr67Fz507s2LEDY8aMcUqhREQX09jSbr0Dob5R73COLMQf6eebDcOC/V1c\nIZH36DQgPPvsszh27BheeOEFPPfccxgxYgSGDBmCxMREBAYGorGxEZWVlTh16hRyc3ORkpKCp59+\nGhMmTHBh+UTU1+kNJhSWduxsWF7ruNkwwN/XegdCtDyAzYZEXfCb76llZmYiMzMThw8fxt69e/HR\nRx+hrq7OOh4ZGYnMzEwsXrwYEydOdHqxREQAYDJbUFzRiDy1FurKRlgsDpoNfcRISQiDSilHUnQI\nmw2JLlGXPnSbOHGiNQC0tbWhqakJMpmM+yEQkcsIgoDy2hbkqetRVNoAg9FsN0csEiEpJgQqhQwp\nCWGQ+Nrfkk1EXXPJXTkBAQEICODhI0TkGnUNbchTd/QVNLc5bjaMCQ+ESiFHWpIMgVKJiysk6p3Y\ntktEHqe5tR35Gh3yS7So1bU5nBMa5IcBynCkKWSQh0hdXCFR78eAQEQeQd9uwtmyBuRrtCiraYHg\nYBMjqZ8v0pI6NjGKCQ9ksyGREzEgEJHbmM0WaKqacEatRXF5A8wOmg19fcToFx8KlUIORWwofNhs\nSOQSDAhE5FKCIKCitgX5Gi0KSnUwtNs3G4pEIiRGByNdIUdKQhj8JGw2JHK1SwoIlZWV+Prrr1Fd\nXY2bbroJNTU16N+/P+9mIKKLqm/UI0+tRUGJFo0t7Q7nRMkDzu9sKEdwAJsNidypywHhhRdewDvv\nvAOTyQSRSIQxY8Zg48aNqKqqwj/+8Y/f3GmRiPqmljYjCkq0yFNrUfMbzYZpSXKkK+UID2WzIZGn\n6FJAeOONN/DOO+/g0UcfxcSJE5GVlQWg4xCnBx54AC+99BLWrl3r1EKJyDu0G804W9aAPI0WpdXN\nDpsN/f18kJYog0opR1xEEJsNiTxQlwLCe++9h+XLl2PhwoUwm3/+vHD48OF46KGH8MorrzitQCLy\nfGaLAE1lI/I1Wpwrb4TJbH9ioo9YhOT4MAxQyqGICYGPD09MJPJkXQoI1dXVGDJkiMOxhIQE6HS6\nHi2KiDyfIAioqm8931egg77dZDdHJBIhPjII6Uo5UhNl8GezIZHX6FJAUCgU+OKLL3DttdfajZ08\neRJJSUk9XhgReSZtkx75ai3yNJ03G0bKAjoOR0qSITiQTcxE3qhLAeHOO+/E008/DZPJhEmTJkEk\nEqGkpAQ5OTl48803sWLFCmfXSURu1Ko3okCjQ55Gi2ptq8M5wQESqBQdzYYRYdyOncjbdSkg3Hrr\nrdBqtfjb3/6G7du3QxAEPPTQQ5BIJLjnnnswf/58Z9dJRC5mNP2i2bCqGRZHzYYSH6QmhiFdGY74\nSDYbEvUmXb7NcfHixZg/fz5OnTqFhoYGhISE4Morr4RcLndmfUTkQhaLgJLqJuSrtThb1gBjZ82G\ncaFIU8iRHBcKXzYbEvVKl7RRUnBwMMaNG+esWojIDQRBQLW2DflqLfJLtGgz2DcbAkB8ZPD5ZsMw\nSP24CStRb9fp3/IpU6Zc0tuFBw4c6JGCiMg1GpoNyNNoka/WQtdscDgnPFTa0WyokCM0iM2GRH1J\npwFhxIgR/DyRqJdp1RtRVNrRV1BZ1+JwTpBUYg0FkTIpfw4Q9VGdBoTnn3/elXVYFRYWYvr06XbX\nd+zYgVGjRuHYsWNYv349zp07B6VSiRUrVmD8+PHWeXV1dXj22Wfx5ZdfQiKRYM6cOXj44Yfh68u3\nRKlvMposOFfegAKNFurKJofNhn4SH6QmhEGlkCMhKhhinphI1Od16VXzm2++6XRMJBIhKCgISUlJ\nCA4OvuyC8vPzIZfLsWfPHpvrMpkMhYWFWLJkCZYuXYopU6Zgz549WLZsGbKzs5GWlgYAWL58OUQi\nEbZv346qqio8/vjj8PX1xcMPP3zZtRF5C4tFQFlNM/LU9Sgqa4DRZN9sKBaJoIwNgUopR7/4MDYb\nEpGNLgWEO+64w/o24y/3Vf/lW49isRizZ8/GmjVr4OPT/d3S8vPz0b9/f0RFRdmNbdu2DcOGDcOS\nJUsAAA899BBycnKwbds2rFmzBt9++y1ycnLw6aefIikpCQMGDMCjjz6KNWvWYNmyZTx1kno1QRBQ\no2vrOEZZo0OL3uhwXlxEEFRKOfonyhDgz3fWiMixLv10+Otf/4pHHnkEN910E2644QZERkairq4O\nn376KXbs2IEVK1bA19cXmzZtQkJCApYtW9btggoKCpCSkuJw7OTJk7j++uttro0ePRr79u2zjick\nJNjs7JiRkYGWlhacPn0aV155ZbfrIvJUjS3tyNdoka/Ror5R73COLMQf6ef7CsKC/V1cIRF5oy6f\n5njHHXfg//7v/6zX+vXrh1GjRiEoKAiffPIJduzYAZFIhLfffvuyA4LBYMCtt96KsrIypKWl4ZFH\nHsHQoUNRWVmJmJgYm/nR0dGorKwEAFRVVSE6OtpuHAAqKioYEKjX0BtMKCzVIV+jRXmt42bDQKkE\naUkypCvkiJIHsNmQiC5JlwLC6dOnsXz5codjI0eOxJYtWwAAKpXK+mLdHXq9HiUlJQgPD8ejjz4K\nPz8/bN++HQsWLEB2djb0er3dxwR+fn4wGDpu0Wpra4O/v+2/jiQSCUQikXUOkbcymS0ormhEnloL\ndWUjLBb7ZkOJrxgp8WFQKeVIig5hsyERdVuXAkJcXBwOHz6MMWPG2I0dPnzY+q/6mpoayGSybhcj\nlUrxzTffwM/PzxoEnn/+efz444/45z//CX9/fxiNtp+rtre3IyAgwPr17e22h8cYjUYIgoDAwMBu\n10XkLoLQ0WyYr9GisLQB7Uaz3RyxSISkmBCoFDKkJIRB4ssTE4no8nUpIPz+97/H6tWrUVdXh6ys\nLISHh6O+vh6HDh3Cxx9/jNWrV0Oj0eCVV15BZmbmZRX06zshxGIx+vfvj4qKCsTFxaG6utpmvLq6\n2hpQYmNjcfToUbtxAHYfTRB5KkEQUNegR55GiwKNFs1tjpsNY8IDkX6+2TBQKnFxlUTU23UpIMyd\nOxdisRibN2/G/v37rdcTExPx3HPP4cYbb8S+ffuQmJh4WSc75ubmYuHChdi2bRsGDx4MADCbzThz\n5gymTZuGiIgIu1sujx8/jlGjRgHo+LjjxRdftIaJC+NBQUEYMGBAt+sicoXm1nbka3TIU9ejrpNm\nw7Dgn5sNZSFsNiQi5xEJgoNdU36DRqNBfX09YmJirC/CPcVkMuGmm26CRCLB008/jcDAQGzZsgVH\njhzB/v37UVtbi5tvvhl/+MMfMH36dOzduxdvvvkmsrOzkZqaCkEQcNttt0EkEmH16tWora3F448/\njnnz5nXaQ3FBaWkpJk+ejEOHDiExMbFHnxdRZ/TtJhSVNiBfo0VZTbPDOQH+vuifKEO6Uo6Y8EA2\nGxJRj7jY694l3QTd3NyMgIAAazCoqqqyjvXEW/i+vr7YunUr1q1bh/vuuw9tbW0YMWIEtm/fjoiI\nCEREROC1117D+vXrsWXLFqSkpOD1119HamoqgI59GV577TU888wzmD9/PoKCgjB37tzLuquCqKeZ\nzRaoK5uQp9GiuLwBZgfNhr4+YvSLD8MApRyJMSHwYbMhEblYl95B0Gg0ePLJJ5GTk9PpnNOnT/do\nYa7GdxDImQRBQEVtC/I0WhSW6mBot282FIlESIoOhkopR0p8GPwkbDYkIufpkXcQnn32WRQWFuL+\n++9HbGwsxGJuyUrUFXUNbcjXdOxX0NTa7nBOtDwQ6Qo5+ifJEBTAZkMi8gxdCggnT57E2rVrMWPG\nDGfXQ+ThnDesAAAgAElEQVT1mtuMKDi/s2GNrs3hnNAgP6QlyZGulCM8VOriComILq5LASEoKAhh\nYWHOroXIa7UbzdZjlMtqmuHokzupny/6J4YhXRmO2Ag2GxKRZ+tSQJg1axZ27NiBzMxM/lAjOs9s\ntkBT1YR8jRbnyhthMtufmOgjFiH5fLOhIiYEPjwxkYi8RJcCQnBwMHJycjB16lQMHTrUunPhL61Z\ns6bHiyPyNIIgoLKutePExBId9O0muzkikQgJUcFQKWRITZTBn82GROSFuhQQPvzwQ4SEhMBkMuHU\nqVN243xXgXo7bZMe+Wot8jRaNLY4bjaMlAVApZBDlSRDcCCPFici79algPDZZ585vN7U1ISPPvoI\n7733Xo8WReQJWvVGFGh0yNNoUa1tdTgnOEAClaKj2TAizP6dNSIib3VJGyVd8L///Q/vvvsu9u/f\nj7a2NkRERPR0XURuYTSZUVTWsbNhSZXjZkN/iQ9Sz+9sGB8ZxHfQiKhX6nJAaGlpwe7du/Hee+8h\nLy8PEokEEydOxI033ohx48Y5s0Yip7JYBJRUdexseK6sAcbOmg3jQpGmkCM5LhS+bDYkol7uogEh\nNzcX7733Hvbt24e2tjYMHDgQAPD3v/8d11xzjdMLJHIGQRBQVf9zs2Gbwb7ZEADiI4ORrpQjNTEM\nUr9uveFGROSVOv2J9/777+Pdd9/FTz/9hOjoaMyfPx833XQTIiMjkZGRAV9f/rAk76NrMiC/RIt8\ntRa6ZoPDORGhUqQrw5GmkCGEzYZE1Ed1+ir/1FNPIT09HVu2bLHZ/6CpqcllxRH1hFa9EYWlOuSp\ntaiq77zZ8MLOhhFhUvYVEFGf12lAmDJlCg4fPoxHHnkEmZmZmD17NnsNyGsYTRacK+9oNtRUNsHi\noNnQT+KD1IQwqBRyJEQFQ8wTE4mIrDoNCJs2bYJOp8Pu3buRnZ2N++67D5GRkcjKyoJIJOK/sMjj\nWCwCSqs7djYsKmuA0WTfbCgWiaCMC0W6Qo7keDYbEhF15jcbCWQyGRYuXIiFCxfi9OnT+PDDD7F3\n714IgoBVq1ZhxowZmD59Ovr16+eqeolsCIKAGm1bR1+BRodWvdHhvLiIIKiUcqQlyiD1Z/8MEdHF\niARHN3r/BqPRiM8++wzZ2dn44osvYLFYcMUVV2Dnzp3OqtElLnYuNnmWhmYDCko6+gq0TXqHc2Qh\n/higDEdakgxhwf4urpCIyLNd7HXvkv8pJZFIMHXqVEydOhU1NTXYtWsXsrOze6RYot+iN5iszYYV\ndS0O5wRKJUhLkiFdIUeUPIAfhRERddNlvdcaFRWFRYsWYdGiRT1VD5ENk9mC4vJG5Gm0UFc2wmKx\nf8NL4iu2NhsmRoew2ZCIqAfww1jyOBaLgLKaZmuzYbvRbDdHLBIhKSYE6Uo5+sWHQuLLExOJiHoS\nAwJ5BEEQUNegR55GiwKNFs1tjpsNY8IDka6Uo3+iDIFSiYurJCLqOxgQyK2aWtuRr+nY2bCusZNm\nw2B/qJRyqJLkkIWw2ZCIyBUYEMjl9O0mFJV2bGJUVtPscE6Avy/SkmRQKeSICQ9ksyERkYsxIJBL\nmM0WFFc0Il+jRXFFI8wOmg19fcRISQhDukKOxJgQ+LDZkIjIbRgQyGkEQUB5bQvy1FoUlelgaLdv\nNhSJREiK7jgxMSUhjM2GREQeggGBelxdQxvyNVrkqTtvNoyWByJdIUeags2GRESeiAGBekRzmxH5\n5+9AqNG1OZwTGuSHdIUcKqUc8hCpiyskIqJLwYBA3WYwmnG2tAF555sNHe3aLfXzRf/zOxvGRrDZ\nkIjIWzAg0CUxmy3QVDUhT93RbGgy25+Y6OsjRr/4UKgUcihiQuDDExOJiLwOAwJdlCAIqKxrRZ5G\ni8ISHfTtJrs5IpEICVHBSFfIkZoYBj8Jmw2JiLwZAwJ1StvYsbNhvkaLxpZ2h3OiZAFIU8ihUsgR\nHMBmQyKi3oIBgWy06o0o0OiQp9GiWtvqcE5IoB9UCjlUChkiwgJcXCEREbkCAwLBaDKjqKwB+Wot\nSqodNxv6+/mgf2JHs2FcZBCbDYmIejkGhD7KbBFQWtWEM2otissbYHTQbOgjFiE5rqPZMDkulM2G\nRER9CANCHyIIAqrqWzv2KyjRoc1g32wIAAlRwVCdbzaU+vGPCBFRX8Sf/n2ArsnQsbOhRouGZoPD\nORGh0o4TExVyhAT6ubhCIiLyNAwIvVSr3ojCUh3y1FpU1TtuNgwOkCBNIUe6Qo5IGZsNiYjoZwwI\nvYjRZMa58kbkqbUoqWqCxUGzoZ/EB/0Tw6BSyBEfGQwxT0wkIiIHGBC8nMUioKS6CflqLc6WN8Bo\nsm82FItFUMaGIl3Z0Wzoy2ZDIiK6CAYELyQIAmq0bcg732zYqnd8YmJ8ZBBUCjn6J8og9edvNRER\ndR1fNbxIQ7MBBSU6nFHXQ9fkuNlQHiJFulKOtCQZwoL9XVwhERH1FgwIHk5vMKGgVId8tRYVdS0O\n5wRKJVApZFAp5IiSBXATIyIiumwMCB7IZLbgXHnHzobqSsfNhhJfMVITwpCuDEdCFJsNiYioZzEg\neAiLRUBZTTPyNVoUlTWg3Wi2myMWiaCIDYFKIUe/+DBIfNlsSEREzsGA4EaCIKBWpz+/s6EWzW2O\nmw1jwgORruxoNgyU8sREIiJyPgYEN2hsae8IBRot6hr1DufIgv07djZMkkMWwmZDIiJyLQYEF9G3\nm1BU2oA8tRbltc0O5wT4+yItSYZ0ZTii5Ww2JCIi92FAcCKz2YLiikbka7QormiE2eKg2dBHjOT4\nMAxQypEYEwIfNhsSEZEHYEDoYYIgoLy2BXlqLYpKdTA4aDYUiURIiglGukKOlIQwSHx93FApERFR\n53plQDCbzXj55ZeRnZ2NlpYWjB07Fk899RQiIyOd9j3rGtqQp9YiX/PbzYaqJDnSFGw2JCIiz9Yr\nA8Krr76K7OxsvPDCC5DJZPjTn/6E5cuX41//+lePfp/m1nbkl+iQr9GiVtfmcE5okB9UCjnSlXLI\nQ6Q9+v2JiIicpdcFhPb2dmzbtg2rVq3CmDFjAAAbN27E5MmTcerUKYwYMeKyHt9gNKOotCMUlNW0\nQHCwiZHU70KzoRwx4YFsNiQiIq/T6wLCmTNn0NLSgoyMDOu1xMREJCQk4OTJk90OCDXaNpw8U4Xi\n8gaHzYa+PmL0iw+FSiGHIiYEPjwxkYiIvFivCwiVlZUAgJiYGJvr0dHR1rFLZTCasfNIgd1RyiKR\nCInRPzcb+knYbEhERL1DrwsIbW1tEIvFkEhsmwD9/PxgMDg+AfFihF+9YxAlC4BKIUeaQo7gADYb\nEhFR79PrAoJUKoXFYoHJZIKv789Pr729HQEBAd17TH9f3DShP2q0bYiNCEREWPceh4iIyFv0uoAQ\nFxcHAKipqbH+PwBUV1fbfezwS2Zzx34Fv/UxRJgf0NbUhtKmHiqWiIjITS683l14/fu1XhcQBgwY\ngKCgIJw4cQKzZ88GAJSWlqKsrAxXXXVVp19XU1MDAJg/f75L6iQiIvIENTU1UCqVdtd7XUDw8/PD\nvHnzsG7dOsjlckREROBPf/oTMjIyMGzYsE6/bvDgwdixYweioqLg48NmQyIi6t3MZjNqamowePBg\nh+MiwdGN/F7OZDLhxRdfRHZ2Nkwmk3UnxfDwcHeXRkRE5BV6ZUAgIiKiy8PdfIiIiMgOAwIRERHZ\nYUAgIiIiOwwIXWA2m7FhwwZkZmZi+PDheOCBB1BbW+vuspyqtrYWjz32GDIzMzFq1Cj8/ve/R35+\nvnX82LFjmD17NoYOHYqZM2fi6NGjbqzWNb777jsMHDgQx48ft17ra+vwwQcfYOrUqRg6dCjmzJmD\n//73v9axvrIWra2tWLNmjfXvxr333ovCwkLreF9Yh6eeegorV660uXax511XV4cHH3wQo0aNwjXX\nXIP169fDZDK5suwe52gdtm/fjmnTpmHYsGG44YYb8MEHH9iMe9U6CHRRL730kjBmzBjh2LFjQm5u\nrjB37lzhtttuc3dZTmM2m4Xf/e53wq233ip8//33QkFBgfDAAw8I11xzjVBfXy8UFBQIgwcPFv76\n178KhYWFwksvvSQMGjRIyM/Pd3fpTtPS0iJkZWUJKpVK+PrrrwVBEPrcOuzcuVMYNGiQ8MEHHwjF\nxcXCX/7yF2HYsGFCSUlJn1qLJ598Upg2bZpw8uRJobCwUFi6dKkwfvx4Qa/X9/p1sFgswssvvyyo\nVCrhySeftF7vyvO+/fbbhXnz5gmnT58Wjhw5Ilx99dXCxo0b3fE0Lltn67Bjxw5h2LBhwq5duwS1\nWi28//77wqBBg4Ts7GzrHG9aBwaEizAYDMLw4cOFDz/80HqtpKREUKlUQk5Ojhsrc54ff/xRUKlU\nQmFhofWawWAQrrzySiE7O1tYvXq1sGDBApuvWbBggbBq1SpXl+oyF57zLwNCX1oHi8UiTJw4UXj5\n5Zet18xmszBr1ixh9+7dfWotMjIyhG3btll/XVBQIKhUKiE3N7dXr4NGoxEWLFggjB49WpgwYYLN\nC+PFnvepU6cElUolaDQa6/jOnTuF4cOHCwaDwTVPoIf81jrMnDlTWLdunc38J554QrjjjjsEQfC+\ndeBHDBdxseOje6O4uDj8/e9/R79+/azXRCIRAKChoQEnT560WQ8AGD16dK9dj6NHj+LIkSNYtWqV\nzfW+tA5nz55FWVkZbrjhBus1sViMjz76CDNnzuxTaxEeHo6PP/4YdXV1aG9vx7///W+EhYUhKSmp\nV6/DqVOnEBcXhz179iAxMdFm7GLP++TJk0hISEBSUpJ1PCMjAy0tLTh9+rTzi+9Bv7UOq1atwm23\n3WZzTSwWo7GxEYD3rQMDwkU44/hoTyeXyzFhwgSIxT//8XjnnXeg1+uRmZmJysrKPrMe9fX1WLly\nJdauXYuwsDCbsb60DsXFxQCAxsZGLFy4ENdccw3mz5+PU6dOAehba7FmzRpUVlbi2muvxbBhw/D+\n++/jjTfeQGhoaK9eh9mzZ2PdunWIioqyG7vY866qqkJ0dLTdOABUVFQ4qWLn+K11yMjIsHnxLy8v\nx759+zB27FgA3rcODAgX4Yzjo73NoUOHsHHjRtx9991ITU2FXq+Hn5+fzZzeuh5PP/00Jk2ahHHj\nxtmN9aV1aG5uBgA8/vjjmDt3LrZu3Yq0tDTceeedKCoq6lNroVarERkZiTfeeAP/+te/kJmZiQce\neACVlZV9ah1+6WLPu62tDf7+/jbjEokEIpGo165NfX09Fi9ejMjISPzhD38A4H3r0OvOYuhpzjg+\n2pvs3LkTq1evxg033IA//vGPAAB/f38YjUabeb1xPbKzs/HTTz9h9+7dDsf7yjoAsAbk++67DzNn\nzgQADBw4EDk5OfjXv/7VZ9aipKQEq1evxj//+U/r2S4bNmzADTfcgLfffrvPrMOvXex5S6VStLe3\n24wbjUYIgoDAwECX1ekqJSUluPfee6HX67F9+3aEhIQA8L51YEC4iO4eH90b/O1vf8PLL7+MBQsW\nYNWqVdY+hLi4OFRXV9vM7Y3rsXPnTlRVVSEzMxMAIJzflXzRokW48cYb+8w6AD+/DapSqazXRCIR\nUlJSUFpa2mfWIjc3F2az2eZwG4lEgiuuuAJqtbrPrMOvXex5x8bG2t32eGF+b1ubH3/8EYsWLUJY\nWBjeffddm9cNb1sHfsRwEb88PvqCrhwf7e22bNmCl19+GQ888ABWr15tDQcAMHLkSHzzzTc2848f\nP45Ro0a5ukynevHFF7Fv3z7s2rULu3btwtatWwEAa9euxYMPPthn1gEABg0ahMDAQPzwww/Wa4Ig\noKioCElJSX1mLWJjYwEAeXl51msX1iE5ObnPrMOvXex5jxw5EiUlJTafsx8/fhxBQUEYMGCAS2t1\npqKiItxzzz1ISEjAP//5T5twAHjhOrj1HgovsX79euHaa68Vjh49at0H4de39PQmp0+fFq644grh\niSeeEKqrq23+a2lpEc6cOSMMGjRIeOWVV4TCwkLh5ZdfFoYMGWJzW2RvVFFRYXObY19bh5deekm4\n6qqrhAMHDgjnzp0T/vznPwtDhgwRioqK+sxamEwm4dZbbxVmzJghfPPNN0JhYaGwevVqYdiwYUJp\naWmfWYcFCxbY3N53sedtsViEW2+9Vfjd734n5ObmWu//37Rpk7ueQo/49TrcfPPNQmZmpnD27Fmb\nn5t1dXWCIHjfOjAgdIHRaBSee+45ISMjQxgxYoTw4IMPWn/De6MNGzYIKpXK4X+bN28WBEEQDh8+\nLNxwww3C4MGDhVmzZglffvmlm6t2vl8HBEHoW+tgsViE119/XRg/frwwePBgYe7cucI333xjHe8r\na1FXVyesXLlSGDt2rDBy5EjhzjvvFH766SfreF9Yh1+/MArCxZ93dXW1sHTpUuHKK68Urr32WmHD\nhg2C2Wx2Zdk97pfrcPbs2U5/bl533XXWr/GmdeBxz0RERGSHPQhERERkhwGBiIiI7DAgEBERkR0G\nBCIiIrLDgEBERER2GBCIiIjIDgMCERER2WFAICIiIjsMCERERGSHAYGIiIjsMCAQERGRHQYEIiIi\nsuPr7gI8hV6vR25uLqKiouDj4+PucoiIiJzKbDajpqYGgwcPhlQqtRtnQDgvNzcX8+fPd3cZRERE\nLrVjxw6MGjXK7joDwnlRUVEAOhYqNjbWzdUQERF1X5uxDeXN5UgKTYKfj5/DOZWVlZg/f7719e/X\nGBDOu/CxQmxsLBITE91cDRER0aVrM7bh07Of4uDZgzCYDFBFqPB/1/7fb35NZx+rMyAQERF5OaPZ\niCPFR7C/cD9a2lus17V6bbcfkwGBiIjIS5ktZnxV8hX25u+FTq+zGYsPicddw+7q9mMzIBAREXkZ\nQRDwTfk32J23GzUtNTZjEYERmJU+CxkJGRCLur+bAQMCERGRlxAEAf+r+h8+yvsIZY1lNmOh/qGY\nrpqOTEUmfMWX//LOgEBEROThBEHAmdoz2HVmF4p1xTZjgZJATOs/DROSJ8Df17/HvicDAhERkQcr\nqi/CrjO7kF+Xb3Pd39cfk/tNRlZqFgIlgT3+fRkQiIiIPJBap8buvN3Irc61ue4r9sWE5AmY1n8a\nQvxDnPb9GRCIiIg8SHlTOXbn7ca3Fd/aXBeLxBijGIPpadMhD5A7vQ4GBCIiIg9Q1VyFPfl7cLL8\nJARBsF4XiUQYnTAaM1QzEBXkeNdDZ2BAICIicqPa1lrszd+Lr0u/tgkGADAyfiRmqmYiLiTO5XUx\nIBAREblBXWsd9hfux5eaL2ERLDZjQ2OGYlb6LCSFJbmpOgYEIiIil9LpddhfsB9faL6A2WK2GRsY\nNRCz0mehn7yfm6r7GQMCERGRCzToG3Cg6ACOFh+FyWKyGVNFqDArfRbSItLcVJ09BgQiIiInajQ0\n4kDhARxVH4XRbLQZSw1Pxaz0WUiPSIdIJHJThY4xIPQRf/7zn/HVV19h37591msajQZZWVnYtWsX\nrrjiCjdWR0TU+zQZmvBJ0Sc4UnwE7eZ2m7FkWTJmpc/CwKiBHhcMLmBAuAwHiw5iT/4eGEwGl39v\nf19/zFTNRFZqVpfm33TTTdi2bRt++uknDBw4EACwe/duDBgwgOGAiKgHNRmacPDsQRw+d9guGCjC\nFJiZPhNDood4bDC4gAHhMhw8e9At4QAADCYDDp492OWAMHDgQKSnp2P37t02AWHevHnOLJOIqM9o\nbm/GwaKDOFx82O61ITE0EbPSZ2FozFCPDwYXMCBchqyULLe+g5CV0rVwcMGcOXOwdetWPProo/j+\n++9RVlaGmTNnOqlCIqK+4WLBYIZqBobFDvOaYHABA8JlyErN6vK/4D3BzJkzsX79ehw/fhyffPIJ\nxo0bh4iICHeXRUTklX4rGMSHxGNm+kwMjx3udcHgAgaEPiQiIgLjxo3DJ598gkOHDmHVqlXuLomI\nyOtc6DE4UnzEYTCYoZqBEXEjvDYYXMCA0MfMmTMHK1asgFQqxYQJE9xdDhGR1/ituxJ6wzsGv8aA\n0MdMmDABUqkUM2bMgJ+fn7vLISLyeA36BnxS9InDfQwSQhMwQzWjVwWDCxgQ+pjm5ma0tLRgzpw5\n7i6FiMij6fQ6HCg8gC80X9gFA29uPuwqBoQ+QqvV4sSJE9i1axcGDx6MQYMGubskIiKPVNdahwNF\nB/Cl5ku7LZGTwpIwQzUDV8Zc2WuDwQVeHRC+++47zJs3D2+99RZGjx4NADh27BjWr1+Pc+fOQalU\nYsWKFRg/frybK3U/k8mElStXIjo6Gq+++qq7yyEi8jg1LTXYX7gf/y35r93pikqZEjNUM7xig6Oe\n4rUBobW1FY8++ijM5p9PwiosLMSSJUuwdOlSTJkyBXv27MGyZcuQnZ2NtDTPOQDDHaKionDy5El3\nl0FE5HEqmyuxv2A/TpSdsAsGKfIUTFdNx6CoQX0mGFzgtQHh+eefR0xMDNRqtfXatm3bMGzYMCxZ\nsgQA8NBDDyEnJwfbtm3DmjVr3FUqERF5oNLGUuwv2I+cihwIgmAzlhaRhhmqGR55iJKreGVAOHr0\nKI4cOYItW7Zg1qxZ1usnT57E9ddfbzN39OjRNgcUERFR31asK8bHBR/j+8rv7cYGRA7ADNUMjzp2\n2V28LiDU19dj5cqV+Mtf/oKwsDCbscrKSsTExNhci46ORmVlpStLJCIiD1RQV4B9Bftwuua03diQ\nmCG4Ie0GpMhT3FCZZ/K6gPD0009j0qRJGDdunN0Lv16vt7u338/PDwaDew5UIiIi9xIEAT/W/Ij9\nBftRWF9oNz48bjhuSLsBijCFG6rzbF4VELKzs/HTTz9h9+7dDsf9/f1hNNreq9re3o6AgABXlEdE\nRB5CEAR8W/ktPi74GCUNJTZjIpEIGQkZmNZ/GuJD4t1UoefzqoCwc+dOVFVVITMzEwCsTSWLFi3C\njTfeiLi4OFRXV9t8TXV1td3HDkRE1DuZLWacKDuB/xT+B5XNtu8y+4h9cHXi1ZjWfxqig6LdVKH3\n8KqA8OKLL0Kv11t/XVNTg/nz52Pt2rUYM2YMXn75ZXzzzTc2X3P8+HGMGjXK1aUSEZELGc1GfFny\nJQ4UHkB9W73NmMRHgrGKsZiSOgXyALmbKvQ+XhUQfv1OgL+/v/V6REQEFixYgJtvvhmbNm3C9OnT\nsXfvXnz//fd45pln3FAtERE5W5uxDUfVR3Ho7CE0GhptxqS+UkzsNxGT+01GiH+Imyr0Xl4VEC4m\nPT0dr732GtavX48tW7YgJSUFr7/+OlJTU91dGhER9aBGQyMOnT2EI8VHoDfpbcaC/YJxXcp1GJ88\nHoGSQDdV6P28OiDExsYiLy/P5tqECRN4jDERUS9V21qLg0UH8WXJl3YHKMkD5JiSOgWZikz4+fC0\n2svl1QGBiIj6htLGUhwoPICT5SfttkOOCY7BtP7TkJGQAV8xX9Z6CleSiIg8kiAIKKwvxH8K/4Pc\n6ly7caVMiWn9p2FY7DCIRWI3VNi7uTwgqNVqlJWVoampCXK5HHFxcUhKSnJ1GURE5KEEQcD3Vd/j\nQOEBnNWetRsfEDkA0/pPw4DIAX32nARXcElAqK2txVtvvYW9e/eiurra5lAMkUgEhUKBqVOnYuHC\nhYiMjHRFSURE5GFMFhNOlJ3AJ0WfoKKpwmZMJBJheOxwTO0/FcmyZPcU2Mc4NSCYzWZs3rwZW7du\nRWJiIubMmYPBgwcjISEBgYGBaGhoQFVVFXJycnD48GFs27YNd955J+6//35IJBJnlkZERB6izdiG\nLzRf4NDZQ9DpdTZjvmJfXJ14NaakTkFMMDe9cyWnBoRbbrkFCoUC7733Hq644gqHc4YMGYLrrrsO\njz32GHJycvDmm29i7ty52LVrlzNLIyIiN9Ppdfjs3Gc4WnzU7lZFqa8U45TjMDllMmRSmZsq7Nuc\nGhBWrlx5SbsYjhw5EiNHjsSJEyecWBUREblTRVMFPin6BMfLjsNsMduMhfqH4rqU6zBWOZZ7GLiZ\nUwNCd7c4zsjI6OFKiIjInQRBQEF9AQ4WHcT/qv5nNx4THIOpqVMxOnE0b1X0EC79Xfjxxx/x3Xff\noampyW5MJBJh8eLFriyHiIiczCJYcKriFA4WHUSxrthuPDU8FVNTp2JozFDekeBhXBYQ/vGPf+D5\n55+3uYPhlxgQiIh6D4PJgK9KvsKnZz9FbWut3fiVsVdiaupUpIZzK3xP5bKA8NZbbyErKwvPPvss\nZDI2nBAR9UYN+gYcLj6Mo8VH0WpstRnzFfvimqRrkJWSxTsSvIDLAkJDQwPmz5/PcEBE1AuVNpbi\n0NlDDhsPg/yCMCF5AiYmT+Spil7EZQEhMzMTJ06cwOjRo131LYmIyIkEQcBPNT/h4NmDOF1z2m48\nOiga16Vch2uSruHhSV7IZQHhqaeewsKFC1FeXo4hQ4YgMND+9pUbb7zRVeUQEVE3Gc1GnCg7gU/P\nforypnK78dTwVGSlZOHK2Ct5RoIXc1lAOHz4MDQaDc6dO4fs7Gy7cZFIxIBAROTBmgxNOKo+iiPF\nR9BksL0b7cJWyFmpWUiRp7ipQupJLgsImzdvxtixY7F8+XKet0BE5EXKm8rx6dlPcbz0OEwWk82Y\nv68/xiSNweSUyYgM5M/23sRlAaGxsRF33XUXBg0a5KpvSURE3XShv+DTs5/ip5qf7MblAXJM6jcJ\nmYpM7njYS7ksIGRkZOC7777D1Vdf7apvSUREl6jd3I6vS7/GobOHUNlcaTeulCmRlZKFEXEj4CP2\ncUOF5CouCwi33HILVq1aBY1Gg6FDhyIoKMhuzsyZM11VDhER/YK2TYsjxUfwufpzu/0LRCIRhsUO\nw3Up1yFVnsodD/sIlwWE5cuXAwB27tyJnTt32o2LRCIGBCIiFxIEAed053Do7CGcqjgFi2CxGZf6\nSsk9t68AACAASURBVDFGMQaT+k1if0Ef5LKAcOjQIVd9KyIi+g0miwk55Tn47NxnDs9HiAyMxKR+\nkzBGMQZSX6nrCySP4NSAYDab4ePT8RlVQkJCt76OiIh6RqOhEZ+rP8fR4qNoNDTajasiVJicMhlD\nY4Zy/wJybkCYPXs2HnvsMYwdO7bLX/PZZ59hw4YN2LdvnxMrIyLqO9Q6NT479xlOlp+0u03RV+yL\njIQMTE6ZjMTQRDdVSJ7IqQHhmWeewcqVKxEUFISZM2ciKysLiYn2fwDPnTuHzz//HB988AFaW1vx\nwgsvOLMsIqJez2wx41TFKXx27jOc1Z61G5dJZRifPB5jFWN5PgI55NSAMGrUKHz00UfYvn073nrr\nLaxbtw5yuRwJCQkICAhAU1MTqqqqoNVqER4ejnvuuQfz58+HVMrPvIiIuuPCxwhfqL+ATq+zG0+R\np2BSv0m8TZEuyulNilKpFPfeey/uvPNOfP311zh+/DhKSkrQ3NyMlJQUjB07FmPGjMGoUaPYd0BE\n1A0X7kY4UnwEJ8tP2p2m6CP2wVXxV2Fiv4lIliW7p0jyOi67i0EikWDs2LGX1I9ARESdM5qNOFl+\nEoeLD0OtU9uNh/qHYnzyeIxTjkOof6gbKiRv5rKAQEREPaOutQ5H1UdxTHMMLe0tduOp4amYmDwR\nw+OGw1fMH/PUPfyTQ0TkBQRBwOna0zhSfAT/q/ofBEGwGb9wN8LEfhOhCFO4qUrqTRgQiIg8WKux\nFf8t+S+OFB9BdUu13XhEYATGK8djjGIMgv2C3VAh9VYMCEREHkjToMHR4qM4XnYcRrPRbvyKqCsw\nMXkihsQM4aZG5BQMCEREHsJoNiKnIgdHi4863LsgQBKAa5OuxXjleMQEx7ihQupLXBoQioqKcOLE\nCTQ1NcFisT0URCQSYfHixa4sh4jII1S3VONz9ef4quQrh02HiaGJmJA8ARkJGfD39XdDhdQXuSwg\n7NmzB48//jjMZrPDcQYEIupLLIIF31d+j8/Vn+Onmp/sxn3FvhgZPxLjleORIk/hEcvkci4LCJs3\nb8aoUaOwdu1aJCYm8g87EfVJ/8/enYdHVd3/A3/PkD1A9o0kBBISIPvGDEsoqHWDolUqpRJbUVEW\nWdxFFrVQtEQgIkUt2tq4VanEgthf2y+tKCiTDQKBhCQQyL6ThSSTbc7vjyuTJjMhLJmbTPJ+PY/P\nA/eemfnMLZB3z/3cc+q0dfju4nc4UnjE6EqHLnYu+InfTzDDdwaXQKYBJVtAKCkpwcaNG+Hr6yvX\nRxIRDQo6ocOZqjP49uK3OFVxCjpheIs11D0Us8fNRrBbMJsOaVCQLSCMHz8elZWGj+gQEQ1VDa0N\nOFp4FN8Vfoea5hqD86OtRyNubBzixsbBxc5lACok6p1sAeGpp57Cq6++Ck9PT8TExMDS0lKujyYi\nks2VBY2+vfgtMsszDWYLAGCi60TM8puFCM8IrnRIg5ZJ/2SGhIR06zXo6OjA4sWLAcDoxkxZWVmm\nLIeIyGSuzBYcKTyC6uZqg/P2VvaY7jsdM8fO5COKZBZMGhCWLl3KZkQiGrJ0Qofsqmx8V/hdr7MF\nE5wn4Cd+P0G0VzQsR3DmlMyHSQPCypUrr3lsRUWFCSshIuo/l1ou4WjRUXxf9L3R3gI7SztM852G\nmWNnwmuU1wBUSHTzZLv5NXnyZHz22WcIDw83OJeWloYlS5bg+PHjcpVDRHRddEKHUxWn8F3hd8iq\nzDLYLAkAAl0CMXPsTM4W0JBg0oDwpz/9Cc3NzQCkxp29e/fi22+/NRh3/PhxWFlZmbIUIqIbUtlU\nie+Lvsf3Rd+jXltvcN7eyh7TfKZhpt9MeI70HIAKiUzDpAGho6MDb7/9NgDpOd99+/YZjFEqlRg9\nejRWrFhhylKIiK5Ze2c7MsoycLToKM5WnzU6ZpLrJMSNjUOUVxSfRKAhyaR/qh9//HE8/vjjAIBJ\nkybhk08+QUREhCk/kojohhXVF+FI4RGklKSgub3Z4Pxo69GY7jsdM8bOgLu9+wBUSCQf2WJvTk6O\nXB9FRHTNmtqakFKSgqNFR1FUX2RwXqFQIMw9DHFj4xDqHooRSsNHtImGItkCwtq1a3s9p1QqYWdn\nh3HjxmHOnDlwcnKSqywiGoZ0Qoec6hwcLTyKE+Un0KHrMBjjZu+GGb4zMM13GhxtHAegSqKBJVtA\nKC8vR0ZGBlpbW+Ht7Q03NzfU1NSguLgYSqUSrq6uqKmpwe7du/Hpp59i7NixcpVGRMNEVVMVvi/6\nHj8U/4BLLZcMzluOsES0VzTixsYh0DmQ67jQsCZbQJg1axbOnTuHXbt2dXvUMScnBytXrsSjjz6K\nuXPnYtmyZdi2bRvefPNNuUojoiGstaMV6WXp+L7oe+TV5BkdM85xHGaMnYHYMbGws7STuUKiwUm2\ngPDBBx/gmWeeMVgHYdKkSVizZg3eeOMNLFy4EA8//DDWr18vV1lENAQJIZBfm4/vi75Helk6Wjta\nDcaMtBoJtY8aM3xnwHu09wBUSTS4yRYQ6uvrMWqU8b3Nra2tcemSNN3n4OCA1lbDv8xXVFdXIyEh\nAUePHoVWq0VERAReeOEFBAUFAQCOHDmChIQEFBQUwM/PD88++yxmzZrV/1+IiAadmuYa/FD8A34o\n+sHofghKhRKh7qGY7jsdYR5hfDyR6Cpk+9sRFRWFXbt2ISoqqlsTYn19Pd555x39zMLx48fh4+Nj\n9D10Oh2efPJJCCGwe/du2NnZ4a233sLDDz+MgwcPoqamBsuWLcPy5ctxxx134MCBA1ixYgWSk5MR\nGBgoy/ckInlduYXwQ9EPyK3JNTrGa5QXpvtOh9pbDQcbB5krJDJPsj7FEB8fj1tvvRWxsbFwdnZG\nTU0NMjIyYG1tjQ8++ADff/89EhMTsW7dOqPvkZOTg+PHj+Prr79GQEAAACAhIQEqlQqHDx9GRkYG\nIiMjsWzZMgDAmjVrkJ6ejqSkJGzatEmur0pEJqYTOpytPotjxceQUZaBts42gzG2lraYMmYKZoyd\nAT8HPzYcEl0n2QJCYGAg/vGPf+DDDz+ERqNBUVERPDw88Mgjj+Chhx6Cg4MDTp48iTfeeANz5swx\n+h5eXl549913MX78eP2xK3/p6+vrkZaWhrvvvrvba9RqNQ4ePGi6L0ZEsilrLIOmRINjxceMPoWg\nUCgQ4haCab7TEOERwf0QiG6CrDfgnJ2dsXr16l7Ph4eHG93M6QonJyfMnj2727EPP/wQWq0WcXFx\nePPNN+Hh0X2fdXd3d5SXl99U3UQ0cC63XUZqSSp+KP4BF+suGh3jNcoL03ymQe2j5poFRP1E1oBQ\nWFiIw4cPo6WlBTpd933TFQoFnnjiiet6v0OHDmH79u1YvHgxAgICoNVqDTZ9srKyumrTIxENPu2d\n7ThZcRLHio8hqzILOqEzGGNvZQ+VtwrTfKZhrMNY3kIg6meyBYT9+/fjxRdfNAgGV1xvQNi3bx82\nbNiAOXPm4LnnngMgPQ3R3t7ebVxbWxtsbW1vvHAikoUQAnm1edAUa5Belo6W9haDMRZKC4R7hGOq\nz1SEuIfwKQQiE5Ltb9fu3bsxbdo0bN68GZ6enjeV9t9++20kJiYiPj4e69ev17+Xl5cXKisru42t\nrKw0uO1ARINHWWMZjhUfg6ZEY7SvAAD8nfwxzXcaYrxiYG9lL3OFRMOTbAGhpKQEL7/8Mry8vG7q\nffbs2YPExESsWrXKYIvomJgYpKamdjum0WgQGxt7U59JRP2rTluHlJIUpJSkGN0gCZD2QlB7q6H2\nUXPnRKIBIFtAGDdu3E03C+bk5GDHjh2YP38+FixYgKqqKv05e3t7xMfHY/78+di5cyfmzp2Lr776\nCpmZmXjllVdusnoiulnN7c04XnYcmhINcmtyIYQwGGNvZY8pY6ZA5a2Cv5M/+wqIBpBsAeGpp57C\n7373O/j4+CAqKgoWFtf/0V9//TU6OzvxxRdf4Isvvuh2bvXq1Vi+fDl27dqFhIQE7NmzB/7+/njn\nnXf0ayYQkbzaO9txqvIUNMUaZFVmGd010XKEJcI9wqH2VrOvgGgQUQhjMd4E7r77bpSXl0Or1QIA\nRoww3FM9KytLjlKMKi4uxm233YZDhw71upIjEfVNJ3TIrspGSkkKTpSfgLZDazBGoVBgostEqH3U\niPaKho2FzQBUSjS89fVzT7aoPnfuXLk+iohkJoTA+UvnkVKSgvSydDS2Nhod5+foB5W3CrFjYrle\nAdEgJ1tAePLJJ+X6KCKSgRACRQ1FSC1JRWppaq9PILjbu0PlrYLKWwWPkXyiiMhcyH6z7/jx4zh6\n9CiqqqrwxBNP4Ny5cwgODoaLi4vcpRDRDShrLENqaSrSStNQcbnC6BhHG0fEjomFylvFRYyIzJRs\nAaGtrQ3PPvss/vWvf8HS0hIdHR1YsGAB3n//feTn5+OTTz7B2LFj5SqHiK5DZVMl0krTkFaahpKG\nEqNj7K3sEe0VjSljpiDQJRBKhVLmKomoP8kWEBITE3H06FHs3r0bM2bMQEREBABg8+bNWLJkCXbs\n2IEdO3bIVQ4R9aGmuUYfCgrrC42OsbawRqRnJFTeKkxyncQnEIiGENn+Nh84cABPP/00br31VnR2\nduqP+/j44Mknn8SWLVvkKoWIelHbUov00nSklabhQt0Fo2MsR1gizD0MU7ynIMw9jDsmEg1RsgWE\n+vp6+Pn5GT3n5OSEy5cvy1UKEf2P2pZaZJRlIL00HecvnTc6xkJpgRD3EMR4xSDCM4KPJRINA7IF\nhAkTJuDgwYOIi4szOPftt99yMSMiGdU010ihoCwdBZcKjI5RKpQIdgtG7JhYRHhGwM7STuYqiWgg\nyRYQli1bhpUrV6K+vh633HILFAoFMjIysH//fnz88cfYunWrXKUQDUvVzdX6mYLebh8oFUpMdpss\nhQKPCG6MRDSMyRYQbr/9diQkJGDbtm34z3/+AwD43e9+B2dnZ2zcuBFz5syRqxSiYaPicgUyyjKQ\nUZbRa6PhlVAQ4xWDSM9IhgIiAiDzOgjz5s3DvHnzcP78edTV1WHUqFEICAiAUsnHoYj6gxACpY2l\n+lBQ2lhqdNyV2wfRXtEMBURk1IA8k+Tv79/t96mpqfi///s/rF27diDKITJrQghcrL+IjLIMHC87\njsqmSqPjLJQW+lDAngIi6sugeGj5zJkzSEpKYkAgukY6oUN+bT4yyjJwovxEr8scW46wRKh7KKI8\noxDuEQ5bS1uZKyUiczUoAgIR9a29sx3Z1dk4XnYcmRWZaGprMjrO2sIaYe5hiPKKQph7GKwtrGWu\nlIiGAgYEokGsub0ZWZVZOF52HKerTqO1o9XoODtLO0R4RiDaKxqTXSdz8SIiumkMCESDzKWWS8is\nyMSJ8hM4W30WOqEzOs7RxhGRnpGI8opCoHMgRihHyFwpEQ1lDAhEA0wIgZLGEmSWZyKzIhMX6y72\nOtbd3h1RXlGI9IzEeMfx3CWRiEzGpAHhkUceuaZxpaXGH8UiGqo6dZ3Iq83DyYqTyCzPRHVzda9j\n/Rz9pJkCzyh4jvRkKCAiWZg0ILS3t1/TODc3N7i5uZmyFKIB19zejNOVp3Gy4iSyKrPQ3N5sdJxS\noUSQSxCivKIQ4REBJ1snmSslIjJxQPjwww9N+fZEg151czUyyzNxsuIkcmtye+0nsLGwQah7KCI9\nIxHiHsI1CohowLEHgagf6YQO52rP4VTlKZysOImyxrJexzrZOiHSMxLhHuEIcgmChZJ/HYlo8OC/\nSEQ3qamtCaerTuNUxSmcrjrd6/oEgNRPEO4RjgiPCPiM9mE/ARENWgwIRNdJCIGyy2U4VXEKpypP\nIb82H0IIo2MtR1hisutkhHuEI8wjDI42jjJXS0R0YxgQiK5Ba0crztacxamKU8iqzEJtS22vYx1t\nHBHmEYZwj3BMcp0EqxFWMlZKRNQ/GBCIelHZVKkPBLk1uejQdRgdp1AoMM5xHMLcwxDmEQbf0b68\ndUBEZo8BgehHbZ1tyK3JRVZlFrIqs1DVVNXrWFtLWwS7BSPMPQyh7qEYZT1KxkqJiEyPAYGGLSEE\nKpoqcLryNE5XncbZ6rO9zhIAwJhRYxDqHoowjzAEOAVwaWMiGtIYEGhYaWlvQU51Dk5XncaZqjOo\naa7pday1hTUmuU5CqHsoQt1D4WzrLGOlREQDiwGBhjSd0KGwvhBnqs7gdOVpnL90vtfFigDAa5SX\nPhBMcJ7AtQmIaNjiv3405NS21CK7Khtnqs4guzr7qusS2FjYYLLbZIS4hSDYLRgudi4yVkpENHgx\nIJDZ03ZokVuTizNVZ3Cm6gwqLldcdbyfox+C3YIR4hYCfyd/9hIQERnBgEBmp1PXiQt1F5BdnY3s\nquw+bxuMth6NYLdg/X984oCIqG8MCDToXVm5MKc6B9lV2cityYW2Q9vreMsRlpjgPEE/SzBm1Biu\nS0BEdJ0YEGhQqm2pRU51jv6/em39Vcf7jPbRzxBMcJ4AyxGWMlVKRDQ0MSDQoNDY2oizNWdxtvos\ncqpzUNlUedXxTrZOCHYLxmTXyZjkOom3DYiI+hkDAg2I5vZm5Nbk6gNBaWPpVcfbWdphoutETHad\njMluk+Fm58bbBkREJsSAQLJoaW9BXm0ezlafxdmasyhuKO51B0RA6iMIdA7EJNdJmOQ6Cb4OvlAq\nlDJWTEQ0vDEgkEk0tzcjvzYfuTW5yK3JRWF94VUDgVKhhL+TPya5TsJE14nwd/LnIkVERAOI/wJT\nv2hqa0JebZ4+EPQ1Q6BQKODn4IeJrhMx0WUiJjhPgLWFtYwVExHR1TAg0A2p19YjrzYPeTVSKOir\nh0ChUGCsw1hMdJmIIJcgBLoEwsbCRqZqiYjoejEgUJ+EEKhurkZebR7ya/ORV5PX51MGVwJBkEuQ\nFAicA2FraStTxUREdLMYEMiATuhQ0lCC/Np8KRDU5vW5DoFSocQ4x3EIdAlEkEsQJjhP4AwBEZEZ\nY0AgtHa04kLdBeTX5uPcpXM4V3vuqisVAoCF0gLjncYj0FkKBP5O/uwhICIaQhgQhqE6bZ0UBmrP\n4dylcyiqL7rqXgaAtOvhBOcJmOA8AYEugRjnOI5PGRARDWH8F36I69R1orihGOcvndfPDtS21Pb5\nOkcbRwQ4ByDQORATnCfAe7Q31yEgIhpGGBCGmIbWBhRcKtAHggt1F9De2d7n68aMGqOfIZjgPAHO\nts5cqZCIaBhjQDBjHboO/ezA+UvnUXCpANXN1X2+zmqEFcY5jkOAcwAmOE+Av5M/7CztZKiYiIjM\nBQOCmRBCoKalBgWXClBQV4CCSwUorC9Eh66jz9e62LnA38kfAU4B8Hfy57LFRETUJwaEQepy22Vc\nqLuAC3UXUHCpABfqLuBy2+U+X2ehtICfo1+3QOBg4yBDxURENJQwIAwCrR2tKKwv1AeCC3UXrulW\nAQC42rnC38kf453Gw9/JHz6jffh0ARER3bQh+ZOks7MTiYmJSE5ORlNTE2bOnImNGzfC1dV1oEtD\ne2c7ihqKcLHuIi7WX8SFugsov1x+1X0LrrCztMM4x3EY5zgO453GY7zjeIyyHiVD1URENNwMyYDw\n1ltvITk5Gb///e/h6OiIV199FStXrsSnn34qax1XwkBhfSEu1l1EYX0hShtL+1xzAJBuFfg6+HYF\nAsfxcLd355MFREQkiyEXENra2pCUlIT169djxowZAIDt27fjtttuQ0ZGBqKjo03yudoOLYobilFY\nX6gPBOWXy68pDCgUCniN9NKHgXGO4+A92pu3CoiIaMAMuZ9AOTk5aGpqgkql0h/z8fGBt7c30tLS\n+iUgNLY2oqihCEX10uxAUUMRKpsqr+k2AQB4jPTAOMdx8HPwg5+jH3xH+3KZYiIiGlSGXEAoLy8H\nAHh4eHQ77u7urj93I05XnsZ/L/wXRfVFqNPWXdNrFAoF3O3d9UFgrMNYjHUYy02MiIho0BtyAaGl\npQVKpRKWlpbdjltZWaG1tfWG3rO5vRk7NTuvOkapUMJzpKc+BIx1GAtfB1+GASIiMktDLiDY2NhA\np9Oho6MDFhZdX6+trQ22trY39J5KhRKONo76mQPLEZbwGe0Dn9E++jDgPcobliMs+3gnIiIi8zDk\nAoKXlxcAoKqqSv9rAKisrDS47XCtbCxs8NLMl1DUUAQXWxd4jPTgSoRERDSkDbmAMGnSJNjb2yMl\nJQX33nsvAKC4uBglJSWYMmVKr6/r7OwEgKv2KTjCEZ1tnSitL+3foomIiGR25efdlZ9/PQ25gGBl\nZYUHH3wQW7duhZOTE1xcXPDqq69CpVIhMjKy19dVVVUBABYtWiRXqURERAOuqqoKfn5+BscV4lqf\nzTMjHR0deOONN5CcnIyOjg79SorOzs69vkar1SIrKwtubm4YMWKEjNUSERHJr7OzE1VVVQgNDYWN\njWFD/ZAMCERERHRz2GlHREREBhgQiIiIyAADAhERERlgQCAiIiIDDAjXoLOzE9u2bUNcXByioqKw\natUqVFdXD3RZJlVdXY0XXngBcXFxiI2NxaOPPorc3Fz9+SNHjuDee+9FeHg45s2bh8OHDw9gtfI4\nceIEgoODodFo9MeG23XYu3cv7rzzToSHh+P+++/HDz/8oD83XK5Fc3MzNm3apP+78dhjjyE/P19/\nfjhch40bN2LdunXdjvX1vWtqarB69WrExsZi2rRpSEhIQEdHh5xl9ztj1+Gjjz7CXXfdhcjISMyZ\nMwd79+7tdt6sroOgPu3YsUPMmDFDHDlyRGRlZYkHHnhALFy4cKDLMpnOzk7xy1/+UixYsEBkZmaK\nvLw8sWrVKjFt2jRRW1sr8vLyRGhoqNi9e7fIz88XO3bsECEhISI3N3egSzeZpqYmcfvtt4ugoCBx\n7NgxIYQYdtdh3759IiQkROzdu1dcuHBBbNmyRURGRoqioqJhdS1eeuklcdddd4m0tDSRn58vli9f\nLmbNmiW0Wu2Qvw46nU4kJiaKoKAg8dJLL+mPX8v3/tWvfiUefPBBkZ2dLb755hsxdepUsX379oH4\nGjett+vw8ccfi8jISPHll1+Kixcvis8//1yEhISI5ORk/Rhzug4MCH1obW0VUVFR4osvvtAfKyoq\nEkFBQSI9PX0AKzOd06dPi6CgIJGfn68/1traKiIiIkRycrLYsGGDiI+P7/aa+Ph4sX79erlLlc2V\n7/y/AWE4XQedTiduueUWkZiYqD/W2dkp7rnnHrF///5hdS1UKpVISkrS/z4vL08EBQWJrKysIX0d\nCgsLRXx8vFCr1WL27NndfjD29b0zMjJEUFCQKCws1J/ft2+fiIqKEq2trfJ8gX5yteswb948sXXr\n1m7j165dKx566CEhhPldB95i6ENOTg6ampqgUqn0x3x8fODt7Y20tLQBrMx0vLy88O6772L8+PH6\nYwqFAgBQX1+PtLS0btcDANRq9ZC9HocPH8Y333yD9evXdzs+nK7D+fPnUVJSgjlz5uiPKZVK/P3v\nf8e8efOG1bVwdnbG119/jZqaGrS1teFvf/sbHBwc4OvrO6SvQ0ZGBry8vHDgwAH4+Ph0O9fX905L\nS4O3tzd8fX3151UqFZqampCdnW364vvR1a7D+vXrsXDhwm7HlEolGhoaAJjfdWBA6MOVtap7bvTk\n7u5+1X0bzJmTkxNmz54NpbLrj8eHH34IrVaLuLg4lJeXD5vrUVtbi3Xr1mHz5s1wcHDodm44XYcL\nFy4AABoaGvDrX/8a06ZNw6JFi5CRkQFgeF2LTZs2oby8HNOnT0dkZCQ+//xz/PGPf8To0aOH9HW4\n9957sXXrVri5uRmc6+t7V1RUwN3d3eA8AJSVlZmoYtO42nVQqVTdfviXlpbi4MGDmDlzJgDzuw4M\nCH1oaWmBUqmEpWX3rZytrKzQ2to6QFXJ69ChQ9i+fTsWL16MgIAAaLVaWFlZdRszVK/Hyy+/jFtv\nvRU/+clPDM4Np+tw+fJlAMCLL76IBx54AO+99x4CAwPxm9/8BufOnRtW1+LixYtwdXXFH//4R3z6\n6aeIi4vDqlWrUF5ePqyuw//q63u3tLTA2tq623lLS0soFIohe21qa2vxxBNPwNXVFY8//jgA87sO\nQ26zpv5mY2MDnU6Hjo4OWFh0Xa62tjbY2toOYGXy2LdvHzZs2IA5c+bgueeeAwBYW1ujvb2927ih\neD2Sk5Nx5swZ7N+/3+j54XIdAOgD8tKlSzFv3jwAQHBwMNLT0/Hpp58Om2tRVFSEDRs24JNPPtFv\n/rZt2zbMmTMHH3zwwbC5Dj319b1tbGzQ1tbW7Xx7ezuEELCzs5OtTrkUFRXhscceg1arxUcffYRR\no0YBML/rwIDQBy8vLwDSbldXfg0AlZWVBlNqQ83bb7+NxMRExMfHY/369fo+BC8vL1RWVnYbOxSv\nx759+1BRUYG4uDgAgPhx25IlS5bg5z//+bC5DkDXNGhQUJD+mEKhgL+/P4qLi4fNtcjKykJnZydC\nQ0P1xywtLTF58mRcvHhx2FyHnvr63p6engaPPV4ZP9SuzenTp7FkyRI4ODjgr3/9a7efG+Z2HXiL\noQ+TJk2Cvb09UlJS9MeKi4tRUlKCKVOmDGBlprVnzx4kJiZi1apV2LBhgz4cAEBMTAxSU1O7jddo\nNIiNjZW7TJN64403cPDgQXz55Zf48ssv8d577wEANm/ejNWrVw+b6wAAISEhsLOzw6lTp/THhBA4\nd+4cfH19h8218PT0BACcPXtWf+zKdRg3btywuQ499fW9Y2JiUFRU1O0+u0ajgb29PSZNmiRrraZ0\n7tw5PPLII/D29sYnn3zSLRwAZngdBvQZCjORkJAgpk+fLg4fPqxfB6HnIz1DSXZ2tpg8ebJYu3at\nqKys7PZfU1OTyMnJESEhIeLNN98U+fn5IjExUYSFhXV7LHIoKisr6/aY43C7Djt27BBTpkwRYu8k\nBAAAIABJREFU//znP0VBQYH43e9+J8LCwsS5c+eGzbXo6OgQCxYsED/72c9EamqqyM/PFxs2bBCR\nkZGiuLh42FyH+Pj4bo/39fW9dTqdWLBggfjlL38psrKy9M//79y5c6C+Qr/oeR3mz58v4uLixPnz\n57v9u1lTUyOEML/rwIBwDdrb28Vrr70mVCqViI6OFqtXr9b/Dz4Ubdu2TQQFBRn97w9/+IMQQoj/\n/ve/Ys6cOSI0NFTcc8894ujRowNcten1DAhCDK/roNPpxDvvvCNmzZolQkNDxQMPPCBSU1P154fL\ntaipqRHr1q0TM2fOFDExMeI3v/mNOHPmjP78cLgOPX8wCtH3966srBTLly8XERERYvr06WLbtm2i\ns7NTzrL73f9eh/Pnz/f67+ZPf/pT/WvM6ToohPjxxioRERHRj9iDQERERAYYEIiIiMgAAwIREREZ\nYEAgIiIiAwwIREREZIABgYiIiAwwIBAREZEBBgQiIiIywIBAREREBhgQiIiIyAADAhERERlgQCAi\nIiIDFgNdwGCh1WqRlZUFNzc3jBgxYqDLISIiMqnOzk5UVVUhNDQUNjY2BucZEH6UlZWFRYsWDXQZ\nREREsvr4448RGxtrcJwB4Udubm4ApAvl6ek5wNUQERHdICGAixeBqiogKAhwcDA6rLy8HIsWLdL/\n/OuJAeFHV24reHp6wsfHZ4CrISIiuk5lZYBGI/1XWysdy8oCNmy46st6u63OgEBERGSu6uqA1FQp\nFBQVGZ5XKG74rRkQiIiIzIlWC2RkACkpQE6OdEuhJzs7IDYWmDv3hj+GAYGIiGiw6+gAzpyRZgoy\nM4H2dsMxFhZAeDgwdSoQEiL9/iYwIBAREQ1GQgDnz0uhIC0NaGoyHKNQABMnAioVEB0N2Nr228cz\nIBAREQ0mFRVdzYbV1cbH+PhIoUClApycTFIGAwIREdFAa2joaja8eNH4GCcnKRCo1YC3t8lLYkAg\nIiIaCK2twPHjUrPhmTPGmw1tbYGYGCkUBAbe1FMJ14sBgYiISC46XVez4YkTQFub4RgLCyAsTAoF\noaGApaX8dYIBgYiIyLSurGx47JjUbNjYaHxcUJB0CyEmRnpMcYAxIBAREZlCZaV0+0CjkX5tzJgx\n0kyBSgU4O8tbXx8YEIiIiPpLY6M0S6DRAAUFxsc4OgJTpkjrFXh7y9pXcD0YEIiIiG5GW5u0eJFG\nA5w+LfUZ9GRjI61ToFZLtxKUSvnrvE4MCERERNdLpwPOnpX6Co4fl55I6EmplJoNVSogImLAmg1v\nFAPCMDJx4kQsX74cX3zxBQDgiy++6HWbTyIi6kEIoLBQ6itISZHWLjAmIECaKYiJAUaOlLfGfsSA\nMMzs3bsXe/bsQXt7O8MBEdG1qK7uajYsLzc+xsND6ilQqQBXV3nrMxEGhJvx738DBw4Yn1oyNWtr\nYN484Pbbr+tl9913HyZPnmyiooiIhoimJiA9XbqFcO6c8TGjR0vNhmo1MHbsoG02vFEMCDfj3/8e\nmHAASJ/7739fd0Dw9fU1UUFERGauvR04eVKaKcjKAjo7DcdYWwNRUVIomDTJLJoNbxQDws24/faB\nnUG4znAgvczaBMUQEZkpnQ7IzZVCQUYGoNUajlEqgeBg6RZCeLj07+8wwIBwM26//YZ+SBMR0QAS\nAigpkUJBSgpQV2d83Pjx0kxBbCwwapS8NQ4CDAhERDQ81NZ2NRuWlhof4+7etbKhu7u89Q0yDAhE\nRDR0NTdLzYYpKdKtBGNGjZJmCaZOBfz8hlyz4Y0yy4CQn5+PuXPnGhz/+OOPERsbiyNHjiAhIQEF\nBQXw8/PDs88+i1mzZg1ApYPL2bNnB7oEIiLT6+gATp2SZgpOnZJ+35OlJRAZKc0WBAcDI0bIX+cg\nZ5YBITc3F05OTjhw4EC3446OjsjPz8eyZcuwfPly3HHHHThw4ABWrFiB5ORkBAYGDlDFRERkUkIA\neXnSTEF6ujRz0JNCIYUBlUoKBzY28tdpRsw2IEyYMMHoQj9JSUmIjIzEsmXLAABr1qxBeno6kpKS\nsGnTJrlLJSIiUyotlWYKNBrg0iXjY/z8pJmCKVOktQvomphlQMjLy4O/v7/Rc2lpabj77ru7HVOr\n1Th48KAcpRERkanV1XU1GxYXGx/j6irNFKjVgKenvPUNEWYbEFpbW7FgwQKUlJQgMDAQTz/9NMLD\nw1FeXg4PD49u493d3VHe2/KYREQ0+Gm10joFGo20SZIQhmPs7aVmQ7Ua8Pdns+FNMruAoNVqUVRU\nBGdnZzz//POwsrLCRx99hPj4eCQnJ0Or1cLKyqrba6ysrNA6UCseEhHRjenokLZPTkmRtlNubzcc\nY2kp7ZR4pdnQwux+rA1aZnclbWxskJqaCisrK30QeP3113H69Gl88sknsLa2RnuPP0RtbW2wtbUd\niHKJiOh6CAGcPy/NFKSlSXsi9KRQABMnSqEgOprNhiZidgEBAEb22D5TqVRiwoQJKCsrg5eXFyor\nK7udr6ysNLjtQEREg0h5edfKhtXVxsf4+nY1Gzo6ylvfMGR2ASErKwu//vWvkZSUhNDQUABAZ2cn\ncnJycNddd8HFxQWpqandXqPRaBAbGzsQ5RIRUW8aGoDUVCkYXLxofIyzc1ez4Zgx8tY3zJldQJg0\naRK8vb2xceNGvPzyy7Czs8OePXtw6dIl/PrXv0Z1dTXmz5+PnTt3Yu7cufjqq6+QmZmJV155ZaBL\nJyKi1lbg+HEpFGRnG282tLMDYmKkUDBhApsNB4hsASE/Px9fffUVNBoNSkpK0NjYCCcnJ4wZMwYz\nZ87ET3/6UwQEBPT5PhYWFnjvvfewdetWLF26FC0tLYiOjsZHH30EFxcXuLi4YNeuXUhISMCePXvg\n7++Pd95555rem4iITKCzUwoDx44BJ04Ybza0sADCwqRQEBbGZsNBQCGEsfjWf86fP4+EhAR88803\n8PDwQGhoKLy9vWFra4uGhgaUl5fj+PHjqKurw2233YY1a9ZgwoQJpizJqOLiYtx22204dOgQfHx8\nZP98IqIhRQjgwoWuZsPGRuPjgoKkWwgxMdLMAcmmr597Jo1o7733Ht577z3MmzcPn332GcLDw3sd\ne/LkSXz++ed48MEHsWTJEixZssSUpRERkSlUVnY1G/ZoGNcbM0baGGnKFKnHgAYlkwaE8+fP4+DB\ng3BxcelzbHh4OMLDw7Fy5UokJiaasiwiIupPjY3SLMGxY9KsgTGOjl3NhpylNQsmDQhbtmy57td4\neHjgtddeM0E1RETUb1pbgZMnpVBw5gyg0xmOsbGRbh2oVNKtBKVS/jrphsneBdLS0oKGhgaj57hW\nARHRIKbTSc2GKSnSkwjGVqgdMQIIDZVmCsLDpZUOySzJFhBycnLw/PPPIy8vr9cx2dnZcpVDRETX\nQgigsFDqK0hNldYuMGbCBCkUxMRIeyKQ2ZMtILz88suora3F888/D0eugEVENLhVV0szBceOARUV\nxsd4ekqhQKWSdk+kIUW2gHD27Fns2LEDt9xyi1wfSURE16OpSWo21GiAc+eMjxk9uqvZ0NeXixgN\nYbIFBF9fX7S0tMj1cUREdC3a26WdElNSgKwsaVGjnqytgago6dHEiRPZbDhMyBYQnn76abz++utw\ndXVFeHg4bLj7FhHRwNDpgNxcaaYgIwPQag3HKJVASIg0UxARAfy4ey4NH7IFhHHjxkEIgd/85jdG\nzysUCpw5c0aucoiIhhchgOJiaaYgJQWoqzM+bvx4KRTExgKjRslbIw0qsgWEtWvXoqGhAYsWLbqm\nhZOIiKgf1NZKgUCjAUpLjY9xd+9qNnR3l7c+GrRkCwhnzpzBG2+8gTvuuEOujyQiGp6am4H0dCkU\n9PZo+ahR0izB1KmAnx+bDcmAbAHB29tbro8iIhp+2tulJkONBjh1CujoMBxjZQVERkqzBZMnS4sa\nEfVCtoCwevVqbN++Hc7OzggPD4cVG16IiG6OENIMgUYjzRgYe1JMoQCCg6VQEBkpPZFAdA1kCwh/\n+MMfUFFRgYceeggAMMJIcs3KypKrHCIi81VaKoUCjQa4dMn4mHHjpJ6CKVOktQuIrpNsAeHOO++U\n66OIiIaeS5ekpY41GulpBGNcXaWZArUa4N42dJNkCwhPPvmkXB9FRDQ0tLRI6xSkpABnz0q3FHqy\nt5eaDdVqwN+fzYbUb2TdzbGqqgpnzpwxupujQqHAz372MznLISIafDo6gNOnpT0QTp403mxoaSkt\nXqRWS/0FFrJvzEvDgGx/qr7++musXbsWrca2BwUDAhENY0JIex9caTZsajIco1AAkyZJfQXR0QBX\noyUTky0gJCYmIiwsDGvXruVujkREAFBW1rWIUU2N8TG+vtJMwZQpAP/tJBnJFhAqKyvx29/+FiEh\nIXJ9JBHR4FNfLzUbpqQAFy8aH+Pi0rVjopeXvPUR/Ui2gBAZGYmcnBxMnTpVro8kIhoctFrgxAmp\nryAnx3izoZ2d1GyoUgETJrDZkAacbAHh5ZdfxtKlS3H58mWEhYXBzs7OYMyUKVPkKoeIyLQ6O4Ez\nZ6TbBydOSCsd9mRhAYSHS6EgLIzNhjSoyPan8fz586iursauXbsASE2JVwghoFAokJ2dLVc5RET9\nTwjgwgUpFKSmApcvGx8XFCTdPoiOlmYOiAYh2QLC1q1b4e/vjyVLlnA3RyIaWioru1Y2rKoyPmbM\nGGljpClTAGdneesjugGyBYTy8nK88sormDZtmlwfSURkOo2NXSsbXrhgfIyjY9c2yj4+spZHdLNk\nCwihoaEoKChgQCAi89XaKvUTpKRI/QU6neEYGxsgJkYKBoGBgFIpf51E/UC2gLBy5Uo8++yzuHTp\nEsLDw2Fvb28wJjo6Wq5yiIiujU4HZGd3NRsaW+xtxAggNFS6hRAWJq10SGTmZAsIDz/8MADgrbfe\nAsAmRSIaxISQ1ihISZH+a2w0Pi4wULp9EBMj7YlANITIFhCSkpLk+igiohtTXd3VbFhRYXyMl1dX\nXwEbrmkIky0gqFQquT6KiOjaXb4MpKVJMwXnzhkf4+AgPX0wdarUbMhFjGgYMGn3zCOPPIJzvf2F\n60VOTo7+dkRfTpw4geDgYGg0Gv2xI0eO4N5770V4eDjmzZuHw4cPX9fnE9Ew0NYmhYI//AF47jng\n008Nw4G1NTBtGrBmDfD668ADD0j7IjAc0DBh0hmE++67Dw899BBiYmIwb948zJo1C9bW1gbjWlpa\ncPToUXz++efIzMzEunXr+nzv5uZmPP/88+js7NQfy8/Px7Jly7B8+XLccccdOHDgAFasWIHk5GQE\nBgb263cjIjOj0wFnz0q3D44fl5Y/7kmplJoN1WpphUMrK/nrJBokTBoQ5s2bh6lTp2L37t14/vnn\nIYRAYGAgfHx8YGtri8bGRpSXlyMnJwdKpRK/+MUvsHnzZri7u/f53q+//jo8PDxw8X82O0lKSkJk\nZCSWLVsGAFizZg3S09ORlJSETZs2mex7EtEgJQRQXNy1smFdnfFx/v5SKIiJAUaNkrdGokHK5D0I\nbm5uePnll7Fy5Ur861//gkajQVFRERobG+Hk5AQ/Pz88+OCDuOWWW+Dk5HRN73n48GF888032LNn\nD+655x798bS0NNx9993dxqrVahw8eLBfvxMRDXI1NV3bKJeVGR/j4dG1Y6Kbm7z1EZkB2ZoUnZ2d\nsXDhQixcuPCm3qe2thbr1q3Dli1b4ODg0O1ceXk5PDw8uh1zd3dHeXn5TX0mEZmBpiYgI0MKBXl5\nxseMGiWFApUK8PNjPwHRVZjd1mEvv/wybr31VvzkJz8x+MGv1Wph1eOeoZWVFVqNLWxCROavvR04\ndUoKBadOSTso9mRlBURFSTMFkydzZUOia2RWASE5ORlnzpzB/v37jZ63trZGe48tVdva2mBraytH\neUQkByGkGYJjx6QZg5YWwzEKBRAcLIWCyEjpiQQiui5mFRD27duHiooKxMXFAZBWYASAJUuW4Oc/\n/zm8vLxQWVnZ7TWVlZUGtx2IyAyVlEgzBSkpwKVLxseMGyeFgthYYPRoWcsjGmrMKiC88cYb0P7P\no0lVVVVYtGgRNm/ejBkzZiAxMRGpqandXqPRaBAbGyt3qUTUHy5d6lruuLjY+BhXV2kBI5VKajwk\non5hVgGh50zAlTUVPDw84OLigvj4eMyfPx87d+7E3Llz8dVXXyEzMxOvvPLKAFRLRDekpaWr2TA3\nV7ql0JO9vbSyoVoNjB/PZkMiE5A1IKSmpsLS0hKRkZEoLS3Fpk2bUF5ejrvuugtPPPHETb//xIkT\nsWvXLiQkJGDPnj3w9/fHO++8g4CAgH6onohMpqMDyMqSQsHJk9Lve7K0lPoJVCogJETaQZGITEa2\ngPDll19i7dq1eOSRRxAZGYmNGzciPT0dM2bMwK5du6BUKrFkyZLrek9PT0+cPXu227HZs2dj9uzZ\n/Vg5EZmEEEB+vnT7IC0NaG42HKNQAJMmSTMFUVGAjY38dRINU7IFhA8++AD33XcfnnvuOVRVVeH7\n77/HM888g0cffRR/+tOf8Nlnn113QCAiM1RW1tVsWFNjfIyvr9RXEBsLODrKWx8RAZAxIBQUFOCl\nl14CIK2EKITAbbfdBgAICwtDYmKiXKUQkdzq6qRZgmPHgKIi42NcXLpWNvTykrc+IjIgW0AYNWoU\nLl++DAD47rvvMGbMGIwbNw4AUFhYeM3LLBORmdBqpU2RNBogJ8d4s6GdnTRLoFIBEyaw2ZBoEJEt\nIKjVauzatQv5+fk4dOgQFi9eDAD45z//iTfffBMzZ86UqxQiMpXOTuD0aSkUZGZKKx32ZGEh7ZSo\nVks7J1qY1cNURMOGbH8z161bh+eeew67du3CtGnT9E8tvPbaa/D19cUzzzwjVylE1J+EAAoKpFCQ\nlgb8OFPYjUIBBAZKfQXR0QBXNyUa9GTdrOn99983OP7ZZ59xpUMic1RR0bVjYlWV8TE+PtJMwZQp\nAG8jEpkV2QJCRUVFn+cYFIgGuYYGaZZAowEuXDA+xsmpq9nQ21vW8oio/8gWEGbNmgVFHw1I2dnZ\nMlVDRNestRU4cUIKBdnZgE5nOMbWVrp1MHWqdCuBzYZEZk+2gLBlyxaDgNDc3Iy0tDRoNBps2bJF\nrlKIqC86nRQGNBopHBjbMn3ECCAsTJopCAuTVjokoiFDtoBw//33Gz2+aNEivPbaazhw4ABXQCQa\nSEIAFy9KoSA1FWhsND4uMFAKBdHR0p4IRDQkDYrni2699VYsX758oMsgGp6qqrpWNuytV8jLSwoF\nKpW0oBERDXmDIiBkZmbCgs9CE8mnsRFIT5eCwfnzxsc4OEhPH0ydKj2NwL4ComFFtp/KGzZsMDjW\n2dmJ8vJyHDt2DL/4xS/kKoVoeGprkxYv0mikxYyMNRva2Ei3DlQqYOJEQKmUv04iGhRkCwhHjx41\nOKZQKDBy5EgsWbIES5culasUouFDpwPOnpVCQUaG8WZDpVJa0VCtBiIi2GxIRABkDAj/+c9/5Poo\nouFNCKC4WNoYKTUVqK83Pi4gQAoFMTHAyJHy1khEgx5v/BMNFTU1XSsblpUZH+PhIfUUqFSAq6u8\n9RGRWTFpQAgNDcUnn3yC8PBwhISE9LlQUlZWlinLIRp6mpq6mg3z842PGTWqa2XDsWPZbEhE18Sk\nAWHp0qX65ZOXLl3aZ0AgomvQ3g6cOiXdQsjKknZQ7MnaGoiMlELB5MlsNiSi62bSgPDkk0/qf71y\n5UpTfhTR0CYEkJvb1WzY0mI4RqkEgoO7mg2treWvk4iGDJMGhIyMjOsaHx0dbaJKiMxUcbHUV5CS\nAly6ZHzMuHFSX0FsrHQ7gYioH5g0IDz44IO93lYQQgBAt/PcrIkIUhC40mxYUmJ8jJubNFOgVgPu\n7vLWR0TDgkkDQlJSkv7XpaWl2LBhA+bPn4+7774bbm5uqKurw3/+8x/89a9/xW9/+1tTlkI0uDU3\nA8ePS30FeXnSLYWeRo6UVjZUqYDx49lsSEQmZdKAoFKp9L9+6KGH8PDDD+OZZ57pNiY6Oho2Njb4\n85//jDlz5piyHKLBpaNDajLUaICTJ6Xf92Rp2dVsGBws7aBIRCQD2dZBOHnyJJYtW2b0XFRUFPbs\n2SNXKUQDRwjpcUSNRno8sbnZcIxCAUyaJPUVREZKyx8TEclMtoDg6emJ7777DtOnTzc4989//hNj\nx46VqxQi+ZWVSaFAowFqa42PGTtWmimYMkXaKImIaADJFhAWL16MV155BVVVVbj11lvh7OyMmpoa\n/L//9//wf//3f9i+fbtcpRDJo65OWupYowGKioyPcXHp2kbZy0ve+oiIrkK2gLBw4UJ0dHTg7bff\nxldffaU/7uXlhTfeeAN33323XKUQmY5WK61ToNFImyQZaza0s5MeSZw6FfD3Z7MhEQ1Ksu7FEB8f\nj/j4eJw7dw4NDQ1wcnLCuHHj5CyBqP91dABnzkihIDNTWumwJwsLafEitRoICZF+T0Q0iA3Iv1IB\nAQHdft/W1oa0tDSj/QlEg5IQQEGBFApSU6U9EXpSKICgICkUREcDtrby10lEdINkCwilpaV49dVX\nkZKSgvb/+X9YOp1Ov2gSF0qiQa+ioqvZsLra+Bgfn65mQycneesjIuonsgWE119/HWlpaZg/fz4y\nMjJga2uLyMhIHD16FLm5uXjrrbeu+b3Ky8uxZcsWHDt2DDqdDjNnzsSLL76o3xjqyJEjSEhIQEFB\nAfz8/PDss89i1qxZpvpqNNQ1NHQ1G168aHyMk1PXjone3vLWR0RkArJt8abRaPDUU09h/fr1uP/+\n+2FtbY3nnnsOX3zxBWJjY3Ho0KFreh8hBB5//HE0NDQgKSkJH330EaqqqvRrLOTn52PZsmW46667\nkJycjNtuuw0rVqxAXl6eKb8eDTWtrVIg2LkTeP554PPPDcOBrS0QFwc88wzw2mvA/fczHBDRkCHb\nDEJTUxMmTpwIAPD398euXbsAACNGjMCiRYvw+9///prep7q6GgEBAXjmmWfg4+MDAHj44YexYsUK\n1NfXIykpCZGRkfrAsGbNGqSnpyMpKQmbNm0ywTejIUOn62o2PHECaGszHGNhAYSFSTMFoaHSSodE\nREOQbAHB3d0d1T/es/Xz80N9fT2qqqrg5uYGR0dH1NTUXNP7uLm5YceOHfrfl5eX47PPPkNYWBgc\nHByQlpZm8MikWq3GwYMH++/L0NAhhDQzcOwYkJYGNDYaHxcY2NVsaG8vb41ERANAtoAwc+ZM7Ny5\nE2PGjEFERAQ8PT3x5z//GStXrsSXX36p7x+4HsuXL8ehQ4fg4OCg3xiqvLzc4L3c3d1RXl7eL9+D\nhojKyq4dEysrjY/x8upaxMjFRd76iIgGmGwBYfXq1Xjsscewfft2/OUvf8FTTz2FF198EX/+858B\nABs3bryh91y6dCl2796NxYsX48svv4RWq4WVlVW3cVZWVmhtbe2X70FmrLFRmiVISQHOnzc+xsGh\nq9nQx4eLGBHRsCVbQHB2dsa+fftQUVEBALjnnnswZswYnDhxAuHh4d12frxWV3oaduzYgdmzZyM5\nORnW1tbdHqMEpHUWbPkM+vDU1iYtXqTRAKdPS30GPdnYSLcO1Gpp3QKlbL27RESDluwLJf3v9H9s\nbCxiY2MhhMDHH3+MRYsW9fn66upqaDQazJ07V3/M1tYWvr6+qKiogJeXFyp7TBlXVlbe0C0MMlM6\nnbTM8bFjwPHj0hMJPSmVUpOhWi2tcMhmQyKibkweEL799lskJydDoVDg3nvvNViPIC0tDZs3b8bZ\ns2evKSCUlpbi6aefxtixYxEWFgYAaGxsREFBAe677z50dHQgNTW122s0Gg1iY2P770vR4COEtCGS\nRiPdQmhoMD4uIEAKBTExwMiR8tZIRGRGTBoQ9u/fj+effx6WlpawsrLCP/7xD+zcuRO333476urq\nsHnzZhw8eBAjRozA4sWLr+k9Q0NDERsbi/Xr12PTpk2wsLDAtm3b4OzsjJ///OcoLi7G/PnzsXPn\nTsydOxdfffUVMjMz8corr5jyq9JAqa7uajbsrRHVw0PaGEmlAlxd5a2PiMhMmTQg/OUvf0FERATe\nf/99WFlZYe3atdi9ezcCAwOxePFilJWVYebMmXjppZcwfvz4a3pPpVKJt956C1u3bsUTTzyB1tZW\nxMXF4aOPPoK9vT0mTpyIXbt2ISEhAXv27IG/vz/eeecdg/0fyIw1NQHp6dIthHPnjI8ZPVpa6lit\nBsaOZbMhEdF1MmlAuHDhAjZt2oSRP07lrlixAnPnzsWKFSvQ1taGN998E3feeed1v6+zszNef/31\nXs/Pnj0bs2fPvtGyaTBqbwdOnpRmCrKygM5OwzHW1kBUlBQKJk1isyER0U0waUBobm6Gl5eX/vc+\nPj4QQmDEiBHYv38/XPhsOV2NEEBurhQK0tMBrdZwjFIJBAd3NRtaW8tfJxHREGTSgHAlDFxx5ddr\n1qxhOKDeFRd3NRvW1RkfM368FApiY4FRo+Stj4hoGJD9MUcAfOSQDF26JAWCY8eA0lLjY9zdu1Y2\ndHeXtz4iomFmQAKCgg1jBADNzUBGhjRbkJtrfMzIkVKzoUolzRrwzw4RkSxMHhA2b96sb1IUQgAA\nXn31Vdj32PBGoVDg/fffN3U5NNA6OoBTp6RQcOqU9PueLC2ByEjp0cTJk4H/uU1FRETyMGlAmDJl\nCgB0W/rY2DEa4oQA8vO7mg2bmw3HKBRSGFCrpXBgYyN/nUREpGfSgPDhhx+a8u1psCst7Wo2rK01\nPsbPr6vZ0MFB3vqIiKhXA9KDQENYXR2QmioFg6Ii42NcXLqaDf/nMVgiIho8GBDo5mm1Xc2GZ89K\ntxR6sreXZgnUasDfn82GRESDHAMC3ZiODmn75JQUaTtlYz0llpbS4kUqFRASAljwjxt1YFjIAAAT\nRUlEQVQRkbngv9h07YQAzp+X1ipIT5f2ROhJoQAmTpRmCqKj2WxIRGSmGBCob+XlXc2G1dXGx/j6\nSjMFKhXg6ChvfURE1O8YEMi4hoauZsOLF42PcXaWAoFaDYwZI299RERkUgwI1KW1FTh+XAoF2dnG\nmw3t7ICYGCkUTJjAZkMioiGKAWG46+yUwsCxY1KzYVub4RgLCyAsTAoFYWFsNiQiGgb4L/1wJARw\n4YI0U5CWBjQ2Gh8XFCTdQoiJkWYOiIho2GBAGE4qK6VQoNEAVVXGx4wZ07WIkbOzvPUREdGgwYAw\n1DU2SrMEGg1QUGB8jKNj1xMIPj7sKyAiIgaEIamtTeonOHYMOHMG0OkMx9jYSOsUqNXSrQSlUv46\niYho0GJAGCp0OiAnR5opOH5ceiKhpxEjgNBQKRSEh0srHRIRERnBgGDOhAAKC6VQkJoqrV1gTEAA\nMHWq1Gxoby9vjUREZJYYEMxRdbW0qqFGI61yaIyHhxQKVCrA1VXe+oiIyOwxIJiLpqauZsNz54yP\nGT26q9lw7Fg2GxIR0Q1jQBjM2tulZkONBsjKMt5saG0NREVJfQWTJrHZkIiI+gUDwmCj0wG5uVIo\nyMgAtFrDMUolEBws3UIID5dCAhERUT9iQBgMhACKi6W+gpQUoK7O+Dh/f+n2QWwsMGqUvDUSEdGw\nwoAwkGpru5oNS0uNj3F371rZ0N1d3vqIiGjYYkCQW3MzkJ4uhYK8PONjRo2SZgmmTgX8/NhsSERE\nsmNAkEN7u9RkqNEAp04BHR2GY6ysgMhIabZg8mRpUSMiIqIBwoBgKkJIMwQajTRj0NJiOEahkJoN\n1WopHLDZkIiIBgmzCwjV1dVISEjA0aNHodVqERERgRdeeAFBQUEAgCNHjiAhIQEFBQXw8/PDs88+\ni1mzZslXYGmptAdCSgpw6ZLxMX5+UiiYMkVau4CIiGiQMauAoNPp8OSTT0IIgd27d8POzg5vvfUW\nHn74YRw8eBA1NTVYtmwZli9fjjvuuAMHDhzAihUrkJycjMDAQNMVVlfX1WxYXGx8jKurFArUammV\nQyIiokHMrAJCTk4Ojh8/jq+//hoBAQEAgISEBKhUKhw+fBgZGRmIjIzEsmXLAABr1qxBeno6kpKS\nsGnTpv4tpqVF2hRJowHOnpVuKfRkby81G6rV0iOKbDYkIiIzYVYBwcvLC++++y7Gjx+vP6b48Ydu\nfX090tLScPfdd3d7jVqtxsGDB/ungI4O4PRpKRRkZhpvNrS0BCIipFAQHAxYmNUlJiIiAmBmAcHJ\nyQmzZ8/uduzDDz+EVqtFXFwc3nzzTXj0mL53d3dHeW8bGl2P//4XOHBA2hOhJ4VCWuZYpQKiowEb\nm5v/PCIiogFkVgGhp0OHDmH79u1YvHgxAgICoNVqYWVl1W2MlZUVWltbb+6DGhqAv/7V8Livb9fm\nSI6ON/cZREREg4jZBoR9+/Zhw4YNmDNnDp577jkAgLW1Ndrb27uNa2trg62t7c19mI0NMGaM9ISC\ni0tXKBgz5ubel4iIaJAyy4Dw9ttvIzExEfHx8Vi/fr2+D8HLywuVlZXdxlZWVhrcdrhuVlbASy8B\nly9LMwVsNiQioiHO7ALCnj17kJiYiFWrVmHFihXdzsXExCA1NbXbMY1Gg9jY2D7ft7OzEwD67lcw\n1oNARERkZq78vLvy868nswoIOTk52LFjB+bPn48FCxagqqpKf87e3h7x8fGYP38+du7ciblz5+Kr\nr75CZmYmXnnllT7f+8p7LVq0yFTlExERDTpVVVXw8/MzOK4QwtgD/IPT9u3b8e677xo9t3r1aixf\nvhzffPMNEhISUFhYCH9/f7zwwguYPn16n++t1WqRlZUFNzc3jOA+CERENMR1dnaiqqoKoaGhsDHy\n9J1ZBQQiIiKSh3KgCyAiIqLBhwGBiIiIDDAgEBERkQEGBCIiIjLAgHANOjs7sW3bNsTFxSEqKgqr\nVq1CdXX1QJdlUtXV1XjhhRcQFxeH2NhYPProo8jNzdWfP3LkCO69916Eh4dj3rx5OHz48ABWK48T\nJ04gODgYGo1Gf2y4XYe9e/fizjvvRHh4OO6//3788MMP+nPD5Vo0Nzdj06ZN+r8bjz32GPLz8/Xn\nh8N12LhxI9atW9ftWF/fu6amBqtXr0ZsbCymTZuGhIQEdBjb8M6MGLsOH330Ee666y5ERkZizpw5\n2Lt3b7fzZnUdBPVpx44dYsaMGeLIkSMiKytLPPDAA2LhwoUDXZbJdHZ2il/+8pdiwYIFIjMzU+Tl\n5YlVq1aJadOmidraWpGXlydCQ0PF7t27RX5+vtixY4cICQkRubm5A126yTQ1NYnbb79dBAUFiWPH\njgkhxLC7Dvv27RMhISFi79694sKFC2LLli0iMjJSFBUVDatr8dJLL4m77rpLpKWlifz8fLF8+XIx\na9YsodVqh/x10Ol0IjExUQQFBYmXXnpJf/xavvevfvUr8eCDD4rs7GzxzTffiKlTp4rt27cPxNe4\nab1dh48//lhERkaKL7/8Uly8eFF8/vnnIiQkRCQnJ+vHmNN1YEDoQ2trq4iKihJffPGF/lhRUZEI\nCgoS6enpA1iZ6Zw+fVoEBQWJ/Px8/bHW1lYREREhkpOTxYYNG0R8fHy318THx4v169fLXapsrnzn\n/w0Iw+k66HQ6ccstt4jExET9sc7OTnHPPfeI/fv3D6troVKpRFJSkv73eXl5IigoSGRlZQ3p61BY\nWCji4+OFWq0Ws2fP7vaDsa/vnZGRIYKCgkRhYaH+/L59+0RUVJRobW2V5wv0k6tdh3nz5omtW7d2\nG7927Vrx0EMPCSHM7zrwFkMfcnJy0NTUBJVKpT/m4+MDb29vpKWlDWBlpuPl5YV3330X48eP1x+7\nst9FfX090tLSul0PAFCr1UP2ehw+fBjffPMN1q9f3+34cLoO58+fR0lJCebMmaM/plQq8fe//x3z\n5s0bVtfC2dkZX3/9NWpqatDW1oa//e1vcHBwgK+v75C+DhkZGfDy8sKBAwfg4+PT7Vxf3zstLQ3e\n3t7w9fXVn1epVGhqakJ2drbpi+9HV7sO69evx8KFC7sdUyqVaGhoAGB+14EBoQ9X1qruueGTu7t7\n3/s2mCknJyfMnj0bSmXXH48PP/wQWq0WcXFxKC8vHzbXo7a2FuvWrcPmzZvh4ODw/9u795iq6z+O\n488THZCDyhiimOlaLAXhEEIoAnJG2Y6j1JZoa1Kg85JdtLnccHDKRhfBSDSyNES3vJUOVOZWbSq5\nWimTtTLLzaMSCAfa0WYaV/n8/jC/+eWrYb9x2Tnn/djOds7n8/l6Pp+XG+e971XX50s5XLhwAYAr\nV67w/PPPM3XqVObPn09tbS3gW1kUFBTgcrlITk4mLi6Ozz//nC1btjB8+HCvzmH27NkUFRURFhZm\n6Ott3c3NzYwcOdLQD9DU1NRPM+4f/5bD5MmTdT/+jY2NHDp0iGnTpgGel4MUCL1obW3lnnvuwWw2\n69r9/f1pb28fpFkNrMOHD/P++++zYMECIiIiaGtrw9/fXzfGW/N44403ePTRR0lLSzP0+VIOV69e\nBSA3N5e5c+dSVlbGQw89RHZ2Nk6n06eyqKurY8SIEWzZsoXdu3eTmprK8uXLcblcPpXDrXpbd2tr\nKwEBAbp+s9mMyWTy2mwuXbrE0qVLGTFiBEuWLAE8LwePeljTYBgyZAjd3d10dXVx773/xNXR0UFg\nYOAgzmxgVFRU4HA4yMjIYNWqVQAEBATQ2dmpG+eNeVRWVnL69GkOHjx4235fyQHQCuQXXniBmTNn\nAjBx4kROnjzJ7t27fSaL+vp6HA4Hu3btIi4uDoDi4mIyMjLYvn27z+TQU2/rHjJkCB0dHbr+zs5O\nlFJYLJYBm+dAqa+vZ9GiRbS1tbFjxw6GDRsGeF4OUiD0YvTo0cCNp13dfA/Q0tJi2KXmbT766CNK\nSkrIysoiPz9fOw9h9OjRtLS06MZ6Yx4VFRU0NzeTmpoKgPr7sSWLFy/mqaee8pkc4J/doOPHj9fa\nTCYTDz74IA0NDT6TxalTp7h+/ToxMTFam9lsJioqirq6Op/Joafe1h0eHm647PHmeG/L5ueff2bx\n4sUEBwezZ88e3e+Gp+Ughxh6ERkZSVBQECdOnNDaGhoauHjxIomJiYM4s/71ySefUFJSwvLly3E4\nHFpxAJCQkEBNTY1u/PHjx3nkkUcGepr96r333uPQoUPs37+f/fv3U1ZWBsBbb73FihUrfCYHgOjo\naCwWCz/99JPWppTC6XQyduxYn8kiPDwcgDNnzmhtN3N44IEHfCaHnnpbd0JCAvX19brj7MePHyco\nKIjIyMgBnWt/cjqdLFy4kDFjxrBr1y5dcQAemMOgXkPhIdatW6eSk5PV119/rd0HoeclPd7kl19+\nUVFRUWr16tWqpaVF97p27Zr69ddfVXR0tNqwYYM6e/asKikpUVarVXdZpDdqamrSXeboazmsX79e\nJSYmqi+//FKdP39evf3228pqtSqn0+kzWXR1dal58+apJ598UtXU1KizZ88qh8Oh4uLiVENDg8/k\nkJWVpbu8r7d1d3d3q3nz5qlnnnlGnTp1Srv+f+PGjYO1hD7RM4c5c+ao1NRUde7cOd3fTbfbrZTy\nvBykQLgLnZ2d6t1331WTJ09W8fHxasWKFdp/uDcqLi5W48ePv+3rww8/VEopdfToUZWRkaFiYmLU\nrFmz1LfffjvIs+5/PQsEpXwrh+7ubvXxxx8rm82mYmJi1Ny5c1VNTY3W7ytZuN1ulZeXp6ZNm6YS\nEhJUdna2On36tNbvCzn0/GFUqvd1t7S0qBdffFE9/PDDKjk5WRUXF6vr168P5LT73K05nDt37o5/\nN6dPn65t40k5mJT6+8CqEEIIIcTf5BwEIYQQQhhIgSCEEEIIAykQhBBCCGEgBYIQQgghDKRAEEII\nIYSBFAhCCCGEMJBbLQshDHJzc6msrPzXMTcf7+vn58f27dsHYFY3OBwOwsPDeemll3odW1dXx8KF\nC6msrGT48OEDMDshvIfcB0EIYfDbb79x6dIl7fObb76Jn58f+fn5WtvQoUOBG89kiIiIGJB5ffPN\nNzgcDr744gvDU/HupLCwELfbTVFRUT/PTgjvInsQhBAG48aNY9y4cdrnoUOH4ufnpz3BcDAopVi7\ndi05OTl3XRwALFq0CJvNRnZ2NtHR0f04QyG8i5yDIIT4vz333HPk5ORonydMmMBnn33Ga6+9xqRJ\nk0hKSqK0tJSrV6+yevVqEhISSElJYd26ddy68/Ly5cvk5+czdepUYmNjefbZZzl58qTuu6qrq3E6\nnWRkZGhtbW1trFmzhrS0NGJiYpgxYwZbt27VbRcaGkpSUhKbN2/unxCE8FJSIAgh+lRhYSEhISFs\n2rSJ9PR0PvjgAzIzMwkMDKS0tJTHH3+csrIyvvrqKwDa29vJycmhurqalStXsnHjRoKDg8nJyeHH\nH3/U/t2qqiri4+MJCwvT2t555x2OHTtGbm4uW7du5bHHHqOoqMhw/oTdbufIkSP89ddfAxOCEF5A\nDjEIIfpUdHQ0eXl5wI3HpVdUVBAaGsrrr78OQFJSElVVVfzwww/Y7XYOHDjAmTNn2Lt3L1arFYC0\ntDQyMzNZv34927ZtA+D7779n9uzZuu86ceIEKSkp2l6FKVOmYLFYCAkJ0Y2zWq10dnZSW1tLampq\nv65fCG8hBYIQok/FxsZq70NCQvDz89O1mUwmgoODuXLlCgDfffcdo0aNIioqiq6uLm1ceno6mzdv\npqOjg66uLtxuN/fff7/uu6ZMmcKePXtwuVzYbDZsNtttr24YM2YMABcvXuzTtQrhzaRAEEL0qaCg\nIEObxWK54/g//vgDl8t1xxMIL1++rL0PDAzU9eXl5REeHs7BgwcpKCigoKCASZMmsWbNGiIjIw3b\n/fnnn/9pLUL4MikQhBCDatiwYURERFBYWHjb/lsPF9zc63CTv78/y5YtY9myZTQ2NnL06FE2bdrE\nqlWrqKqqMmzX89CDEOLO5CRFIcSgSkxMpLGxkZEjR2K1WrXX4cOH+fTTTzGbzfj7+xMWFkZzc7O2\nXXt7O3a7nfLycgDuu+8+5s+fzxNPPEFTU5PuO1wulzZGCHF3ZA+CEGJQPf300+zYsYMFCxawdOlS\nRo0aRXV1Ndu2bePll1/GZDIBkJKSorv0MSAggNjYWEpLSzGbzUyYMIHz589TWVmJ3W7XfUdtbS0W\ni4X4+PgBXZsQnkwKBCHEoAoKCmLnzp0UFxezdu1arl27xtixY3E4HGRlZWnj7HY7r7zyCm63m9DQ\nUODGHR5DQkIoLy/n999/JzQ0lMzMTF599VXddxw7dgybzfafbrAkhK+TWy0LITyCUopZs2Yxc+ZM\nlixZctfbNTY2Mn36dPbt28fEiRP7cYZCeBc5B0EI4RFMJhMrV65k586dtLa23vV25eXlzJgxQ4oD\nIf4jKRCEEB4jPT2dlJQUw+2U7+TChQscOXJEu0mTEOLuySEGIYQQQhjIHgQhhBBCGEiBIIQQQggD\nKRCEEEIIYSAFghBCCCEMpEAQQgghhIEUCEIIIYQw+B/PcvlKSWMYEgAAAABJRU5ErkJggg==\n", + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "subplot(3, 1, 1)\n", + "plot(thetas, label='theta')\n", + "decorate(ylabel='Angle (rad)')\n", + "\n", + "subplot(3, 1, 2)\n", + "plot(ys, color='green', label='y')\n", + "decorate(ylabel='Length (m)')\n", + "\n", + "subplot(3, 1, 3)\n", + "plot(rs, color='red', label='r')\n", + "\n", + "decorate(xlabel='Time(s)',\n", + " ylabel='Radius (mm)')\n", + "\n", + "savefig('chap11-fig01.pdf')" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "We can use interpolation to find the time when `y` is 47 meters." + ] + }, + { + "cell_type": "code", + "execution_count": 20, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "array(125.33333334940457)" + ] + }, + "execution_count": 20, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "T = interp_inverse(ys, kind='cubic')\n", + "t_end = T(47)\n", + "t_end" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "At that point `r` is 55 mm, which is `Rmax`, as expected." + ] + }, + { + "cell_type": "code", + "execution_count": 21, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "array(55.00000000448797)" + ] + }, + "execution_count": 21, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "R = interpolate(rs, kind='cubic')\n", + "R(t_end)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "The total amount of rotation is 1253 rad." + ] + }, + { + "cell_type": "code", + "execution_count": 22, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "array(1253.3333334940455)" + ] + }, + "execution_count": 22, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "THETA = interpolate(thetas, kind='cubic')\n", + "THETA(t_end)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### Unrolling" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "For unrolling the paper, we need more units:" + ] + }, + { + "cell_type": "code", + "execution_count": 23, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [ + "kg = UNITS.kilogram\n", + "N = UNITS.newton" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "And a few more parameters in the `Condition` object." + ] + }, + { + "cell_type": "code", + "execution_count": 24, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [ + "condition = Condition(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", + " duration = 180 * 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": 25, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [ + "def make_system(condition):\n", + " \"\"\"Make a system object.\n", + " \n", + " condition: Condition with Rmin, Rmax, Mcore, Mroll,\n", + " L, tension, and duration\n", + " \n", + " returns: System with init, k, rho_h, Rmin, Rmax,\n", + " Mcore, Mroll, ts\n", + " \"\"\"\n", + " unpack(condition)\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", + " ts = linspace(0, duration, 101)\n", + " \n", + " return System(init=init, k=k, rho_h=rho_h,\n", + " Rmin=Rmin, Rmax=Rmax,\n", + " Mcore=Mcore, Mroll=Mroll, \n", + " ts=ts)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Testing `make_system`" + ] + }, + { + "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", + "
value
inittheta 0 radian\n", + "omega 0.0 radi...
k2.7925531914893616e-05 meter / radian
rho_h26.07109543981524 kilogram / meter ** 2
Rmin0.02 meter
Rmax0.055 meter
Mcore0.015 kilogram
Mroll0.215 kilogram
ts[0.0 second, 1.8 second, 3.6 second, 5.4 secon...
\n", + "
" + ], + "text/plain": [ + "init theta 0 radian\n", + "omega 0.0 radi...\n", + "k 2.7925531914893616e-05 meter / radian\n", + "rho_h 26.07109543981524 kilogram / meter ** 2\n", + "Rmin 0.02 meter\n", + "Rmax 0.055 meter\n", + "Mcore 0.015 kilogram\n", + "Mroll 0.215 kilogram\n", + "ts [0.0 second, 1.8 second, 3.6 second, 5.4 secon...\n", + "dtype: object" + ] + }, + "execution_count": 26, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "system = make_system(condition)\n", + "system" + ] + }, + { + "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", + "
value
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": 27, + "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": 28, + "metadata": { + "collapsed": true + }, + "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", + " unpack(system)\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": 29, + "metadata": {}, + "outputs": [ + { + "data": { + "text/html": [ + "6e-06 kilogram meter2" + ], + "text/latex": [ + "$6e-06 kilogram \\cdot meter^{2}$" + ], + "text/plain": [ + "" + ] + }, + "execution_count": 29, + "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": 30, + "metadata": {}, + "outputs": [ + { + "data": { + "text/html": [ + "0.00037418750000000006 kilogram meter2" + ], + "text/latex": [ + "$0.00037418750000000006 kilogram \\cdot meter^{2}$" + ], + "text/plain": [ + "" + ] + }, + "execution_count": 30, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "moment_of_inertia(system.Rmax, system)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Here's the slope function." + ] + }, + { + "cell_type": "code", + "execution_count": 31, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [ + "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", + " unpack(system)\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": [ + "Testing `slope_func`" + ] + }, + { + "cell_type": "code", + "execution_count": 32, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "(,\n", + " ,\n", + " )" + ] + }, + "execution_count": 32, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "slope_func(system.init, 0*s, system)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Now we can run the simulation." + ] + }, + { + "cell_type": "code", + "execution_count": 33, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [ + "run_odeint(system, slope_func)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "And look at 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", + "
thetaomegay
172.8503.3769986.83022222.852269
174.6515.7882196.96058022.346268
176.4528.4371507.09437621.835001
178.2541.3301517.23180221.318468
180.0554.4739407.37306620.796665
\n", + "
" + ], + "text/plain": [ + " theta omega y\n", + "172.8 503.376998 6.830222 22.852269\n", + "174.6 515.788219 6.960580 22.346268\n", + "176.4 528.437150 7.094376 21.835001\n", + "178.2 541.330151 7.231802 21.318468\n", + "180.0 554.473940 7.373066 20.796665" + ] + }, + "execution_count": 34, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "system.results.tail()" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Extrating the time series" + ] + }, + { + "cell_type": "code", + "execution_count": 35, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [ + "thetas = system.results.theta\n", + "omegas = system.results.omega\n", + "ys = system.results.y" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Plotting `theta`" + ] + }, + { + "cell_type": "code", + "execution_count": 36, + "metadata": {}, + "outputs": [ + { + "data": { + "image/png": "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\nUF2tUFWtoKuqRqur1v+p1VVTqa2iUlvzZ4WuioqKKjSVOjSVNX+WV+go1+jq3Iq1scxNTXC0t8TR\n3hIneyucHGqSRhc7S8xkuXMhRCtrdwnkzJkzlJaWEhkZqS/z9vbGy8uLpKSkRiWQnIIyfjp6leKy\nmj4ERYFqRdH/eTNxKE14Kmgqa0szHGwt9D9d7CxrfmwtsJUnCiFEG9LuEkhWVhYA7u7uBuVqtVpf\n11DHU3PJzC9tttjuxNREhY2VOTZWZthYmmFrbY6djQW2VubY2dT82NtYyJOEEKLdaHcJpLy8HBMT\nE8zNDUcOWVhYUFFR0ajX6tG1C+evFqHV3bl5yUSlwtREhZmZCeZmJpiZ1vxpbmaKuZkJluYmWJib\nYmluiqWFKVYWZvo/rS3NsLYyw8LMRJ4ehBAdSrtLIFZWVlRXV6PT6TAzuxV+ZWUl1tbWjXotf29H\nfD3sb82XUKkwUdUkDJWJSp84ZG0nIYSord0lEE9PTwByc3P1/w2Qk5NTq1mrIWqeImTFWCGEaKx2\nl0CCgoKwtbXl0KFDREdHA3DlyhWuXr3KwIED67ymqqrmCaOxfSRCCNGZ3fzMvPkZ+nvtLoFYWFjw\n5JNP8te//hUnJydcXFz4y1/+QmRkJKGhoXVek5ubC8DUqVNbM1QhhOgQcnNz6datW61yldKaY1Sb\niU6n45133iEhIQGdTqefie7s7Fzn+RqNhpSUFNzc3DA1leYqIYRoiKqqKnJzc+nXrx9WVla16ttl\nAhFCCGF8MulACCFEk0gCEUII0SSSQIQQQjSJJBAhhBBNIglECCFEk3TaBFJVVcW7775LVFQUYWFh\nvPDCC+Tl5Rk7rHYtLS2NwMDAWj9JSUkA7N+/n+joaIKDg5k4cSKJiYlGjrj9WbJkCQsXLjQou9t9\nzc/PZ86cOURERDBkyBDi4uLQ6Rq3OVlnUtc9fuyxx2r9vb79nE57j5VOauXKlcrQoUOV/fv3Kykp\nKcqUKVOU//7v/zZ2WO3a9u3blUGDBik5OTkGP5WVlUpqaqrSr18/5YMPPlDS0tKUlStXKn379lXO\nnTtn7LDbherqauX9999XevXqpbz++uv68obc1yeeeEJ58sknldOnTyt79+5VBg8erLz33nvGeBtt\nWn33uLq6WgkJCVG+/fZbg7/XxcXF+nM66z3ulAmkoqJCCQsLU7766it9WUZGhtKrVy8lOTnZiJG1\n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\n", + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "plot(thetas, label='theta')\n", + "\n", + "decorate(xlabel='Time (s)',\n", + " ylabel='Angle (rad)')" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Plotting `omega`" + ] + }, + { + "cell_type": "code", + "execution_count": 37, + "metadata": {}, + "outputs": [ + { + "data": { + "image/png": "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\nGHt7e5KTk/Hw8CAwMLBIH/b555+TkZF3g0hCQgKDBg3i448/pmXLlkV6LyHEQ8pKgr9XQdJR03Gv\nluqdunK1bxM0h//mzZuZNWsW169fN455eXnx1ltvGbt/Psi9SzvLlStnHPf0lL08hTCrOxutXFwH\nuel5404e8NgQqFjfcrWJEqcp/Hft2sWECRNo06YNYWFheHl5ER8fz7Zt23j//fepUKGCbOEoRGmW\ncVXdaCX5jOm4d1uo2kdW8tggTeEfHh5Oz549+eyzz0zGe/fuzfjx4/n6668fKvx9fX05c+bMg58o\nhHg4igHifoTYLaDc1aCxXGW19XKFWparTViUppu8zp49S1hYWIHHwsLCiIqKKvCYEMKCUmPgxKdw\ncf1dwa8D307qfroS/DZN05V/5cqVuXr1aoHH4uLicHZ2LtaihBCPIDcTLm1Vr/hR8sadA6D6ULUT\np7B5msK/Xbt2zJ07lzp16lC/ft6XQsePH2fevHm0b9/ebAUKIYog6QT8vRKy8hZmoHME/zDwfUYa\nsQkjTeE/evRofvvtN/r160e1atWoXLkyCQkJxMTE8NhjjzFu3Dhz1ymEuJ/sW2qv/XtbM7jVhqDB\noPe2TF2i1NIU/u7u7mzYsIH169dz6NAhbt68Sd26dRk6dCh9+vSRaR8hLEVRIOEXuLgBctPyxu1d\n1DX7Xi1kdy1RIM3r/PV6PYMGDWLQoEHmrEcIoVXaJXWKJ+WerrqeT6qtGRzdLFOXsAqFhv/kyZM1\nv4lOp5PWDEKUlNxMuPR/t7/QNeSNl6ustmZwr2ux0oT1KDT89+/fr/lNdPJnpRAl48ZRtR9PVmLe\nmM4e/DpDlW5g52i52oRVKTT89+zZU5J1CCHuJ/O6Gvp3b6cI4BasXu07+1mmLmG1itTYLTMzk8jI\nSK5evUqrVq1IT0/H11c2bxbCbAw5ELcLLm0zvUPXwRWq9gOv5vKFrngomsN/5cqVfPnll9y6dQud\nTse6dev48ssvycrKYtGiRZQvL50AhShWN0/BhdWQEW86Xrk1VH0WHFwsU5coEzS1d1i3bh0ff/wx\nzz77LMuXLzf24e/Xrx/Hjh1j/vz5Zi1SCJuSdQPOLoYzc02D3zkA6k1Q1+1L8ItHpOnKf+nSpYwY\nMYLx48eTm5trHO/UqRPx8fEsW7aMCRMmmK1IIWyCIQfidsPlbWDIzBu300NAL/BpBzpN12tCPJCm\n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\n", + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "plot(omegas, color='orange', label='omega')\n", + "\n", + "decorate(xlabel='Time (s)',\n", + " ylabel='Angular velocity (rad/s)')" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Plotting `y`" + ] + }, + { + "cell_type": "code", + "execution_count": 38, + "metadata": {}, + "outputs": [ + { + "data": { + "image/png": "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\n", + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "plot(ys, color='green', label='y')\n", + "\n", + "decorate(xlabel='Time (s)',\n", + " ylabel='Length (m)')" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Here's the figure from the book." + ] + }, + { + "cell_type": "code", + "execution_count": 39, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Saving figure to file chap11-fig02.pdf\n" + ] + }, + { + "data": { + "image/png": "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\n", + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "subplot(3, 1, 1)\n", + "plot(thetas, label='theta')\n", + "decorate(ylabel='Angle (rad)')\n", + "\n", + "subplot(3, 1, 2)\n", + "plot(omegas, color='orange', label='omega')\n", + "decorate(ylabel='Angular velocity (rad/s)')\n", + "\n", + "subplot(3, 1, 3)\n", + "plot(ys, color='green', label='y')\n", + "\n", + "decorate(xlabel='Time(s)',\n", + " ylabel='Length (m)')\n", + "\n", + "savefig('chap11-fig02.pdf')" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### Yo-yo" + ] + }, + { + "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 `Condition` 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": 94, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [ + "condition = Condition(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", + " duration = 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)). 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": 95, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [ + "def make_system(condition):\n", + " \"\"\"Make a system object.\n", + " \n", + " condition: Condition with Rmin, Rmax, Rout, \n", + " mass, L, g, duration\n", + " \n", + " returns: System with init, k, Rmin, Rmax, mass,\n", + " I, g, ts\n", + " \"\"\"\n", + " unpack(condition)\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", + " ts = linspace(0, duration, 101)\n", + " \n", + " return System(init=init, k=k,\n", + " Rmin=Rmin, Rmax=Rmax,\n", + " mass=mass, I=I, g=g,\n", + " ts=ts)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Testing `make_system`" + ] + }, + { + "cell_type": "code", + "execution_count": 96, + "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", + "
value
inittheta 0 radian\n", + "omega 0.0 radi...
k9.6e-05 meter / radian
Rmin0.008 meter
Rmax0.016 meter
mass0.05 kilogram
I3.0625000000000006e-05 kilogram * meter ** 2
g9.8 meter / second ** 2
ts[0.0 second, 0.01 second, 0.02 second, 0.03 se...
\n", + "
" + ], + "text/plain": [ + "init theta 0 radian\n", + "omega 0.0 radi...\n", + "k 9.6e-05 meter / radian\n", + "Rmin 0.008 meter\n", + "Rmax 0.016 meter\n", + "mass 0.05 kilogram\n", + "I 3.0625000000000006e-05 kilogram * meter ** 2\n", + "g 9.8 meter / second ** 2\n", + "ts [0.0 second, 0.01 second, 0.02 second, 0.03 se...\n", + "dtype: object" + ] + }, + "execution_count": 96, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "system = make_system(condition)\n", + "system" + ] + }, + { + "cell_type": "code", + "execution_count": 97, + "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", + "
value
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": 97, + "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", + "\n", + "Hint: If `y` is less than 0, it means you have reached the end of the string, so the equation for `r` is no longer valid. In this case, the simplest thing to do it return the sequence of derivatives `0, 0, 0, 0`" + ] + }, + { + "cell_type": "code", + "execution_count": 107, + "metadata": {}, + "outputs": [], + "source": [ + "# Solution goes here\n", + "def slope_func(state, t, system):\n", + " theta, omega, y, v = state\n", + " unpack(system)\n", + " \n", + "\n", + " \n", + " \n", + " r = sqrt((2*k*y) + Rmin**2)\n", + " Istar = I + (mass * r**2)\n", + " T = mass*g*I/Istar\n", + " a = -(mass*g*r**2)/Istar\n", + " alpha = mass*g*r/Istar\n", + "\n", + " if y <= 0:\n", + " return 0 * radian/sec, 0 * radian/sec**2, 0 * meter/second, 0 * meter/second**2\n", + " else:\n", + " return omega, alpha, v, a" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Test your slope function with the initial conditions." + ] + }, + { + "cell_type": "code", + "execution_count": 108, + "metadata": {}, + "outputs": [ + { + "ename": "ValueError", + "evalue": "Cannot compare Quantity and ", + "output_type": "error", + "traceback": [ + "\u001b[1;31m---------------------------------------------------------------------------\u001b[0m", + "\u001b[1;31mValueError\u001b[0m Traceback (most recent call last)", + "\u001b[1;32m\u001b[0m in \u001b[0;36m\u001b[1;34m()\u001b[0m\n\u001b[1;32m----> 1\u001b[1;33m \u001b[0mslope_func\u001b[0m\u001b[1;33m(\u001b[0m\u001b[0msystem\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0minit\u001b[0m\u001b[1;33m,\u001b[0m \u001b[1;36m0\u001b[0m\u001b[1;33m*\u001b[0m\u001b[0ms\u001b[0m\u001b[1;33m,\u001b[0m \u001b[0msystem\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0m", + "\u001b[1;32m\u001b[0m in \u001b[0;36mslope_func\u001b[1;34m(state, t, system)\u001b[0m\n\u001b[0;32m 13\u001b[0m \u001b[0malpha\u001b[0m \u001b[1;33m=\u001b[0m \u001b[0mmass\u001b[0m\u001b[1;33m*\u001b[0m\u001b[0mg\u001b[0m\u001b[1;33m*\u001b[0m\u001b[0mr\u001b[0m\u001b[1;33m/\u001b[0m\u001b[0mIstar\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0;32m 14\u001b[0m \u001b[1;33m\u001b[0m\u001b[0m\n\u001b[1;32m---> 15\u001b[1;33m \u001b[1;32mif\u001b[0m \u001b[0my\u001b[0m \u001b[1;33m<=\u001b[0m \u001b[1;36m0\u001b[0m\u001b[1;33m:\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0m\u001b[0;32m 16\u001b[0m \u001b[1;32mreturn\u001b[0m \u001b[1;36m0\u001b[0m \u001b[1;33m*\u001b[0m \u001b[0mradian\u001b[0m\u001b[1;33m/\u001b[0m\u001b[0msec\u001b[0m\u001b[1;33m,\u001b[0m \u001b[1;36m0\u001b[0m \u001b[1;33m*\u001b[0m \u001b[0mradian\u001b[0m\u001b[1;33m/\u001b[0m\u001b[0msec\u001b[0m\u001b[1;33m**\u001b[0m\u001b[1;36m2\u001b[0m\u001b[1;33m,\u001b[0m \u001b[1;36m0\u001b[0m \u001b[1;33m*\u001b[0m \u001b[0mmeter\u001b[0m\u001b[1;33m/\u001b[0m\u001b[0msecond\u001b[0m\u001b[1;33m,\u001b[0m \u001b[1;36m0\u001b[0m \u001b[1;33m*\u001b[0m \u001b[0mmeter\u001b[0m\u001b[1;33m/\u001b[0m\u001b[0msecond\u001b[0m\u001b[1;33m**\u001b[0m\u001b[1;36m2\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0;32m 17\u001b[0m \u001b[1;32melse\u001b[0m\u001b[1;33m:\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n", + "\u001b[1;32mC:\\ProgramData\\Miniconda3\\lib\\site-packages\\pint\\quantity.py\u001b[0m in \u001b[0;36m\u001b[1;34m(self, other)\u001b[0m\n\u001b[0;32m 923\u001b[0m \u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0;32m 924\u001b[0m \u001b[0m__lt__\u001b[0m \u001b[1;33m=\u001b[0m \u001b[1;32mlambda\u001b[0m \u001b[0mself\u001b[0m\u001b[1;33m,\u001b[0m \u001b[0mother\u001b[0m\u001b[1;33m:\u001b[0m \u001b[0mself\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0mcompare\u001b[0m\u001b[1;33m(\u001b[0m\u001b[0mother\u001b[0m\u001b[1;33m,\u001b[0m \u001b[0mop\u001b[0m\u001b[1;33m=\u001b[0m\u001b[0moperator\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0mlt\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[1;32m--> 925\u001b[1;33m \u001b[0m__le__\u001b[0m \u001b[1;33m=\u001b[0m \u001b[1;32mlambda\u001b[0m \u001b[0mself\u001b[0m\u001b[1;33m,\u001b[0m \u001b[0mother\u001b[0m\u001b[1;33m:\u001b[0m \u001b[0mself\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0mcompare\u001b[0m\u001b[1;33m(\u001b[0m\u001b[0mother\u001b[0m\u001b[1;33m,\u001b[0m \u001b[0mop\u001b[0m\u001b[1;33m=\u001b[0m\u001b[0moperator\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0mle\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0m\u001b[0;32m 926\u001b[0m \u001b[0m__ge__\u001b[0m \u001b[1;33m=\u001b[0m \u001b[1;32mlambda\u001b[0m \u001b[0mself\u001b[0m\u001b[1;33m,\u001b[0m \u001b[0mother\u001b[0m\u001b[1;33m:\u001b[0m \u001b[0mself\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0mcompare\u001b[0m\u001b[1;33m(\u001b[0m\u001b[0mother\u001b[0m\u001b[1;33m,\u001b[0m \u001b[0mop\u001b[0m\u001b[1;33m=\u001b[0m\u001b[0moperator\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0mge\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0;32m 927\u001b[0m \u001b[0m__gt__\u001b[0m \u001b[1;33m=\u001b[0m \u001b[1;32mlambda\u001b[0m \u001b[0mself\u001b[0m\u001b[1;33m,\u001b[0m \u001b[0mother\u001b[0m\u001b[1;33m:\u001b[0m \u001b[0mself\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0mcompare\u001b[0m\u001b[1;33m(\u001b[0m\u001b[0mother\u001b[0m\u001b[1;33m,\u001b[0m \u001b[0mop\u001b[0m\u001b[1;33m=\u001b[0m\u001b[0moperator\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0mgt\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n", + "\u001b[1;32mC:\\ProgramData\\Miniconda3\\lib\\site-packages\\pint\\quantity.py\u001b[0m in \u001b[0;36mcompare\u001b[1;34m(self, other, op)\u001b[0m\n\u001b[0;32m 912\u001b[0m \u001b[1;32mreturn\u001b[0m \u001b[0mop\u001b[0m\u001b[1;33m(\u001b[0m\u001b[0mself\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0m_convert_magnitude_not_inplace\u001b[0m\u001b[1;33m(\u001b[0m\u001b[0mUnitsContainer\u001b[0m\u001b[1;33m(\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m,\u001b[0m \u001b[0mother\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0;32m 913\u001b[0m \u001b[1;32melse\u001b[0m\u001b[1;33m:\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[1;32m--> 914\u001b[1;33m \u001b[1;32mraise\u001b[0m \u001b[0mValueError\u001b[0m\u001b[1;33m(\u001b[0m\u001b[1;34m'Cannot compare Quantity and {0}'\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0mformat\u001b[0m\u001b[1;33m(\u001b[0m\u001b[0mtype\u001b[0m\u001b[1;33m(\u001b[0m\u001b[0mother\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0m\u001b[0;32m 915\u001b[0m \u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0;32m 916\u001b[0m \u001b[1;32mif\u001b[0m \u001b[0mself\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0m_units\u001b[0m \u001b[1;33m==\u001b[0m \u001b[0mother\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0m_units\u001b[0m\u001b[1;33m:\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n", + "\u001b[1;31mValueError\u001b[0m: Cannot compare Quantity and " + ] + } + ], + "source": [ + "slope_func(system.init, 0*s, system)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Then run the simulation." + ] + }, + { + "cell_type": "code", + "execution_count": 100, + "metadata": { + "scrolled": false + }, + "outputs": [], + "source": [ + "run_odeint(system, slope_func)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Check the final conditions. If things have gone according to plan, the final value of `y` should be close to 0." + ] + }, + { + "cell_type": "code", + "execution_count": 101, + "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.9679.148555152.914392-0.163705-2.052485
0.9780.681953153.757140-0.184254-2.057147
0.9882.223526154.548429-0.204846-2.061233
0.9983.772733155.283077-0.225476-2.064733
1.0085.328977155.954552-0.246139-2.067640
\n", + "
" + ], + "text/plain": [ + " theta omega y v\n", + "0.96 79.148555 152.914392 -0.163705 -2.052485\n", + "0.97 80.681953 153.757140 -0.184254 -2.057147\n", + "0.98 82.223526 154.548429 -0.204846 -2.061233\n", + "0.99 83.772733 155.283077 -0.225476 -2.064733\n", + "1.00 85.328977 155.954552 -0.246139 -2.067640" + ] + }, + "execution_count": 101, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "system.results.tail()" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Plot the results." + ] + }, + { + "cell_type": "code", + "execution_count": 102, + "metadata": {}, + "outputs": [], + "source": [ + "thetas = system.results.theta\n", + "ys = system.results.y" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "`theta` should increase and accelerate." + ] + }, + { + "cell_type": "code", + "execution_count": 103, + "metadata": {}, + "outputs": [ + { + "data": { + "image/png": "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\n", + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "plot(thetas, label='theta')\n", + "\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": 104, + "metadata": {}, + "outputs": [ + { + "data": { + "image/png": "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\n", + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "plot(ys, color='green', label='y')\n", + "\n", + "decorate(xlabel='Time (s)',\n", + " ylabel='Length (m)')" + ] + }, + { + "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/code/rabbits2mine.ipynb b/code/rabbits2mine.ipynb new file mode 100644 index 00000000..1d5c087f --- /dev/null +++ b/code/rabbits2mine.ipynb @@ -0,0 +1,467 @@ +{ + "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": 6, + "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", + "0. Before you make any changes, run all cells and confirm your understand them.\n", + "\n", + "1. Then, add a second initial populations: `juvenile_pop0`, with value `0`.\n", + "\n", + "2. Add an additional variable, `mature_rate`, with the value `0.33`." + ] + }, + { + "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", + "
value
t00.0
t_end10.0
adult_pop010.0
birth_rate0.9
death_rate0.5
juvenile_pop00.0
mature_rate0.3
\n", + "
" + ], + "text/plain": [ + "t0 0.0\n", + "t_end 10.0\n", + "adult_pop0 10.0\n", + "birth_rate 0.9\n", + "death_rate 0.5\n", + "juvenile_pop0 0.0\n", + "mature_rate 0.3\n", + "dtype: float64" + ] + }, + "execution_count": 8, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "rabbits = System(t0 = 0, \n", + " t_end = 10,\n", + " adult_pop0 = 10,\n", + " birth_rate = 0.9,\n", + " death_rate = 0.5,\n", + " juvenile_pop0 = 0,\n", + " mature_rate = .3)\n", + "\n", + "rabbits" + ] + }, + { + "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", + "\n", + "5. After the for loop, store the `juveniles` `TimeSeries` as a variable in `System`." + ] + }, + { + "cell_type": "code", + "execution_count": 9, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [ + "def run_simulation(rabbits):\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", + " adults = TimeSeries()\n", + " juveniles = TimeSeries()\n", + " adults[rabbits.t0] = rabbits.adult_pop0\n", + " juveniles[rabbits.t0] = rabbits.juvenile_pop0\n", + " \n", + " for t in linrange(rabbits.t0, rabbits.t_end):\n", + " growths = rabbits.mature_rate * juveniles[t]\n", + " births = rabbits.birth_rate * adults[t]\n", + " deaths = rabbits.death_rate * adults[t]\n", + " \n", + " adults[t+1] = adults[t] + growths - deaths\n", + " juveniles[t+1] = juveniles[t] + births - growths\n", + " \n", + " rabbits.adults = adults\n", + " rabbits.juveniles = juveniles" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Test your changes in `run_simulation`:" + ] + }, + { + "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", + "
value
00.000000
19.000000
210.800000
312.240000
413.824000
515.609600
617.625600
719.901952
822.472294
925.374597
1028.651733
1132.352112
\n", + "
" + ], + "text/plain": [ + "0 0.000000\n", + "1 9.000000\n", + "2 10.800000\n", + "3 12.240000\n", + "4 13.824000\n", + "5 15.609600\n", + "6 17.625600\n", + "7 19.901952\n", + "8 22.472294\n", + "9 25.374597\n", + "10 28.651733\n", + "11 32.352112\n", + "dtype: float64" + ] + }, + "execution_count": 10, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "run_simulation(rabbits)\n", + "rabbits.juveniles" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Next, update `plot_results` to plot both the adult and juvenile `TimeSeries`." + ] + }, + { + "cell_type": "code", + "execution_count": 11, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [ + "\n", + "def plot_results(system, title=None):\n", + " system = rabbits\n", + " \"\"\"Plot the estimates and the model.\n", + " \n", + " system: System object with `results`\n", + " \"\"\"\n", + " newfig()\n", + " plot(rabbits.adults, 'bo-', label='adults')\n", + " plot(rabbits.juveniles, 'ro-', label='kiddos')\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": 13, + "metadata": {}, + "outputs": [ + { + "data": { + "image/png": "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\ngg==\n", + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "plot_results(rabbits, 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? You might have to run for more than 10 seasons to see what happens." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "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", + " adults = TimeSeries()\n", + " juveniles = TimeSeries()\n", + " adults[rabbits.t0] = rabbits.adult_pop0\n", + " juveniles[rabbits.t0] = rabbits.juvenile_pop0\n", + " \n", + " for t in linrange(rabbits.t0, rabbits.t_end):\n", + " growths = rabbits.birth_rate * juveniles[t]\n", + " births = rabbits.birth_rate * adults[t]\n", + " deaths = rabbits.death_rate * adults[t]\n", + " \n", + " adults[t+1] = adults[t] + growths - deaths\n", + " juveniles[t+1] = juveniles[t] + births - growths\n", + " \n", + " if adults >= 30:\n", + " adults = \n", + " \n", + "\n", + " rabbits.adults = adults\n", + " rabbits.juveniles = juveniles" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [ + "plot_results(system, title='Proportional growth model')" + ] + }, + { + "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/code/rabbits3mine.ipynb b/code/rabbits3mine.ipynb new file mode 100644 index 00000000..1c334b8b --- /dev/null +++ b/code/rabbits3mine.ipynb @@ -0,0 +1,777 @@ +{ + "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": 11, + "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": 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", + "
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": 12, + "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": 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", + "
value
juveniles0
adults10
\n", + "
" + ], + "text/plain": [ + "juveniles 0\n", + "adults 10\n", + "dtype: int64" + ] + }, + "execution_count": 13, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "# Solution goes here\n", + "init = State(juveniles = 0, adults = 10)\n", + "init" + ] + }, + { + "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", + "
value
t00
t_end20
birth_rate0.9
mature_rate0.33
death_rate0.5
initjuveniles 0\n", + "adults 10\n", + "dtype: int64
\n", + "
" + ], + "text/plain": [ + "t0 0\n", + "t_end 20\n", + "birth_rate 0.9\n", + "mature_rate 0.33\n", + "death_rate 0.5\n", + "init juveniles 0\n", + "adults 10\n", + "dtype: int64\n", + "dtype: object" + ] + }, + "execution_count": 14, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "# Solution goes here\n", + "system = System(t0 = 0, t_end = 20, birth_rate = .9, mature_rate = .33, death_rate = .5, init = init)\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": 15, + "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": 16, + "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.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": 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", + "
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": 17, + "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": 19, + "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": 20, + "metadata": { + "scrolled": false + }, + "outputs": [ + { + "data": { + "image/png": "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\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 goes here" + ] + }, + { + "cell_type": "code", + "execution_count": 11, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [ + "run_simulation(system)" + ] + }, + { + "cell_type": "code", + "execution_count": 12, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [ + "# Solution goes here" + ] + }, + { + "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 goes here" + ] + }, + { + "cell_type": "code", + "execution_count": 15, + "metadata": {}, + "outputs": [ + { + "ename": "NameError", + "evalue": "name 'update' 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[0mrun_simulation\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0msystem\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mupdate\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m", + "\u001b[0;31mNameError\u001b[0m: name 'update' is not defined" + ] + } + ], + "source": [ + "run_simulation(system, update)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "collapsed": true + }, + "outputs": [], + "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/code/rabbitsmine.ipynb b/code/rabbitsmine.ipynb new file mode 100644 index 00000000..88ff815c --- /dev/null +++ b/code/rabbitsmine.ipynb @@ -0,0 +1,773 @@ +{ + "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": [ + "# If you want the figures to appear in the notebook, \n", + "# and you want to interact with them, use\n", + "# %matplotlib notebook\n", + "\n", + "# If you want the figures to appear in the notebook, \n", + "# and you don't want to interact with them, use\n", + "# %matplotlib inline\n", + "\n", + "# If you want the figures to appear in separate windows, use\n", + "# %matplotlib qt5\n", + "\n", + "# To switch from one to another, you have to select Kernel->Restart\n", + "\n", + "%matplotlib inline\n", + "\n", + "from modsim import *" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "This notebook develops a simple growth model, like the ones in Chapter 3, and uses it to demonstrate a parameter sweep.\n", + "\n", + "The system we'll model is a rabbit farm. Suppose you start with an initial population of rabbits and let them breed. For simplicity, we'll assume that all rabbits are on the same breeding cycle, and we'll measure time in \"seasons\", where a season is the reproductive time of a rabbit.\n", + "\n", + "If we provide all the food, space and other resources a rabbit might need, we expect the number of new rabbits each season to be proportional to the current population, controlled by a parameter, `birth_rate`, that represents the number of new rabbits per existing rabbit, per season. As a starting place, I'll assume `birth_rate = 0.9`.\n", + "\n", + "Sadly, during each season, some proportion of the rabbits die. In a detailed model, we might keep track of each rabbit's age, because the chance of dying is probably highest for young and old rabbits, and lowest in between. But for simplicity, we'll model the death process with a single parameter, `death_rate`, that represent the number\n", + "of deaths per rabbit per season. As a starting place, I'll assume `death_rate = 0.5`.\n", + "\n", + "Here's a system object that contains these parameters as well as:\n", + "\n", + "* The initial population, `p0`,\n", + "* The initial time, `t0`, and\n", + "* The duration of the simulation, `t_end`, measured in seasons." + ] + }, + { + "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", + "
value
t00.0
t_end10.0
p010.0
birth_rate0.9
death_rate0.5
\n", + "
" + ], + "text/plain": [ + "t0 0.0\n", + "t_end 10.0\n", + "p0 10.0\n", + "birth_rate 0.9\n", + "death_rate 0.5\n", + "dtype: float64" + ] + }, + "execution_count": 2, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "system = System(t0 = 0, \n", + " t_end = 10,\n", + " p0 = 10,\n", + " birth_rate = 0.9,\n", + " death_rate = 0.5)\n", + "\n", + "system" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Here's a version of run_simulation, similar to the one in Chapter 3, with both births and deaths proportional to the current population." + ] + }, + { + "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", + " results = TimeSeries()\n", + " results[system.t0] = system.p0\n", + " for t in linrange(system.t0, 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", + " system.results = results" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Now we can run the simulation and display the results:" + ] + }, + { + "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", + "
value
010.000000
114.000000
219.600000
327.440000
438.416000
553.782400
675.295360
7105.413504
8147.578906
9206.610468
10289.254655
11404.956517
\n", + "
" + ], + "text/plain": [ + "0 10.000000\n", + "1 14.000000\n", + "2 19.600000\n", + "3 27.440000\n", + "4 38.416000\n", + "5 53.782400\n", + "6 75.295360\n", + "7 105.413504\n", + "8 147.578906\n", + "9 206.610468\n", + "10 289.254655\n", + "11 404.956517\n", + "dtype: float64" + ] + }, + "execution_count": 4, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "run_simulation(system)\n", + "system.results" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Notice that the simulation actually runs one season past `t_end`. That's an off-by-one error that I'll fix later, but for now we don't really care.\n", + "\n", + "The following function plots the results." + ] + }, + { + "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.results, 'bo', label='rabbits')\n", + " decorate(xlabel='Season', \n", + " ylabel='Rabbit population',\n", + " title=title)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "And here's how we call it." + ] + }, + { + "cell_type": "code", + "execution_count": 6, + "metadata": {}, + "outputs": [ + { + "data": { + "image/png": "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\nyIIo+AAAAABJRU5ErkJggg==\n", + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "plot_results(system, title='Proportional growth model')" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Let's suppose our goal is to maximize the number of rabbits, so the metric we care about is the final population. We can extract it from the results like this:" + ] + }, + { + "cell_type": "code", + "execution_count": 7, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [ + "def final_population(system):\n", + " t_end = system.results.index[-1]\n", + " return system.results[t_end]" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "And call it like this:" + ] + }, + { + "cell_type": "code", + "execution_count": 8, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "404.95651696640027" + ] + }, + "execution_count": 8, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "final_population(system)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "To explore the effect of the parameters on the results, we'll define `make_system`, which takes the system parameters as function parameters(!) and returns a `System` object:" + ] + }, + { + "cell_type": "code", + "execution_count": 9, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [ + "def make_system(birth_rate=0.9, death_rate=0.5):\n", + " \n", + " system = System(t0 = 0, \n", + " t_end = 10,\n", + " p0 = 10,\n", + " birth_rate = birth_rate,\n", + " death_rate = death_rate)\n", + " return system" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Now we can make a `System`, run a simulation, and extract a metric:" + ] + }, + { + "cell_type": "code", + "execution_count": 10, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "404.95651696640027" + ] + }, + "execution_count": 10, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "system = make_system()\n", + "run_simulation(system)\n", + "final_population(system)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "To see the relationship between `birth_rate` and final population, we'll define `sweep_birth_rate`:" + ] + }, + { + "cell_type": "code", + "execution_count": 11, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [ + "def sweep_birth_rate(birth_rates, death_rate=0.5):\n", + " \n", + " for birth_rate in birth_rates:\n", + " system = make_system(birth_rate=birth_rate,\n", + " death_rate=death_rate)\n", + " run_simulation(system)\n", + " p_end = final_population(system)\n", + " plot(birth_rate, p_end, 'gs', label='rabbits')\n", + " \n", + " decorate(xlabel='Births per rabbit per season',\n", + " ylabel='Final population')" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "The first parameter of `sweep_birth_rate` is supposed to be an array; we can use `linspace` to make one." + ] + }, + { + "cell_type": "code", + "execution_count": 12, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "array([ 0. , 0.05, 0.1 , 0.15, 0.2 , 0.25, 0.3 , 0.35, 0.4 ,\n", + " 0.45, 0.5 , 0.55, 0.6 , 0.65, 0.7 , 0.75, 0.8 , 0.85,\n", + " 0.9 , 0.95, 1. ])" + ] + }, + "execution_count": 12, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "birth_rates = linspace(0, 1, 21)\n", + "birth_rates" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Now we can call `sweep_birth_rate`.\n", + "\n", + "The resulting figure shows the final population for a range of values of `birth_rate`.\n", + "\n", + "Confusingly, the results from a parameter sweep sometimes resemble a time series. It is very important to remember the difference. One way to avoid confusion: LABEL THE AXES.\n", + "\n", + "In the following figure, the x-axis is `birth_rate`, NOT TIME." + ] + }, + { + "cell_type": "code", + "execution_count": 13, + "metadata": {}, + "outputs": [ + { + "data": { + "image/png": "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\nTkSuQmCC\n", + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "birth_rates = linspace(0, 1, 21)\n", + "sweep_birth_rate(birth_rates)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "The code to sweep the death rate is similar." + ] + }, + { + "cell_type": "code", + "execution_count": 14, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [ + "def sweep_death_rate(death_rates, birth_rate=0.9):\n", + " \n", + " for death_rate in death_rates:\n", + " system = make_system(birth_rate=birth_rate,\n", + " death_rate=death_rate)\n", + " run_simulation(system)\n", + " p_end = final_population(system)\n", + " plot(death_rate, p_end, 'r^', label='rabbits')\n", + " \n", + " decorate(xlabel='Deaths per rabbit per season',\n", + " ylabel='Final population')" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "And here are the results. Again, the x-axis is `death_rate`, NOT TIME." + ] + }, + { + "cell_type": "code", + "execution_count": 15, + "metadata": {}, + "outputs": [ + { + "data": { + "image/png": "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\nMXHiRJw6dQoAMGTIEFy9ehV9+/bFhAkT4OXlhYkTJ6rHadSoEYYPH4433ngDffr0we3bt/H1119X\neTjCy8sLMpkMnp6e2LlzJ+bPn4+ioiJ4e3uja9euCAgIwCuvvILRo0frddtr9WTGipM1vvvuOyxa\ntAg2NjbYvn07PvjgAzzzzDNQqVQwNzfXeE9FKFCpVMjJyanUX7FMdnY2VCoVAFQ5RkUfERHR41y+\nfLlS2/Tp0zF9+nSNtk2bNql/3rBhg/rn2bNnV3q/r6+v+q6L/fv3f+x6bW1tcejQIY3+r7/+Wofq\na1at7lGoOEPUz88P9vb2aNasGd588004Ojo+8b2tq0pj1eknIiKiymo1KLRu3RoANA4dAOWpKSsr\nC1KpFLm5uRp9OTk5AACZTAYrK6tK/RXLSKVSSKVSAKhyDH1fPkJERGSMaj0oWFhYVLqUIz09He3a\ntYNCoah0LkFiYiJkMhlsbW2hUCigVCrVJ3IAwJ07d5CRkQFXV1dYW1tDJpNVOYarq6v+NoyIiMhI\n1WpQMDExwfjx47Fx40acPHkSRUVFiI6OxqVLlzB69Gj4+/sjPj4e+/fvR1FREc6fP4+1a9di/Pjx\nkEgk6N27Nzp27Ih58+YhJycHKpUKYWFhkMvlcHd3h0Qigb+/P9asWYOUlBQUFRUhNjYWJ0+eVN+r\nm4iIiHRX63dmnDRpEkpKShASEoLs7GzY2dlh1apV6Ny5MwAgPDwcS5cuxYwZMyCVSuHn54cJEyYA\nKA8akZGRCA0NhYeHByQSCdzd3REZGQkTExMAQEBAAAoLCxEUFASVSgU7OzssWbKk0pUQRERE9HgS\noe/HTj0lMjMz4enpiSNHjsDa2trQ5RAREemVrp97fCgUERERacWgQERERFoxKBAREZFWDApERESk\nFYMCERERacWgQERERFoxKBAREZFWDApERESkFYMCERERacWgQERERFoxKBAREZFWDApERESkFYMC\nERERacWgQERERFoxKBAREZFWDApERESkFYMCERERacWgQERERFoxKBAREZFWDApERESkFYMCERER\nacWgQERERFoxKBAREZFWDApERESkFYMCERERacWgQERERFoxKBAREZFWDApERESkFYMCERERacWg\nQERERFoxKBAREZFWDApERESkFYMCERERadWwtlfo4eGBrKwsNGigmVFiYmJgZ2eH2NhYrF69Gmlp\n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\nAABJRU5ErkJggg==\n", + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "death_rates = linspace(0.1, 1, 20)\n", + "sweep_death_rate(death_rates)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "In the previous sweeps, we hold one parameter constant and sweep the other.\n", + "\n", + "You can also sweep more than one variable at a time, and plot multiple lines on a single axis.\n", + "\n", + "To keep the figure from getting too cluttered, I'll reduce the number of values in `birth_rates`:" + ] + }, + { + "cell_type": "code", + "execution_count": 16, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "array([ 0.4, 0.6, 0.8, 1. ])" + ] + }, + "execution_count": 16, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "birth_rates = linspace(0.4, 1, 4)\n", + "birth_rates" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "By putting one for loop inside another, we can enumerate all pairs of values.\n", + "\n", + "The results show 4 lines, one for each value of `birth_rate`.\n", + "\n", + "(I did not plot the lines between the data points because of a limitation in `plot`.)" + ] + }, + { + "cell_type": "code", + "execution_count": 17, + "metadata": {}, + "outputs": [ + { + "data": { + "image/png": "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\n", + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "for birth_rate in birth_rates:\n", + " for death_rate in death_rates:\n", + " system = make_system(birth_rate=birth_rate,\n", + " death_rate=death_rate)\n", + " run_simulation(system)\n", + " p_end = final_population(system)\n", + " plot(death_rate, p_end, 'c^', label='rabbits')\n", + " \n", + "decorate(xlabel='Deaths per rabbit per season',\n", + " ylabel='Final population')" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "If you suspect that the results depend on the difference between `birth_rate` and `death_rate`, you could run the same loop, plotting the \"net birth rate\" on the x axis.\n", + "\n", + "If you are right, the results will fall on a single curve, which means that knowing the difference is sufficient to predict the outcome; you don't actually have to know the two parameters separately." + ] + }, + { + "cell_type": "code", + "execution_count": 18, + "metadata": {}, + "outputs": [ + { + "data": { + "image/png": "iVBORw0KGgoAAAANSUhEUgAAAhAAAAFhCAYAAAAhlpNwAAAABHNCSVQICAgIfAhkiAAAAAlwSFlz\nAAALEgAACxIB0t1+/AAAIABJREFUeJzs3XlcVPX+P/DXYWBAlgFkBlEBIxUyEUEQFRcKvXopsazc\nJZdAybRsuYpa5lVMWy7mloX73rW0UtLK7KuGlaYJuWU3FR1XlAEVkf3z+4MfEwMDzCDDDPB6Ph49\nHM45n3PenxnivOeznI8khBAgIiIiMoKVuQMgIiKihocJBBERERmNCQQREREZjQkEERERGY0JBBER\nERnN2twBNBR5eXk4efIkVCoVZDKZucMhIiIyqeLiYty8eRP+/v6ws7OrtJ8JhIFOnjyJUaNGmTsM\nIiKierV582aEhIRU2s4EwkAqlQpA6Rvp4eFh5miIiIhM6/r16xg1apT2/lcREwgDlXVbeHh4wNPT\n08zREBER1Y46UY2S/BLI3eWwcbfR+VfmULmLvqpueyYQRERETYhjZ0dkbMtAXnqeznYHfwd4TjH8\nCzJnYRARETUhTqFOkGSSzjbJSoJqiP6uiqowgSAiImpCrJ2s4eDvoLPNOdwZth62Rp2HCQQREVET\nowhTaF/LHGRQRimNPgcTCCIioibGsZMjZE6lgyPdotz0Dp6sCRMIIiKiJkaSSVCEKiBvKYdLuEut\nzsFZGERERE2QoocC9o/aQ7KSaj5YDyYQRERETZCdlx3gVfvy7MIgIiIiozGBICIiIqMxgSAiIiKj\nMYGgBxYdHY033nijyv07duyAn58fioqKqjymU6dO2LFjhynCIyIiE+AgSgtk7EInjcGJEye0r+/d\nu4dt27Zh3LhxZoyIiIiqwwTCAtXVQicN1eHDh7F27VomEEREFoxdGBaorhY6qQ0/Pz+sW7cOAwYM\nwNixYwEA58+fx4QJE9C9e3cEBwdj1KhROHXqlE45IQTeffdddO/eHd27d8esWbOQl6ebAB06dAiR\nkZEICgrCkCFDcObMGZ3rfvbZZ9i6dSsmT56MGzduoFOnTtizZw/y8/MxZ84c9OrVC507d0ZERAQ+\n/vhjCCFM/n4QEZF+TCAsUF0tdFJbn3/+OZYvX461a9cCAF555RU4Oztj//79OHToEDw9PTFlyhSd\nMvv374eHhwcOHDiA9evX44cffsDixYt1jvnvf/+L9evX48cff0SrVq0QGxuLwsJCnWNGjBiBF198\nES1atMCJEycQGRmJ9evX49ixY/jiiy+QlpaGxYsXY8OGDfjxxx9N+0YQEVGVmEBYqLpY6KS2evXq\nhXbt2kGSSltBtm7dinnz5sHOzg52dnZ44okncOXKFdy8eVNbpkWLFhgzZgxsbW3h5+eHQYMG4fvv\nv9c5b1xcHNzd3eHo6IgXX3wRN2/eRFpaWo3x3LlzB1ZWVrCzswNQOuDy0KFD6NOnTx3WmoiIjMEx\nEBaqbKGT4rvFtV7opLa8vHQfTXb8+HEsX74cf/31F/Lz87VdB/n5+dpj2rdvr1OmTZs2uHbtms62\n8sc89NBDAIDr16/XGM+oUaPw448/onfv3ujatSt69uyJqKgouLm5GVUvIiKqO2yBsFB1sdBJbcnl\ncu3rCxcu4MUXX0RQUBC+//57nDhxAitWrKhUpqy1ojxbW1ujj9GnZcuW+Oqrr7BhwwYEBwfjq6++\nQv/+/XVmbhARUf1iAmHBFD0UUD2nqvVCJ3Xh9OnTKCwsxMSJE+HiUprI6Ot2uHDhgs7P6enpaNmy\nZZXHpKenAwA8PDxqjCE3Nxd5eXkICAhAXFwcduzYgQ4dOuCrr74ytjpERFRHmEBYMDsvOzj6O5o1\nhrLujGPHjiE/Px979uzBr7/+CgA6XRRqtRqffvopCgoKcPr0aezcuRORkZE651qxYgUyMzORk5OD\nZcuWoU2bNvD39690zWbNmuHOnTu4ceMGcnNz8dJLL2HmzJnIzMwEAFy8eBHXrl2Dj4+PqapNREQ1\nYAJB1Sr71j9z5kz06tULBw8exLJlyxAcHIzY2FgcOXIEAPDEE0/g3Llz6N27N8aPH4/+/fsjNjZW\nex4bGxs8++yzGDlyJHr16oWbN29i2bJlers1+vfvD5VKhb59+2LHjh1YuHAhCgoKEBkZic6dOyMm\nJgaDBg3CiBEj6u19ICIiXZLgZHqDXL58GX379sW+ffvg6dn4H+ZERERNW033PbZAEBERkdGYQBAR\nEZHRmEAQERGR0ZhAEBERkdGYQBAREZHRmEAQERGR0ZhAEBERkdGYQBAREZHRmEAQERGR0ZhAEBER\nkdGYQBAREZHRmEAQERGR0ZhAEBERkdGYQBAREZHRmEAQERGR0ZhAEBERkdHqPYFQq9WIjo6Gn58f\nLl++rLMvOTkZgwcPRlBQEPr3749FixahuLhYp2xcXBzCwsLQo0cPxMXFQa1Wa/cXFxdj0aJFGDBg\nAIKCgvD0009j165dOtc4dOgQhg8fjpCQEDz++OOYPXs27t+/b9pKExERNTL1mkDs3bsXw4YNQ6tW\nrSrtO3LkCOLj4zFhwgQcPnwYS5cuxc6dO7FixQoAQGFhIWJjY6FQKJCcnIxvv/0Wrq6uiImJQWFh\nIQBgxYoV+PLLL5GYmIjDhw9j8uTJmDFjBg4fPgwASE9PR1xcHJ588kn8+OOP2LBhA06ePIm5c+fW\n35tARETUCNRrApGdnY3NmzfjqaeeqrRv06ZN6NOnDyIjIyGXy+Hn54exY8di48aNKCkpQUpKCi5e\nvIgZM2agefPmUCgUmD59OtRqNQ4cOAAhBDZv3oxx48ahY8eOkMvl6NevH8LDw7FhwwYAwH//+188\n/PDDiI6ORrNmzeDl5YVJkyZh586d0Gg09flWEBERNWj1mkAMGTIEPj4+evelpqYiICBAZ1tAQACy\ns7ORnp6O1NRUeHt7w9XVVbvfxcUFXl5eSEtLw6VLl6DRaPSeIy0trdprFBUV4dSpU3VRRSIioibB\nYgZRajQaODs762wrSxY0Gg2ysrIq7S87JjMzU9uCoO8cZfuqu0ZmZmbdVISIiKgJsJgE4kFIkvRA\n+w09hoiIiEpZTAKhVCqRnZ2tsy0rKwsAoFKp4ObmVml/2TFKpRJKpRIA9J7Dzc3NoGsQERGRYSwm\ngQgKCtKOVShz7NgxqFQqeHt7IygoCGq1Wqer4datW7h06RJCQkLg6ekJlUql9xwhISHVXkMul6NT\np04mqhkREVHjYzEJxJgxY5CSkoLdu3ejoKAAJ06cwNq1azFu3DhIkoSePXuiXbt2mD9/PrKysqDR\naJCQkABfX1+EhYVBkiSMGTMGa9aswcmTJ1FQUIDk5GT89NNPGDt2LABg+PDhUKvVWLduHfLy8nD+\n/HksXboUQ4YMgZOTk3nfACIiogbEuj4vNmDAAFy9ehVCCADAP//5T0iShKeeegoJCQlITEzEkiVL\nMG3aNCiVSkRHR2P8+PEAAJlMhqSkJMydOxcRERGQJAlhYWFISkqCTCYDAMTExCA/Px+TJk2CRqOB\nj48PFi9erJ154enpiZUrV+K9997Df/7zHygUCgwcOBCvv/56fb4NREREDZ4kyu7mVK3Lly+jb9++\n2LdvHzw9Pc0dDhERkUnVdN+zmC4MIiIiajiYQBAREZHRmEAQERGR0ZhAEBERkdGYQBAREZHRmEAQ\nERGR0ZhAEBERkdGYQBAREZHRmEAQERGR0ZhAEBERkdGYQBAREZHRmEAQERGR0ZhAEBERkdGYQBAR\nEZHRmEAQERGR0ZhAEBERkdGYQBAREZHRmEAQERGR0azNHQAREREZT52oRkl+CeTucti42+j8K3OQ\nmfz6TCCIiIgaIMfOjsjYloG89Dyd7Q7+DvCc4mny67MLg4iIqAFyCnWCJJN0tklWElRDVPVyfSYQ\nREREDZC1kzUc/B10tjmHO8PWw7Zers8EgoiIqIFShCm0r2UOMiijlPV2bSYQREREDZRjJ0fInEoH\nTLpFudXL4MkyTCCIiIgaKEkmQRGqgLylHC7hLvV6bc7CICIiasAUPRSwf9QekpVU88F1iAkEERFR\nA2bnZQd41f912YVBRERERmMCQUREREZjAkFERERGYwJBRERERmMCQUREREZjAkFERERGYwJBRERE\nRmMCQUREREZjAkFERERGYwJBRERERmMCQUREREZjAkFERERGs7gE4vz583jxxRfRo0cPhISEYOjQ\nofi///s/7f7k5GQMHjwYQUFB6N+/PxYtWoTi4mLtfrVajbi4OISFhaFHjx6Ii4uDWq3W7i8uLsai\nRYswYMAABAUF4emnn8auXbvqtY5EREQNnUGrcebm5mLDhg1ITU1Fdna23mM+/fTTBw6mpKQEMTEx\n6Ny5M/bs2QN7e3ts3rwZU6ZMwc6dO3Hr1i3Ex8fj/fffR9++fXHhwgXExcXBxsYGkydPRmFhIWJj\nYxEQEIDk5GRYW1tjwYIFiImJQXJyMmxsbLBixQp8+eWX+Oijj9C+fXscPHgQU6dOhbu7O7p16/bA\ndSAiImoKDGqBmDNnDj788EOo1WrY2Njo/a8uaDQaXLlyBU8//TRcXFwgl8sxcuRIFBYW4o8//sCm\nTZvQp08fREZGQi6Xw8/PD2PHjsXGjRtRUlKClJQUXLx4ETNmzEDz5s2hUCgwffp0qNVqHDhwAEII\nbN68GePGjUPHjh0hl8vRr18/hIeHY8OGDXVSByIioqbAoBaIgwcPYuHChXj66adNGoxSqURwcDA+\n//xzdOrUCU5OTti6dStcXV3RrVs3LFy4ECNHjtQpExAQgOzsbKSnpyM1NRXe3t5wdXXV7ndxcYGX\nlxfS0tLQvn17aDQaBAQEVDrHxo0bTVo3IiKixsSgBKK4uBghISGmjgUAsHTpUsTGxqJHjx6QJAmu\n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\n", + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "for birth_rate in birth_rates:\n", + " for death_rate in death_rates:\n", + " system = make_system(birth_rate=birth_rate,\n", + " death_rate=death_rate)\n", + " run_simulation(system)\n", + " p_end = final_population(system)\n", + " net_birth_rate = birth_rate - death_rate\n", + " plot(net_birth_rate, p_end, 'mv', label='rabbits')\n", + " \n", + "decorate(xlabel='Net births per rabbit per season',\n", + " ylabel='Final population')" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "On the other hand, if you guess that the results depend on the ratio of the parameters, rather than the difference, you could check by plotting the ratio on the x axis.\n", + "\n", + "If the results don't fall on a single curve, that suggests that the ratio alone is not sufficient to predict the outcome. " + ] + }, + { + "cell_type": "code", + "execution_count": 19, + "metadata": {}, + "outputs": [ + { + "data": { + "image/png": "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\niejoaDz33HMoKSmpt8/YsWMRFhaGfv36YdKkSThw4ICxPTg4GGfOnMFbb72F4OBgkxGUoqIixMfH\nIzw8HAMHDjSZchJC4J133sHIkSMRHh6OAQMGYM6cOVCpVLc9NqLbEkTULBYsWCBiYmIabKuqqhJR\nUVFi0aJFxm0pKSmif//+4ocffhDnz58XBw4cEMOGDRNz5swxvmft2rUiKChI5OXlidLSUiGEEPff\nf794+umnjf1MnDhRDBkyROzevVsUFRWJzz77TERERJh8VkP1DB8+XDz00EPixx9/FIWFhWLdunWi\nd+/e4p133hFCCFFSUiKeeuopMWDAAFFcXCzKy8sb7Gvq1Kli4MCBIiEhQeTl5YkTJ06IGTNmiLCw\nMHHhwgUhhBArVqwQQUFBorq62vieP/3pT+KZZ54Rp06dEteuXROHDx8WQUFB4v333xfFxcXG77R/\n//4iMTFR5OTkiP/9738iOTlZ/N///Z+4ePGiEEKIZcuWicGDB4v9+/eL8+fPi4MHD4qHH35YPPHE\nE40ee0Pfa1pamggNDRUbNmwQhYWFYv/+/WLEiBHioYceEjqdrtHvcuLEieK+++4TP/zwg/jll1/E\nq6++KgYNGmRyvNu2bRNBQUHi1VdfFadPnxY//vijiIuLE2PHjhV6vV4IIcR///tfERQUJJYvXy6K\niorEr7/+KlJSUkRERITxWC9evGjsp7i4WNTW1hq/25kzZ4qsrCxx6tQpsWjRIhEUFCRyc3OFEEJ8\n/PHHIiIiQnz99dfi3LlzIi8vT8THx4u4uLhGj4voThggiJpJYwHi0qVL4q9//asICQkRx44dM9le\nVFRksu8bb7whIiIihMFgEEJc/4c/KChIqFQq4z43B4icnBwRFBQkvvzyS5N+3nzzTRESEtLoSX/H\njh0iKChI5Ofnm2yfP3++GDx48B2P6WZTp04VvXv3FleuXDFuu3DhgggKChLr1q0TQjQcIEJCQsS1\na9eM7yksLBRBQUFiy5YtJp8fFBQk/ve//xm31R3z119/LYQQIjExsV5YuHDhgjhx4kSjNd/6vdbU\n1IiIiAixePFik/327dsngoKCRFZWVoP91NX88ccfm2z/85//bHK8DzzwgJg6darJPgcPHhRBQUFi\nz549QgghysvLxc8//2wSVn755RcRFBQkdu7cKYQQQqfTiaCgILFixQrjPnXfbV0/QvwWNOq+/7//\n/e/1wkJJSYnIz883BhgiSznaegSEqC0pKSlBZGSk8bXBYEB1dTVCQ0Px73//G7179za2OTg4YMOG\nDbhwUFUAAAcISURBVNi3bx+uXLkCvV4PnU4HnU4HrVZ7xwWHAIxrBvr27WuyvU+fPtDpdPj1118R\nHh7e4PtcXFwQEhJisj08PBxffPEFSkpK4OPjY/Zx+/v7m+zfpUsXeHl54dSpU42+p3v37matq3B1\ndUWvXr2Mrzt16gQAKCsrA3B9GuLvf/875s2bhwceeADR0dHo0qULunTpYnb9p06dQmVlZYPfIwAc\nO3YMgwYNqve+//3vfwCAP/zhDybbIyIicOTIEQBAeXk5Tp06hUceecRkn759+8LFxQVHjx7F0KFD\n4erqitzcXCxatAhFRUWoqqoyTidpNJo7HkNdrcBv31F5eTkA4P7778fHH3+MhIQEjB49GgMGDEDX\nrl2N+xH9HgwQRM3Iy8sLmzdvNr4+fPgwFixYgFmzZpmcgIQQ/7+9uwtpsv0DOP591JzbamsQRCBs\n9jKijDEarZMoqegkEokgqMTKjGTWDoKyTSJnqWUHQbMXRpliVkKUR7EIHIVgaR70wjLEl2q9SIIu\nZ1rY/yC2v7otN57n+Z/8fx8QvG/v63df18Xg+t33dV2T/fv38+nTJ44fP87KlStRKBQ0NDTQ0NCQ\n8P3CA8TcuXOnnVer1cDvdRbxyqlUqqh/1zu1XDIJRKxEQKlUEgqF4pYJ32s2SqVy2nG4zuHBdefO\nnSxcuJCbN29SWlrKxMQEa9euxeFwTEs8/uTv9GOsOk5tW/gat9sdtRV2fHycwcFBAOrq6qisrGT3\n7t2cOHECrVbL58+fI2s0ZjO1DjP7aP369dTX11NfX8/p06cJBoOYTCaOHTvG6tWrE4ovxEySQAjx\nD0pNTUWv10eO9Xo9Dx484NSpU1it1shA293djd/vx+VykZeXF7l+toWPM4XjBYPBaQNI+Ok83hP+\nvHnzGB0d5devX9OSiPBgl+yOi7GxsahzoVAo4STh78rJySEnJ4eJiQna2to4f/48RUVFPHr0KCpJ\nimVqP04VPtZoNDHLqVQqILr9U+OEYxcUFLBjx46oGOGkpaWlBbPZTFlZWeRvQ0NDs9Y9URaLBYvF\nws+fP+ns7OTixYscOHCA1tbWuO0T4k9kF4YQ/zKn00kwGOTcuXORc+EthPPnz4+c+/btG16vF/jv\nk2PYzOOw7OxsADo7O6ed7+rqQqlUxn0Cz87OZnx8nBcvXkSVy8zMRKfTJdK0iP7+fr58+RI5fv/+\nPcPDwyxbtiypOBC/rbFMTk7i9XoJBAIApKens2HDBg4fPsyHDx+idjnEu1dWVhZqtTpmPwKsWrUq\nZvnFixcDRPXj8+fPI7+r1WqMRiMDAwPo9fppPxMTE5FphB8/fkz7PACR3SaJfh7iefz4cWS6JS0t\nDavVSmlpKaOjo/T29iYVS4gwSSCE+JdlZmZSXFzMnTt3ePbsGfB74NFqtTQ2NtLb20tXVxf79u1j\n06ZNADx9+pSxsbHIk6HP5+PNmzdRsc1mM2vWrKGqqgqfz8fAwAC3b9+msbGR/Px8MjIyYtZp8+bN\nGAwGHA4HHR0d9PX1ceXKFbxeL0VFRUm3UaPR4HA4eP36NX6/H6fTiUqlYsuWLUnFCLfd7/fz/fv3\nWcukpKTg8Xiw2+10dHTw8eNHXr16xa1btzAajXGnYWb2a3p6OgUFBTQ3N9PU1MS7d+/w+Xy4XC7M\nZjMWiyVmnKVLl7JixQquXr1Ke3s7PT09nDlzJurNwcGDB3n48CGXLl2ip6eHt2/fUl5ezvbt2+nr\n6wN+r5tob2+nra2N/v5+qqurmZycJDU1lZcvXzI0NERaWlpkrYTf72dkZCShvr179y42m40nT54Q\nCATo7u7m+vXrLFiwgCVLliQUQ4iZZApDiP+BvXv3cv/+fZxOJy0tLahUKmpqaqisrCQ3Nxe9Xo/d\nbsdsNtPV1UVJSQmXL19m3bp1WCwWqqqqMBqNMb+l0e12U11dTWlpKSMjIyxatAibzUZhYWHc+igU\nCm7cuEFlZSXFxcWEQiEMBgMulyvma/bZLF++nNzcXOx2O4FAAIPBQG1t7axfHjWVTqdjz549NDc3\n09rayr179xIqF27/kSNHGB4eRqfTYbVaKS8vjzt9EatfS0pKyMjIwOPxUFFRgVarZePGjRw9evSP\n0yAXLlygrKyMwsJC1Go1eXl55Ofnc/bs2cg1W7duBcDj8eB2u5kzZw4mk4m6ujqysrIAsNvtDA4O\nYrPZUCgUbNu2jZMnT6JSqWhqaiIlJYWKigoOHTpEbW0tu3btwuPxJNRHLpeLmpoaHA4HX79+RaPR\nYDKZuHbtWtS6DyES9devZN+FCSGEEOL/nkxhCCGEECJpkkAIIYQQImmSQAghhBAiaZJACCGEECJp\nkkAIIYQQImmSQAghhBAiaZJACCGEECJpkkAIIYQQImmSQAghhBAiaf8BkLEx9wK5cvMAAAAASUVO\nRK5CYII=\n", + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "for birth_rate in birth_rates:\n", + " for death_rate in death_rates:\n", + " system = make_system(birth_rate=birth_rate,\n", + " death_rate=death_rate)\n", + " run_simulation(system)\n", + " p_end = final_population(system)\n", + " birth_ratio = birth_rate / death_rate\n", + " plot(birth_ratio, p_end, 'y>', label='rabbits')\n", + " \n", + "decorate(xlabel='Ratio of births to deaths',\n", + " ylabel='Final population')" + ] + }, + { + "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 +}