diff --git a/colab/chap01.ipynb b/colab/chap01.ipynb
index 7a39ec16c..a385d9221 100644
--- a/colab/chap01.ipynb
+++ b/colab/chap01.ipynb
@@ -1,532 +1,890 @@
{
- "cells": [
- {
- "cell_type": "markdown",
- "metadata": {},
- "source": [
- "# Chapter 1"
- ]
- },
- {
- "cell_type": "markdown",
- "metadata": {
- "tags": []
- },
- "source": [
- "*Modeling and Simulation in Python*\n",
- "\n",
- "Copyright 2021 Allen Downey\n",
- "\n",
- "License: [Creative Commons Attribution-NonCommercial-ShareAlike 4.0 International](https://creativecommons.org/licenses/by-nc-sa/4.0/)"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": 1,
- "metadata": {
- "tags": []
- },
- "outputs": [],
- "source": [
- "# check if the libraries we need are installed\n",
- "\n",
- "try:\n",
- " import pint\n",
- "except ImportError:\n",
- " !pip install pint\n",
- " import pint\n",
- " \n",
- "try:\n",
- " from modsim import *\n",
- "except ImportError:\n",
- " !pip install modsimpy\n",
- " from modsim import *"
- ]
- },
- {
- "cell_type": "markdown",
- "metadata": {},
- "source": [
- "## Jupyter\n",
- "\n",
- "Welcome to *Modeling and Simulation in Python*, and welcome to Jupyter.\n",
- "\n",
- "This is a Jupyter notebook, which is a development environment where you can write and run Python code. Each notebook is divided into cells. Each cell contains either text (like this cell) or Python code."
- ]
- },
- {
- "cell_type": "markdown",
- "metadata": {},
- "source": [
- "### Selecting and running cells\n",
- "\n",
- "To select a cell, click in the left margin next to the cell. You should see a blue frame surrounding the selected cell.\n",
- "\n",
- "To edit a code cell, click inside the cell. You should see a green frame around the selected cell, and you should see a cursor inside the cell.\n",
- "\n",
- "To edit a text cell, double-click inside the cell. Again, you should see a green frame around the selected cell, and you should see a cursor inside the cell.\n",
- "\n",
- "To run a cell, hold down SHIFT and press ENTER. \n",
- "\n",
- "* If you run a text cell, Jupyter formats the text and displays the result.\n",
- "\n",
- "* If you run a code cell, Jupyter runs the Python code in the cell and displays the result, if any.\n",
- "\n",
- "To try it out, edit this cell, change some of the text, and then press SHIFT-ENTER to format it."
- ]
- },
- {
- "cell_type": "markdown",
- "metadata": {},
- "source": [
- "### Adding and removing cells\n",
- "\n",
- "You can add and remove cells from a notebook using the buttons in the toolbar and the items in the menu, both of which you should see at the top of this notebook.\n",
- "\n",
- "Try the following exercises:\n",
- "\n",
- "1. From the Insert menu select \"Insert cell below\" to add a cell below this one. By default, you get a code cell, as you can see in the pulldown menu that says \"Code\".\n",
- "\n",
- "2. In the new cell, add a print statement like `print('Hello')`, and run it.\n",
- "\n",
- "3. Add another cell, select the new cell, and then click on the pulldown menu that says \"Code\" and select \"Markdown\". This makes the new cell a text cell.\n",
- "\n",
- "4. In the new cell, type some text, and then run it.\n",
- "\n",
- "5. Use the arrow buttons in the toolbar to move cells up and down.\n",
- "\n",
- "6. Use the cut, copy, and paste buttons to delete, add, and move cells.\n",
- "\n",
- "7. As you make changes, Jupyter saves your notebook automatically, but if you want to make sure, you can press the save button, which looks like a floppy disk from the 1990s.\n",
- "\n",
- "8. Finally, when you are done with a notebook, select \"Close and Halt\" from the File menu."
- ]
- },
- {
- "cell_type": "markdown",
- "metadata": {},
- "source": [
- "### Installing modules\n",
- "\n",
- "These notebooks use standard Python modules like NumPy and SciPy. I assume you already have them installed in your environment.\n",
- "\n",
- "They also use two less common modules: Pint, which provides units, and `modsimpy`, which contains code I wrote specifically for this book.\n",
- "\n",
- "The following cells check whether you have these modules already and tries to install them if you don't."
- ]
- },
- {
- "cell_type": "code",
- "execution_count": 2,
- "metadata": {},
- "outputs": [],
- "source": [
- "try:\n",
- " import pint\n",
- "except ImportError:\n",
- " !pip install pint\n",
- " import pint"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": 3,
- "metadata": {},
- "outputs": [],
- "source": [
- "try:\n",
- " from modsim import *\n",
- "except ImportError:\n",
- " !pip install modsimpy\n",
- " from modsim import *"
- ]
- },
- {
- "cell_type": "markdown",
- "metadata": {},
- "source": [
- "The first time you run this on a new installation of Python, it might produce a warning message in pink. That's probably ok, but if you get a message that says `modsim.py depends on Python 3.7 features`, that means you have an older version of Python, and some features in `modsim.py` won't work correctly.\n",
- "\n",
- "If you need a newer version of Python, I recommend installing Anaconda. You'll find more information in the preface of the book.\n",
- "\n",
- "You can find out what version of Python and Jupyter you have by running the following cells."
- ]
- },
- {
- "cell_type": "code",
- "execution_count": 4,
- "metadata": {},
- "outputs": [],
- "source": [
- "!python --version"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": 5,
- "metadata": {},
- "outputs": [],
- "source": [
- "!jupyter-notebook --version"
- ]
- },
- {
- "cell_type": "markdown",
- "metadata": {},
- "source": [
- "## The penny myth\n",
- "\n",
- "The following cells contain code from the beginning of Chapter 1.\n",
- "\n",
- "`modsim` defines `UNITS`, which contains variables representing pretty much every unit you've ever heard of. It uses [Pint](https://pint.readthedocs.io/en/latest/), which is a Python library that provides tools for computing with units.\n",
- "\n",
- "The following lines create new variables named `meter` and `second`."
- ]
- },
- {
- "cell_type": "code",
- "execution_count": 6,
- "metadata": {},
- "outputs": [],
- "source": [
- "meter = UNITS.meter"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": 7,
- "metadata": {},
- "outputs": [],
- "source": [
- "second = UNITS.second"
- ]
- },
- {
- "cell_type": "markdown",
- "metadata": {},
- "source": [
- "To find out what other units are defined, type `UNITS.` (including the period) in the next cell and then press TAB. You should see a pop-up menu with a list of units."
- ]
- },
- {
- "cell_type": "code",
- "execution_count": null,
- "metadata": {},
- "outputs": [],
- "source": []
- },
- {
- "cell_type": "markdown",
- "metadata": {},
- "source": [
- "Create a variable named `a` and give it the value of acceleration due to gravity."
- ]
- },
- {
- "cell_type": "code",
- "execution_count": 8,
- "metadata": {},
- "outputs": [],
- "source": [
- "a = 9.8 * meter / second**2"
- ]
- },
- {
- "cell_type": "markdown",
- "metadata": {},
- "source": [
- "Create `t` and give it the value 4 seconds."
- ]
- },
- {
- "cell_type": "code",
- "execution_count": 9,
- "metadata": {},
- "outputs": [],
- "source": [
- "t = 4 * second"
- ]
- },
- {
- "cell_type": "markdown",
- "metadata": {},
- "source": [
- "Compute the distance a penny would fall after `t` seconds with constant acceleration `a`. Notice that the units of the result are correct."
- ]
- },
- {
- "cell_type": "code",
- "execution_count": 10,
- "metadata": {},
- "outputs": [],
- "source": [
- "a * t**2 / 2"
- ]
- },
- {
- "cell_type": "markdown",
- "metadata": {},
- "source": [
- "**Exercise**: Compute the velocity of the penny after `t` seconds. Check that the units of the result are correct."
- ]
- },
- {
- "cell_type": "code",
- "execution_count": 11,
- "metadata": {},
- "outputs": [],
- "source": [
- "# Solution goes here"
- ]
- },
- {
- "cell_type": "markdown",
- "metadata": {},
- "source": [
- "**Exercise**: Why would it be nonsensical to add `a` and `t`? What happens if you try?"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": 12,
- "metadata": {},
- "outputs": [],
- "source": [
- "# Solution goes here"
- ]
- },
- {
- "cell_type": "markdown",
- "metadata": {},
- "source": [
- "The error messages you get from Python are big and scary, but if you read them carefully, they contain a lot of useful information.\n",
- "\n",
- "1. Start from the bottom and read up.\n",
- "2. The last line usually tells you what type of error happened, and sometimes additional information.\n",
- "3. The previous lines are a \"traceback\" of what was happening when the error occurred. The first section of the traceback shows the code you wrote. The following sections are often from Python libraries.\n",
- "\n",
- "In this example, you should get a `DimensionalityError`, which is defined by Pint to indicate that you have violated a rules of dimensional analysis: you cannot add quantities with different dimensions.\n",
- "\n",
- "Before you go on, you might want to delete the erroneous code so the notebook can run without errors."
- ]
- },
- {
- "cell_type": "markdown",
- "metadata": {},
- "source": [
- "## Falling pennies\n",
- "\n",
- "Now let's solve the falling penny problem.\n",
- "\n",
- "Set `h` to the height of the Empire State Building:"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": 13,
- "metadata": {},
- "outputs": [],
- "source": [
- "h = 381 * meter"
- ]
- },
- {
- "cell_type": "markdown",
- "metadata": {},
- "source": [
- "Compute the time it would take a penny to fall, assuming constant acceleration.\n",
- "\n",
- "$ a t^2 / 2 = h $\n",
- "\n",
- "$ t = \\sqrt{2 h / a}$"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": 14,
- "metadata": {},
- "outputs": [],
- "source": [
- "t = sqrt(2 * h / a)\n",
- "t"
- ]
- },
- {
- "cell_type": "markdown",
- "metadata": {},
- "source": [
- "Given `t`, we can compute the velocity of the penny when it lands.\n",
- "\n",
- "$v = a t$"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": 15,
- "metadata": {},
- "outputs": [],
- "source": [
- "v = a * t\n",
- "v"
- ]
- },
- {
- "cell_type": "markdown",
- "metadata": {},
- "source": [
- "We can convert from one set of units to another like this:"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": 16,
- "metadata": {},
- "outputs": [],
- "source": [
- "mile = UNITS.mile\n",
- "hour = UNITS.hour"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": 17,
- "metadata": {},
- "outputs": [],
- "source": [
- "v.to(mile/hour)"
- ]
- },
- {
- "cell_type": "markdown",
- "metadata": {},
- "source": [
- "**Exercise:** Suppose you bring a 10 foot pole to the top of the Empire State Building and use it to drop the penny from `h` plus 10 feet.\n",
- "\n",
- "Define a variable named `foot` that contains the unit `foot` provided by `UNITS`. Define a variable named `pole_height` and give it the value 10 feet.\n",
- "\n",
- "What happens if you add `h`, which is in units of meters, to `pole_height`, which is in units of feet? What happens if you write the addition the other way around?"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": 18,
- "metadata": {},
- "outputs": [],
- "source": [
- "# Solution goes here"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": 19,
- "metadata": {},
- "outputs": [],
- "source": [
- "# Solution goes here"
- ]
- },
- {
- "cell_type": "markdown",
- "metadata": {},
- "source": [
- "**Exercise:** In reality, air resistance limits the velocity of the penny. At about 18 m/s, the force of air resistance equals the force of gravity and the penny stops accelerating.\n",
- "\n",
- "As a simplification, let's assume that the acceleration of the penny is `a` until the penny reaches 18 m/s, and then 0 afterwards. What is the total time for the penny to fall 381 m?\n",
- "\n",
- "You can break this question into three parts:\n",
- "\n",
- "1. How long until the penny reaches 18 m/s with constant acceleration `a`.\n",
- "2. How far would the penny fall during that time?\n",
- "3. How long to fall the remaining distance with constant velocity 18 m/s?\n",
- "\n",
- "Suggestion: Assign each intermediate result to a variable with a meaningful name. And assign units to all quantities!"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": 20,
- "metadata": {},
- "outputs": [],
- "source": [
- "# Solution goes here"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": 21,
- "metadata": {},
- "outputs": [],
- "source": [
- "# Solution goes here"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": 22,
- "metadata": {},
- "outputs": [],
- "source": [
- "# Solution goes here"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": 23,
- "metadata": {},
- "outputs": [],
- "source": [
- "# Solution goes here"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": 24,
- "metadata": {},
- "outputs": [],
- "source": [
- "# Solution goes here"
- ]
- },
- {
- "cell_type": "markdown",
- "metadata": {},
- "source": [
- "### Restart and run all\n",
- "\n",
- "When you change the contents of a cell, you have to run it again for those changes to have an effect. If you forget to do that, the results can be confusing, because the code you are looking at is not the code you ran.\n",
- "\n",
- "If you ever lose track of which cells have run, and in what order, you should go to the Kernel menu and select \"Restart & Run All\". Restarting the kernel means that all of your variables get deleted, and running all the cells means all of your code will run again, in the right order.\n",
- "\n",
- "**Exercise:** Select \"Restart & Run All\" now and confirm that it does what you want."
- ]
- },
- {
- "cell_type": "code",
- "execution_count": null,
- "metadata": {},
- "outputs": [],
- "source": []
- }
- ],
- "metadata": {
- "kernelspec": {
- "display_name": "Python 3",
- "language": "python",
- "name": "python3"
- },
- "language_info": {
- "codemirror_mode": {
- "name": "ipython",
- "version": 3
- },
- "file_extension": ".py",
- "mimetype": "text/x-python",
- "name": "python",
- "nbconvert_exporter": "python",
- "pygments_lexer": "ipython3",
- "version": "3.7.9"
- }
- },
- "nbformat": 4,
- "nbformat_minor": 2
-}
+ "nbformat": 4,
+ "nbformat_minor": 0,
+ "metadata": {
+ "kernelspec": {
+ "display_name": "Python 3",
+ "language": "python",
+ "name": "python3"
+ },
+ "language_info": {
+ "codemirror_mode": {
+ "name": "ipython",
+ "version": 3
+ },
+ "file_extension": ".py",
+ "mimetype": "text/x-python",
+ "name": "python",
+ "nbconvert_exporter": "python",
+ "pygments_lexer": "ipython3",
+ "version": "3.7.9"
+ },
+ "colab": {
+ "name": "chap01.ipynb",
+ "provenance": []
+ }
+ },
+ "cells": [
+ {
+ "cell_type": "markdown",
+ "metadata": {
+ "id": "OzGdJy9CoSjm"
+ },
+ "source": [
+ "# Chapter 1"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {
+ "tags": [],
+ "id": "aGq99IikoSjn"
+ },
+ "source": [
+ "*Modeling and Simulation in Python* - Edit by Chun San Yip (7 June 2021)\n",
+ "\n",
+ "Copyright 2021 Allen Downey\n",
+ "\n",
+ "License: [Creative Commons Attribution-NonCommercial-ShareAlike 4.0 International](https://creativecommons.org/licenses/by-nc-sa/4.0/)"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "metadata": {
+ "tags": [],
+ "id": "z_kbjgvmoSjq"
+ },
+ "source": [
+ "# check if the libraries we need are installed\n",
+ "\n",
+ "try:\n",
+ " import pint\n",
+ "except ImportError:\n",
+ " !pip install pint\n",
+ " import pint\n",
+ " \n",
+ "try:\n",
+ " from modsim import *\n",
+ "except ImportError:\n",
+ " !pip install modsimpy\n",
+ " from modsim import *"
+ ],
+ "execution_count": 1,
+ "outputs": []
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {
+ "id": "bnkbKVIaoSjt"
+ },
+ "source": [
+ "## Jupyter\n",
+ "\n",
+ "Welcome to *Modeling and Simulation in Python*, and welcome to Jupyter.\n",
+ "\n",
+ "This is a Jupyter notebook, which is a development environment where you can write and run Python code. Each notebook is divided into cells. Each cell contains either text (like this cell) or Python code."
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {
+ "id": "A_F3OefeoSju"
+ },
+ "source": [
+ "### Selecting and running cells\n",
+ "\n",
+ "To select a cell, click in the left margin next to the cell. You should see a blue frame surrounding the selected cell.\n",
+ "\n",
+ "To edit a code cell, click inside the cell. You should see a green frame around the selected cell, and you should see a cursor inside the cell.\n",
+ "\n",
+ "To edit a text cell, double-click inside the cell. Again, you should see a green frame around the selected cell, and you should see a cursor inside the cell.\n",
+ "\n",
+ "To run a cell, hold down SHIFT and press ENTER. \n",
+ "\n",
+ "* If you run a text cell, Jupyter formats the text and displays the result.\n",
+ "\n",
+ "* If you run a code cell, Jupyter runs the Python code in the cell and displays the result, if any.\n",
+ "\n",
+ "To try it out, edit this cell, change some of the text, and then press SHIFT-ENTER to format it."
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {
+ "id": "-px6O_mooSjx"
+ },
+ "source": [
+ "### Adding and removing cells\n",
+ "\n",
+ "You can add and remove cells from a notebook using the buttons in the toolbar and the items in the menu, both of which you should see at the top of this notebook.\n",
+ "\n",
+ "Try the following exercises:\n",
+ "\n",
+ "1. From the Insert menu select \"Insert cell below\" to add a cell below this one. By default, you get a code cell, as you can see in the pulldown menu that says \"Code\".\n",
+ "\n",
+ "2. In the new cell, add a print statement like `print('Hello')`, and run it.\n",
+ "\n",
+ "3. Add another cell, select the new cell, and then click on the pulldown menu that says \"Code\" and select \"Markdown\". This makes the new cell a text cell.\n",
+ "\n",
+ "4. In the new cell, type some text, and then run it.\n",
+ "\n",
+ "5. Use the arrow buttons in the toolbar to move cells up and down.\n",
+ "\n",
+ "6. Use the cut, copy, and paste buttons to delete, add, and move cells.\n",
+ "\n",
+ "7. As you make changes, Jupyter saves your notebook automatically, but if you want to make sure, you can press the save button, which looks like a floppy disk from the 1990s.\n",
+ "\n",
+ "8. Finally, when you are done with a notebook, select \"Close and Halt\" from the File menu."
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {
+ "id": "zerXNqFsoSj0"
+ },
+ "source": [
+ "### Installing modules\n",
+ "\n",
+ "These notebooks use standard Python modules like NumPy and SciPy. I assume you already have them installed in your environment.\n",
+ "\n",
+ "They also use two less common modules: Pint, which provides units, and `modsimpy`, which contains code I wrote specifically for this book.\n",
+ "\n",
+ "The following cells check whether you have these modules already and tries to install them if you don't."
+ ]
+ },
+ {
+ "cell_type": "code",
+ "metadata": {
+ "id": "_0vFQPawoSj2"
+ },
+ "source": [
+ "try:\n",
+ " import pint\n",
+ "except ImportError:\n",
+ " !pip install pint\n",
+ " import pint"
+ ],
+ "execution_count": 2,
+ "outputs": []
+ },
+ {
+ "cell_type": "code",
+ "metadata": {
+ "id": "sCvWFzFfoSj2"
+ },
+ "source": [
+ "try:\n",
+ " from modsim import *\n",
+ "except ImportError:\n",
+ " !pip install modsimpy\n",
+ " from modsim import *"
+ ],
+ "execution_count": 3,
+ "outputs": []
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {
+ "id": "gQCGjWeaoSj3"
+ },
+ "source": [
+ "The first time you run this on a new installation of Python, it might produce a warning message in pink. That's probably ok, but if you get a message that says `modsim.py depends on Python 3.7 features`, that means you have an older version of Python, and some features in `modsim.py` won't work correctly.\n",
+ "\n",
+ "If you need a newer version of Python, I recommend installing Anaconda. You'll find more information in the preface of the book.\n",
+ "\n",
+ "You can find out what version of Python and Jupyter you have by running the following cells."
+ ]
+ },
+ {
+ "cell_type": "code",
+ "metadata": {
+ "colab": {
+ "base_uri": "https://localhost:8080/"
+ },
+ "id": "trFF44WeoSj4",
+ "outputId": "9f92f543-d712-46d1-d98e-c263d620bb4f"
+ },
+ "source": [
+ "!python --version"
+ ],
+ "execution_count": 4,
+ "outputs": [
+ {
+ "output_type": "stream",
+ "text": [
+ "Python 3.7.10\n"
+ ],
+ "name": "stdout"
+ }
+ ]
+ },
+ {
+ "cell_type": "code",
+ "metadata": {
+ "colab": {
+ "base_uri": "https://localhost:8080/"
+ },
+ "id": "2_Vu5cDfoSj5",
+ "outputId": "966521c8-9661-4d9f-8665-911591a2e44d"
+ },
+ "source": [
+ "!jupyter-notebook --version"
+ ],
+ "execution_count": 5,
+ "outputs": [
+ {
+ "output_type": "stream",
+ "text": [
+ "5.2.2\n"
+ ],
+ "name": "stdout"
+ }
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {
+ "id": "-8_DQC3opU_e"
+ },
+ "source": [
+ ""
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {
+ "id": "m20S6C9ZoSkA"
+ },
+ "source": [
+ "## The penny myth\n",
+ "\n",
+ "The following cells contain code from the beginning of Chapter 1.\n",
+ "\n",
+ "`modsim` defines `UNITS`, which contains variables representing pretty much every unit you've ever heard of. It uses [Pint](https://pint.readthedocs.io/en/latest/), which is a Python library that provides tools for computing with units.\n",
+ "\n",
+ "The following lines create new variables named `meter` and `second`."
+ ]
+ },
+ {
+ "cell_type": "code",
+ "metadata": {
+ "id": "ba_iObTfoSkB"
+ },
+ "source": [
+ "meter = UNITS.meter"
+ ],
+ "execution_count": 6,
+ "outputs": []
+ },
+ {
+ "cell_type": "code",
+ "metadata": {
+ "id": "4hexcmG8oSkC"
+ },
+ "source": [
+ "second = UNITS.second"
+ ],
+ "execution_count": 7,
+ "outputs": []
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {
+ "id": "ES7CSCsvoSkD"
+ },
+ "source": [
+ "To find out what other units are defined, type `UNITS.` (including the period) in the next cell and then press TAB. You should see a pop-up menu with a list of units."
+ ]
+ },
+ {
+ "cell_type": "code",
+ "metadata": {
+ "id": "6ZEFLQedoSkD"
+ },
+ "source": [
+ ""
+ ],
+ "execution_count": 7,
+ "outputs": []
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {
+ "id": "acfO_OayoSkD"
+ },
+ "source": [
+ "Create a variable named `a` and give it the value of acceleration due to gravity."
+ ]
+ },
+ {
+ "cell_type": "code",
+ "metadata": {
+ "id": "1M72SCL9oSkE"
+ },
+ "source": [
+ "a = 9.8 * meter / second**2"
+ ],
+ "execution_count": 8,
+ "outputs": []
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {
+ "id": "b4j7NKBXoSkE"
+ },
+ "source": [
+ "Create `t` and give it the value 4 seconds."
+ ]
+ },
+ {
+ "cell_type": "code",
+ "metadata": {
+ "id": "IPEqFRvCoSkF"
+ },
+ "source": [
+ "t = 4 * second"
+ ],
+ "execution_count": 9,
+ "outputs": []
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {
+ "id": "rzPmxRC3oSkF"
+ },
+ "source": [
+ "Compute the distance a penny would fall after `t` seconds with constant acceleration `a`. Notice that the units of the result are correct."
+ ]
+ },
+ {
+ "cell_type": "code",
+ "metadata": {
+ "colab": {
+ "base_uri": "https://localhost:8080/",
+ "height": 34
+ },
+ "id": "78_yVeKYoSkF",
+ "outputId": "a2d2797e-e4d3-4ed5-c2a3-0cda3be0b3f0"
+ },
+ "source": [
+ "a * t**2 / 2"
+ ],
+ "execution_count": 10,
+ "outputs": [
+ {
+ "output_type": "execute_result",
+ "data": {
+ "text/latex": "$78.4\\ \\mathrm{meter}$",
+ "text/html": [
+ "78.4 meter"
+ ],
+ "text/plain": [
+ "78.4 meter"
+ ]
+ },
+ "metadata": {
+ "tags": []
+ },
+ "execution_count": 10
+ }
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {
+ "id": "-SwFHTWFoSkG"
+ },
+ "source": [
+ "**Exercise**: Compute the velocity of the penny after `t` seconds. Check that the units of the result are correct."
+ ]
+ },
+ {
+ "cell_type": "code",
+ "metadata": {
+ "id": "P5ggIxGDoSkG"
+ },
+ "source": [
+ "# Solution goes here"
+ ],
+ "execution_count": 11,
+ "outputs": []
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {
+ "id": "tfrYScO6oSkG"
+ },
+ "source": [
+ "**Exercise**: Why would it be nonsensical to add `a` and `t`? What happens if you try?"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {
+ "id": "U9q48xkkoSkG"
+ },
+ "source": [
+ "The error messages you get from Python are big and scary, but if you read them carefully, they contain a lot of useful information.\n",
+ "\n",
+ "1. Start from the bottom and read up.\n",
+ "2. The last line usually tells you what type of error happened, and sometimes additional information.\n",
+ "3. The previous lines are a \"traceback\" of what was happening when the error occurred. The first section of the traceback shows the code you wrote. The following sections are often from Python libraries.\n",
+ "\n",
+ "In this example, you should get a `DimensionalityError`, which is defined by Pint to indicate that you have violated a rules of dimensional analysis: you cannot add quantities with different dimensions.\n",
+ "\n",
+ "Before you go on, you might want to delete the erroneous code so the notebook can run without errors."
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {
+ "id": "H-0OiM4uoSkH"
+ },
+ "source": [
+ "## Falling pennies\n",
+ "\n",
+ "Now let's solve the falling penny problem.\n",
+ "\n",
+ "Set `h` to the height of the Empire State Building:"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "metadata": {
+ "id": "8Je-Q6j2oSkI"
+ },
+ "source": [
+ "h = 381 * meter"
+ ],
+ "execution_count": 12,
+ "outputs": []
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {
+ "id": "GvZ8tOV5oSkI"
+ },
+ "source": [
+ "Compute the time it would take a penny to fall, assuming constant acceleration.\n",
+ "\n",
+ "$ a t^2 / 2 = h $\n",
+ "\n",
+ "$ t = \\sqrt{2 h / a}$"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "metadata": {
+ "colab": {
+ "base_uri": "https://localhost:8080/",
+ "height": 34
+ },
+ "id": "zCxPZ-lHoSkI",
+ "outputId": "dd41175a-a23d-4b16-c0e1-6ab6b44471df"
+ },
+ "source": [
+ "t = sqrt(2 * h / a)\n",
+ "t"
+ ],
+ "execution_count": 13,
+ "outputs": [
+ {
+ "output_type": "execute_result",
+ "data": {
+ "text/latex": "$8.817885349720552\\ \\mathrm{second}$",
+ "text/html": [
+ "8.817885349720552 second"
+ ],
+ "text/plain": [
+ "8.817885349720552 second"
+ ]
+ },
+ "metadata": {
+ "tags": []
+ },
+ "execution_count": 13
+ }
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {
+ "id": "VEeVOMjnoSkJ"
+ },
+ "source": [
+ "Given `t`, we can compute the velocity of the penny when it lands.\n",
+ "\n",
+ "$v = a t$"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "metadata": {
+ "colab": {
+ "base_uri": "https://localhost:8080/",
+ "height": 34
+ },
+ "id": "UGK075NEoSkJ",
+ "outputId": "df17a0fe-dfde-40cc-9b64-97b2758a94f0"
+ },
+ "source": [
+ "v = a * t\n",
+ "v"
+ ],
+ "execution_count": 14,
+ "outputs": [
+ {
+ "output_type": "execute_result",
+ "data": {
+ "text/latex": "$86.41527642726142\\ \\frac{\\mathrm{meter}}{\\mathrm{second}}$",
+ "text/html": [
+ "86.41527642726142 meter/second"
+ ],
+ "text/plain": [
+ "86.41527642726142 meter/second"
+ ]
+ },
+ "metadata": {
+ "tags": []
+ },
+ "execution_count": 14
+ }
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {
+ "id": "9qldAeyXoSkJ"
+ },
+ "source": [
+ "We can convert from one set of units to another like this:"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "metadata": {
+ "id": "i272L4JHoSkJ"
+ },
+ "source": [
+ "mile = UNITS.mile\n",
+ "hour = UNITS.hour"
+ ],
+ "execution_count": 15,
+ "outputs": []
+ },
+ {
+ "cell_type": "code",
+ "metadata": {
+ "colab": {
+ "base_uri": "https://localhost:8080/",
+ "height": 34
+ },
+ "id": "Vnk8emljoSkK",
+ "outputId": "9512a719-e2da-4b0c-e942-5dc88d7e246f"
+ },
+ "source": [
+ "v.to(mile/hour)"
+ ],
+ "execution_count": 16,
+ "outputs": [
+ {
+ "output_type": "execute_result",
+ "data": {
+ "text/latex": "$193.30546802805432\\ \\frac{\\mathrm{mile}}{\\mathrm{hour}}$",
+ "text/html": [
+ "193.30546802805432 mile/hour"
+ ],
+ "text/plain": [
+ "193.30546802805432 mile/hour"
+ ]
+ },
+ "metadata": {
+ "tags": []
+ },
+ "execution_count": 16
+ }
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {
+ "id": "bpgthZdZoSkK"
+ },
+ "source": [
+ "**Exercise:** Suppose you bring a 10 foot pole to the top of the Empire State Building and use it to drop the penny from `h` plus 10 feet.\n",
+ "\n",
+ "Define a variable named `foot` that contains the unit `foot` provided by `UNITS`. Define a variable named `pole_height` and give it the value 10 feet.\n",
+ "\n",
+ "What happens if you add `h`, which is in units of meters, to `pole_height`, which is in units of feet? What happens if you write the addition the other way around?"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "metadata": {
+ "colab": {
+ "base_uri": "https://localhost:8080/",
+ "height": 34
+ },
+ "id": "T7V9GvpEoSkL",
+ "outputId": "483ce0d6-cfa8-4420-c730-a67eb5c42ba6"
+ },
+ "source": [
+ "# Solution goes here\n",
+ "foot=UNITS.foot\n",
+ "pole_height=10*foot\n",
+ "h+pole_height"
+ ],
+ "execution_count": 17,
+ "outputs": [
+ {
+ "output_type": "execute_result",
+ "data": {
+ "text/latex": "$384.048\\ \\mathrm{meter}$",
+ "text/html": [
+ "384.048 meter"
+ ],
+ "text/plain": [
+ "384.048 meter"
+ ]
+ },
+ "metadata": {
+ "tags": []
+ },
+ "execution_count": 17
+ }
+ ]
+ },
+ {
+ "cell_type": "code",
+ "metadata": {
+ "colab": {
+ "base_uri": "https://localhost:8080/",
+ "height": 34
+ },
+ "id": "YToiA3_eoSkL",
+ "outputId": "24e23121-ee50-4cee-8e57-c1accba46ae0"
+ },
+ "source": [
+ "# Solution goes here\n",
+ "\n",
+ "pole_height+h"
+ ],
+ "execution_count": 18,
+ "outputs": [
+ {
+ "output_type": "execute_result",
+ "data": {
+ "text/latex": "$1260.0\\ \\mathrm{foot}$",
+ "text/html": [
+ "1260.0 foot"
+ ],
+ "text/plain": [
+ "1260.0 foot"
+ ]
+ },
+ "metadata": {
+ "tags": []
+ },
+ "execution_count": 18
+ }
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {
+ "id": "unUAXwgDoSkL"
+ },
+ "source": [
+ "**Exercise:** In reality, air resistance limits the velocity of the penny. At about 18 m/s, the force of air resistance equals the force of gravity and the penny stops accelerating.\n",
+ "\n",
+ "As a simplification, let's assume that the acceleration of the penny is `a` until the penny reaches 18 m/s, and then 0 afterwards. What is the total time for the penny to fall 381 m?\n",
+ "\n",
+ "You can break this question into three parts:\n",
+ "\n",
+ "1. How long until the penny reaches 18 m/s with constant acceleration `a`.\n",
+ "2. How far would the penny fall during that time?\n",
+ "3. How long to fall the remaining distance with constant velocity 18 m/s?\n",
+ "\n",
+ "Suggestion: Assign each intermediate result to a variable with a meaningful name. And assign units to all quantities!"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "metadata": {
+ "colab": {
+ "base_uri": "https://localhost:8080/",
+ "height": 34
+ },
+ "id": "SFILc8NdoSkL",
+ "outputId": "7dab4810-ac11-46ca-ec2f-872853851e0e"
+ },
+ "source": [
+ "# Solution goes here\n",
+ "v18= 18*meter / second\n",
+ "time= v18/a\n",
+ "time\n"
+ ],
+ "execution_count": 19,
+ "outputs": [
+ {
+ "output_type": "execute_result",
+ "data": {
+ "text/latex": "$1.8367346938775508\\ \\mathrm{second}$",
+ "text/html": [
+ "1.8367346938775508 second"
+ ],
+ "text/plain": [
+ "1.8367346938775508 second"
+ ]
+ },
+ "metadata": {
+ "tags": []
+ },
+ "execution_count": 19
+ }
+ ]
+ },
+ {
+ "cell_type": "code",
+ "metadata": {
+ "colab": {
+ "base_uri": "https://localhost:8080/",
+ "height": 34
+ },
+ "id": "8ZtmWNtpoSkM",
+ "outputId": "ccb50e3a-107f-40e2-abc7-77f86a085df8"
+ },
+ "source": [
+ "# Solution goes here\n",
+ "h18 = a * (time**2) / 2\n",
+ "h18"
+ ],
+ "execution_count": 20,
+ "outputs": [
+ {
+ "output_type": "execute_result",
+ "data": {
+ "text/latex": "$16.530612244897956\\ \\mathrm{meter}$",
+ "text/html": [
+ "16.530612244897956 meter"
+ ],
+ "text/plain": [
+ "16.530612244897956 meter"
+ ]
+ },
+ "metadata": {
+ "tags": []
+ },
+ "execution_count": 20
+ }
+ ]
+ },
+ {
+ "cell_type": "code",
+ "metadata": {
+ "colab": {
+ "base_uri": "https://localhost:8080/",
+ "height": 34
+ },
+ "id": "Auup6eSIoSkM",
+ "outputId": "233d9c68-87c9-4dcc-a11c-f9aec51bd186"
+ },
+ "source": [
+ "# Solution goes here\n",
+ "Time_remain = (381 * meter - h18) / v18\n",
+ "Time_remain"
+ ],
+ "execution_count": 21,
+ "outputs": [
+ {
+ "output_type": "execute_result",
+ "data": {
+ "text/latex": "$20.24829931972789\\ \\mathrm{second}$",
+ "text/html": [
+ "20.24829931972789 second"
+ ],
+ "text/plain": [
+ "20.24829931972789 second"
+ ]
+ },
+ "metadata": {
+ "tags": []
+ },
+ "execution_count": 21
+ }
+ ]
+ },
+ {
+ "cell_type": "code",
+ "metadata": {
+ "colab": {
+ "base_uri": "https://localhost:8080/",
+ "height": 34
+ },
+ "id": "122rmGw8oSkM",
+ "outputId": "88abb120-f204-4e36-b29c-2d399ce84ae4"
+ },
+ "source": [
+ "# Solution goes here\n",
+ "Total_time = time + Time_remain\n",
+ "Total_time"
+ ],
+ "execution_count": 22,
+ "outputs": [
+ {
+ "output_type": "execute_result",
+ "data": {
+ "text/latex": "$22.085034013605444\\ \\mathrm{second}$",
+ "text/html": [
+ "22.085034013605444 second"
+ ],
+ "text/plain": [
+ "22.085034013605444 second"
+ ]
+ },
+ "metadata": {
+ "tags": []
+ },
+ "execution_count": 22
+ }
+ ]
+ },
+ {
+ "cell_type": "code",
+ "metadata": {
+ "id": "QhQ5bC-EoSkN"
+ },
+ "source": [
+ "# Solution goes here"
+ ],
+ "execution_count": 23,
+ "outputs": []
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {
+ "id": "V_oPwSs8oSkN"
+ },
+ "source": [
+ "### Restart and run all\n",
+ "\n",
+ "When you change the contents of a cell, you have to run it again for those changes to have an effect. If you forget to do that, the results can be confusing, because the code you are looking at is not the code you ran.\n",
+ "\n",
+ "If you ever lose track of which cells have run, and in what order, you should go to the Kernel menu and select \"Restart & Run All\". Restarting the kernel means that all of your variables get deleted, and running all the cells means all of your code will run again, in the right order.\n",
+ "\n",
+ "**Exercise:** Select \"Restart & Run All\" now and confirm that it does what you want."
+ ]
+ },
+ {
+ "cell_type": "code",
+ "metadata": {
+ "id": "B_KVXjOzoSkO"
+ },
+ "source": [
+ ""
+ ],
+ "execution_count": 23,
+ "outputs": []
+ }
+ ]
+}
\ No newline at end of file
diff --git a/colab/chap02.ipynb b/colab/chap02.ipynb
index 52250e76b..dad0f02e1 100644
--- a/colab/chap02.ipynb
+++ b/colab/chap02.ipynb
@@ -1,893 +1,2209 @@
{
- "cells": [
- {
- "cell_type": "markdown",
- "metadata": {},
- "source": [
- "# Chapter 2"
- ]
- },
- {
- "cell_type": "markdown",
- "metadata": {
- "tags": []
- },
- "source": [
- "*Modeling and Simulation in Python*\n",
- "\n",
- "Copyright 2021 Allen Downey\n",
- "\n",
- "License: [Creative Commons Attribution-NonCommercial-ShareAlike 4.0 International](https://creativecommons.org/licenses/by-nc-sa/4.0/)"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": 1,
- "metadata": {
- "tags": []
- },
- "outputs": [],
- "source": [
- "# check if the libraries we need are installed\n",
- "\n",
- "try:\n",
- " import pint\n",
- "except ImportError:\n",
- " !pip install pint\n",
- " import pint\n",
- " \n",
- "try:\n",
- " from modsim import *\n",
- "except ImportError:\n",
- " !pip install modsimpy\n",
- " from modsim import *"
- ]
- },
- {
- "cell_type": "markdown",
- "metadata": {},
- "source": [
- "## Modeling a bikeshare system"
- ]
- },
- {
- "cell_type": "markdown",
- "metadata": {},
- "source": [
- "We'll start with a `State` object that represents the number of bikes at each station.\n",
- "\n",
- "When you display a `State` object, it lists the state variables and their values:"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": 2,
- "metadata": {},
- "outputs": [],
- "source": [
- "bikeshare = State(olin=10, wellesley=2)"
- ]
- },
- {
- "cell_type": "markdown",
- "metadata": {},
- "source": [
- "We can access the state variables using dot notation."
- ]
- },
- {
- "cell_type": "code",
- "execution_count": 3,
- "metadata": {},
- "outputs": [],
- "source": [
- "bikeshare.olin"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": 4,
- "metadata": {
- "scrolled": true
- },
- "outputs": [],
- "source": [
- "bikeshare.wellesley"
- ]
- },
- {
- "cell_type": "markdown",
- "metadata": {},
- "source": [
- "**Exercise:** What happens if you spell the name of a state variable wrong? Edit the previous cell, change the spelling of `wellesley`, and run the cell again.\n",
- "\n",
- "The error message uses the word \"attribute\", which is another name for what we are calling a state variable. "
- ]
- },
- {
- "cell_type": "markdown",
- "metadata": {},
- "source": [
- "**Exercise:** Add a third attribute called `babson` with initial value 0, and display the state of `bikeshare` again."
- ]
- },
- {
- "cell_type": "markdown",
- "metadata": {},
- "source": [
- "## Updating\n",
- "\n",
- "We can use the update operators `+=` and `-=` to change state variables."
- ]
- },
- {
- "cell_type": "code",
- "execution_count": 5,
- "metadata": {},
- "outputs": [],
- "source": [
- "bikeshare.olin -= 1"
- ]
- },
- {
- "cell_type": "markdown",
- "metadata": {},
- "source": [
- "If we display `bikeshare`, we should see the change."
- ]
- },
- {
- "cell_type": "code",
- "execution_count": 6,
- "metadata": {},
- "outputs": [],
- "source": [
- "bikeshare"
- ]
- },
- {
- "cell_type": "markdown",
- "metadata": {},
- "source": [
- "Of course, if we subtract a bike from `olin`, we should add it to `wellesley`."
- ]
- },
- {
- "cell_type": "code",
- "execution_count": 7,
- "metadata": {},
- "outputs": [],
- "source": [
- "bikeshare.wellesley += 1\n",
- "bikeshare"
- ]
- },
- {
- "cell_type": "markdown",
- "metadata": {},
- "source": [
- "## Functions\n",
- "\n",
- "We can take the code we've written so far and encapsulate it in a function."
- ]
- },
- {
- "cell_type": "code",
- "execution_count": 8,
- "metadata": {},
- "outputs": [],
- "source": [
- "def bike_to_wellesley():\n",
- " bikeshare.olin -= 1\n",
- " bikeshare.wellesley += 1"
- ]
- },
- {
- "cell_type": "markdown",
- "metadata": {},
- "source": [
- "When you define a function, it doesn't run the statements inside the function, yet. When you call the function, it runs the statements inside."
- ]
- },
- {
- "cell_type": "code",
- "execution_count": 9,
- "metadata": {},
- "outputs": [],
- "source": [
- "bike_to_wellesley()\n",
- "bikeshare"
- ]
- },
- {
- "cell_type": "markdown",
- "metadata": {},
- "source": [
- "\n",
- "One common error is to omit the parentheses, which has the effect of looking up the function, but not calling it."
- ]
- },
- {
- "cell_type": "code",
- "execution_count": 10,
- "metadata": {},
- "outputs": [],
- "source": [
- "bike_to_wellesley"
- ]
- },
- {
- "cell_type": "markdown",
- "metadata": {},
- "source": [
- "The output indicates that `bike_to_wellesley` is a function defined in a \"namespace\" called `__main__`, but you don't have to understand what that means."
- ]
- },
- {
- "cell_type": "markdown",
- "metadata": {},
- "source": [
- "**Exercise:** Define a function called `bike_to_olin` that moves a bike from Wellesley to Olin. Call the new function and display `bikeshare` to confirm that it works."
- ]
- },
- {
- "cell_type": "code",
- "execution_count": 11,
- "metadata": {},
- "outputs": [],
- "source": [
- "# Solution goes here"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": 12,
- "metadata": {},
- "outputs": [],
- "source": [
- "# Solution goes here"
- ]
- },
- {
- "cell_type": "markdown",
- "metadata": {},
- "source": [
- "## Conditionals"
- ]
- },
- {
- "cell_type": "markdown",
- "metadata": {},
- "source": [
- "`modsim.py` provides `flip`, which takes a probability and returns either `True` or `False`, which are special values defined by Python.\n",
- "\n",
- "The Python function `help` looks up a function and displays its documentation."
- ]
- },
- {
- "cell_type": "code",
- "execution_count": 13,
- "metadata": {},
- "outputs": [],
- "source": [
- "help(flip)"
- ]
- },
- {
- "cell_type": "markdown",
- "metadata": {},
- "source": [
- "In the following example, the probability is 0.7 or 70%. If you run this cell several times, you should get `True` about 70% of the time and `False` about 30%."
- ]
- },
- {
- "cell_type": "code",
- "execution_count": 14,
- "metadata": {},
- "outputs": [],
- "source": [
- "flip(0.7)"
- ]
- },
- {
- "cell_type": "markdown",
- "metadata": {},
- "source": [
- "In the following example, we use `flip` as part of an if statement. If the result from `flip` is `True`, we print `heads`; otherwise we do nothing."
- ]
- },
- {
- "cell_type": "code",
- "execution_count": 15,
- "metadata": {},
- "outputs": [],
- "source": [
- "if flip(0.7):\n",
- " print('heads')"
- ]
- },
- {
- "cell_type": "markdown",
- "metadata": {},
- "source": [
- "With an else clause, we can print heads or tails depending on whether `flip` returns `True` or `False`."
- ]
- },
- {
- "cell_type": "code",
- "execution_count": 16,
- "metadata": {},
- "outputs": [],
- "source": [
- "if flip(0.7):\n",
- " print('heads')\n",
- "else:\n",
- " print('tails')"
- ]
- },
- {
- "cell_type": "markdown",
- "metadata": {},
- "source": [
- "## Step\n",
- "\n",
- "Now let's get back to the bikeshare state. Again let's start with a new `State` object."
- ]
- },
- {
- "cell_type": "code",
- "execution_count": 17,
- "metadata": {},
- "outputs": [],
- "source": [
- "bikeshare = State(olin=10, wellesley=2)"
- ]
- },
- {
- "cell_type": "markdown",
- "metadata": {},
- "source": [
- "Suppose that in any given minute, there is a 50% chance that a student picks up a bike at Olin and rides to Wellesley. We can simulate that like this."
- ]
- },
- {
- "cell_type": "code",
- "execution_count": 18,
- "metadata": {},
- "outputs": [],
- "source": [
- "if flip(0.5):\n",
- " bike_to_wellesley()\n",
- " print('Moving a bike to Wellesley')\n",
- "\n",
- "bikeshare"
- ]
- },
- {
- "cell_type": "markdown",
- "metadata": {},
- "source": [
- "And maybe at the same time, there is also a 40% chance that a student at Wellesley rides to Olin."
- ]
- },
- {
- "cell_type": "code",
- "execution_count": 19,
- "metadata": {},
- "outputs": [],
- "source": [
- "if flip(0.4):\n",
- " bike_to_olin()\n",
- " print('Moving a bike to Olin')\n",
- "\n",
- "bikeshare"
- ]
- },
- {
- "cell_type": "markdown",
- "metadata": {},
- "source": [
- "We can wrap that code in a function called `step` that simulates one time step. In any given minute, a student might ride from Olin to Wellesley, from Wellesley to Olin, or both, or neither, depending on the results of `flip`."
- ]
- },
- {
- "cell_type": "code",
- "execution_count": 20,
- "metadata": {},
- "outputs": [],
- "source": [
- "def step():\n",
- " if flip(0.5):\n",
- " bike_to_wellesley()\n",
- " print('Moving a bike to Wellesley')\n",
- " \n",
- " if flip(0.4):\n",
- " bike_to_olin()\n",
- " print('Moving a bike to Olin')"
- ]
- },
- {
- "cell_type": "markdown",
- "metadata": {},
- "source": [
- "Since this function takes no parameters, we call it like this:"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": 21,
- "metadata": {},
- "outputs": [],
- "source": [
- "step()\n",
- "bikeshare"
- ]
- },
- {
- "cell_type": "markdown",
- "metadata": {},
- "source": [
- "## Parameters\n",
- "\n",
- "As defined in the previous section, `step` is not as useful as it could be, because the probabilities `0.5` and `0.4` are \"hard coded\".\n",
- "\n",
- "It would be better to generalize this function so it takes the probabilities `p1` and `p2` as parameters:"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": 22,
- "metadata": {},
- "outputs": [],
- "source": [
- "def step(p1, p2):\n",
- " if flip(p1):\n",
- " bike_to_wellesley()\n",
- " print('Moving a bike to Wellesley')\n",
- " \n",
- " if flip(p2):\n",
- " bike_to_olin()\n",
- " print('Moving a bike to Olin')"
- ]
- },
- {
- "cell_type": "markdown",
- "metadata": {},
- "source": [
- "Now we can call it like this:"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": 23,
- "metadata": {},
- "outputs": [],
- "source": [
- "step(0.5, 0.4)\n",
- "bikeshare"
- ]
- },
- {
- "cell_type": "markdown",
- "metadata": {},
- "source": [
- "**Exercise:** At the beginning of `step`, add a print statement that displays the values of `p1` and `p2`. Call it again with values `0.3`, and `0.2`, and confirm that the values of the parameters are what you expect. "
- ]
- },
- {
- "cell_type": "code",
- "execution_count": 24,
- "metadata": {},
- "outputs": [],
- "source": [
- "# Solution goes here"
- ]
- },
- {
- "cell_type": "markdown",
- "metadata": {},
- "source": [
- "## For loop"
- ]
- },
- {
- "cell_type": "markdown",
- "metadata": {},
- "source": [
- "Before we go on, I'll redefine `step` without the print statements."
- ]
- },
- {
- "cell_type": "code",
- "execution_count": 25,
- "metadata": {},
- "outputs": [],
- "source": [
- "def step(p1, p2):\n",
- " if flip(p1):\n",
- " bike_to_wellesley()\n",
- " \n",
- " if flip(p2):\n",
- " bike_to_olin()"
- ]
- },
- {
- "cell_type": "markdown",
- "metadata": {},
- "source": [
- "And let's start again with a new `State` object:"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": 26,
- "metadata": {},
- "outputs": [],
- "source": [
- "bikeshare = State(olin=10, wellesley=2)"
- ]
- },
- {
- "cell_type": "markdown",
- "metadata": {},
- "source": [
- "We can use a `for` loop to move 4 bikes from Olin to Wellesley."
- ]
- },
- {
- "cell_type": "code",
- "execution_count": 27,
- "metadata": {},
- "outputs": [],
- "source": [
- "for i in range(4):\n",
- " bike_to_wellesley()\n",
- " \n",
- "bikeshare"
- ]
- },
- {
- "cell_type": "markdown",
- "metadata": {},
- "source": [
- "Or we can simulate 4 random time steps."
- ]
- },
- {
- "cell_type": "code",
- "execution_count": 28,
- "metadata": {},
- "outputs": [],
- "source": [
- "for i in range(4):\n",
- " step(0.3, 0.2)\n",
- " \n",
- "bikeshare"
- ]
- },
- {
- "cell_type": "markdown",
- "metadata": {},
- "source": [
- "If each step corresponds to a minute, we can simulate an entire hour like this."
- ]
- },
- {
- "cell_type": "code",
- "execution_count": 29,
- "metadata": {},
- "outputs": [],
- "source": [
- "for i in range(60):\n",
- " step(0.3, 0.2)\n",
- "\n",
- "bikeshare"
- ]
- },
- {
- "cell_type": "markdown",
- "metadata": {},
- "source": [
- "After 60 minutes, you might see that the number of bike at Olin is negative. We'll fix that problem in the next notebook.\n",
- "\n",
- "But first, we want to plot the results."
- ]
- },
- {
- "cell_type": "markdown",
- "metadata": {},
- "source": [
- "## TimeSeries\n",
- "\n",
- "`modsim.py` provides an object called a `TimeSeries` that can contain a sequence of values changing over time.\n",
- "\n",
- "We can create a new, empty `TimeSeries` like this:"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": 30,
- "metadata": {},
- "outputs": [],
- "source": [
- "results = TimeSeries()"
- ]
- },
- {
- "cell_type": "markdown",
- "metadata": {},
- "source": [
- "And we can add a value to the `TimeSeries` like this:"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": 31,
- "metadata": {},
- "outputs": [],
- "source": [
- "results[0] = bikeshare.olin\n",
- "results"
- ]
- },
- {
- "cell_type": "markdown",
- "metadata": {},
- "source": [
- "The `0` in brackets is an `index` that indicates that this value is associated with time step 0.\n",
- "\n",
- "Now we'll use a for loop to save the results of the simulation. I'll start one more time with a new `State` object."
- ]
- },
- {
- "cell_type": "code",
- "execution_count": 32,
- "metadata": {},
- "outputs": [],
- "source": [
- "bikeshare = State(olin=10, wellesley=2)"
- ]
- },
- {
- "cell_type": "markdown",
- "metadata": {},
- "source": [
- "Here's a for loop that runs 10 steps and stores the results."
- ]
- },
- {
- "cell_type": "code",
- "execution_count": 33,
- "metadata": {},
- "outputs": [],
- "source": [
- "for i in range(10):\n",
- " step(0.3, 0.2)\n",
- " results[i] = bikeshare.olin"
- ]
- },
- {
- "cell_type": "markdown",
- "metadata": {},
- "source": [
- "Now we can display the results."
- ]
- },
- {
- "cell_type": "code",
- "execution_count": 34,
- "metadata": {},
- "outputs": [],
- "source": [
- "results"
- ]
- },
- {
- "cell_type": "markdown",
- "metadata": {},
- "source": [
- "A `TimeSeries` is a specialized version of a Pandas `Series`, so we can use any of the functions provided by `Series`, including several that compute summary statistics:"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": 35,
- "metadata": {},
- "outputs": [],
- "source": [
- "results.mean()"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": 36,
- "metadata": {},
- "outputs": [],
- "source": [
- "results.describe()"
- ]
- },
- {
- "cell_type": "markdown",
- "metadata": {},
- "source": [
- "You can read the documentation of `Series` [here](https://pandas.pydata.org/pandas-docs/stable/generated/pandas.Series.html)."
- ]
- },
- {
- "cell_type": "markdown",
- "metadata": {},
- "source": [
- "## Plotting\n",
- "\n",
- "We can also plot the results like this."
- ]
- },
- {
- "cell_type": "code",
- "execution_count": 38,
- "metadata": {},
- "outputs": [],
- "source": [
- "plot(results, label='Olin')\n",
- "\n",
- "decorate(title='Olin-Wellesley Bikeshare',\n",
- " xlabel='Time step (min)', \n",
- " ylabel='Number of bikes')"
- ]
- },
- {
- "cell_type": "markdown",
- "metadata": {},
- "source": [
- "`decorate`, which is defined in the `modsim` library, adds a title and labels the axes."
- ]
- },
- {
- "cell_type": "markdown",
- "metadata": {},
- "source": [
- "**Exercise:** Wrap the code from this section in a function named `run_simulation` that takes three parameters, named `p1`, `p2`, and `num_steps`.\n",
- "\n",
- "It should:\n",
- "\n",
- "1. Create a `TimeSeries` object to hold the results.\n",
- "2. Use a for loop to run `step` the number of times specified by `num_steps`, passing along the specified values of `p1` and `p2`.\n",
- "3. After each step, it should save the number of bikes at Olin in the `TimeSeries`.\n",
- "4. After the for loop, it should plot the results and\n",
- "5. Decorate the axes.\n",
- "\n",
- "To test your function:\n",
- "\n",
- "1. Create a `State` object with the initial state of the system.\n",
- "2. Call `run_simulation` with appropriate parameters.\n",
- "3. Save the resulting figure.\n",
- "\n",
- "Optional:\n",
- "\n",
- "1. Extend your solution so it creates two `TimeSeries` objects, keeps track of the number of bikes at Olin *and* at Wellesley, and plots both series at the end."
- ]
- },
- {
- "cell_type": "code",
- "execution_count": 41,
- "metadata": {},
- "outputs": [],
- "source": [
- "# Solution goes here"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": 42,
- "metadata": {},
- "outputs": [],
- "source": [
- "# Solution goes here"
- ]
- },
- {
- "cell_type": "markdown",
- "metadata": {},
- "source": [
- "## Opening the hood\n",
- "\n",
- "The functions in `modsim.py` are built on top of several widely-used Python libraries, especially NumPy, SciPy, and Pandas. These libraries are powerful but can be hard to use. The intent of `modsim.py` is to give you the power of these libraries while making it easy to get started.\n",
- "\n",
- "In the future, you might want to use these libraries directly, rather than using `modsim.py`. So we will pause occasionally to open the hood and let you see how `modsim.py` works.\n",
- "\n",
- "You don't need to know anything in these sections, so if you are already feeling overwhelmed, you might want to skip them. But if you are curious, read on."
- ]
- },
- {
- "cell_type": "markdown",
- "metadata": {},
- "source": [
- "### Pandas\n",
- "\n",
- "This chapter introduces two objects, `State` and `TimeSeries`. Both are based on the `Series` object defined by Pandas, which is a library primarily used for data science.\n",
- "\n",
- "You can read the documentation of the `Series` object [here](https://pandas.pydata.org/pandas-docs/stable/generated/pandas.Series.html)\n",
- "\n",
- "The primary differences between `TimeSeries` and `Series` are:\n",
- "\n",
- "1. I made it easier to create a new, empty `Series` while avoiding a [confusing inconsistency](https://pandas.pydata.org/pandas-docs/stable/generated/pandas.Series.html).\n",
- "\n",
- "2. I provide a function so the `Series` looks good when displayed in Jupyter.\n",
- "\n",
- "3. I provide a function called `set` that we'll use later.\n",
- "\n",
- "`State` has all of those capabilities; in addition, it provides an easier way to initialize state variables, and it provides functions called `T` and `dt`, which will help us avoid a confusing error later."
- ]
- },
- {
- "cell_type": "markdown",
- "metadata": {},
- "source": [
- "### Pyplot\n",
- "\n",
- "The `plot` function in `modsim.py` is based on the `plot` function in Pyplot, which is part of Matplotlib. You can read the documentation of `plot` [here](https://matplotlib.org/api/_as_gen/matplotlib.pyplot.plot.html).\n",
- "\n",
- "`decorate` provides a convenient way to call the `pyplot` functions `title`, `xlabel`, and `ylabel`, and `legend`. It also avoids an annoying warning message if you try to make a legend when you don't have any labelled lines."
- ]
- },
- {
- "cell_type": "code",
- "execution_count": 43,
- "metadata": {},
- "outputs": [],
- "source": [
- "help(decorate)"
- ]
- },
- {
- "cell_type": "markdown",
- "metadata": {},
- "source": [
- "### NumPy\n",
- "\n",
- "The `flip` function in `modsim.py` uses NumPy's `random` function to generate a random number between 0 and 1.\n",
- "\n",
- "You can get the source code for `flip` by running the following cell."
- ]
- },
- {
- "cell_type": "code",
- "execution_count": null,
- "metadata": {},
- "outputs": [],
- "source": [
- "source_code(flip)"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": null,
- "metadata": {},
- "outputs": [],
- "source": []
- }
- ],
- "metadata": {
- "celltoolbar": "Tags",
- "kernelspec": {
- "display_name": "Python 3",
- "language": "python",
- "name": "python3"
- },
- "language_info": {
- "codemirror_mode": {
- "name": "ipython",
- "version": 3
- },
- "file_extension": ".py",
- "mimetype": "text/x-python",
- "name": "python",
- "nbconvert_exporter": "python",
- "pygments_lexer": "ipython3",
- "version": "3.7.9"
- }
- },
- "nbformat": 4,
- "nbformat_minor": 2
-}
+ "nbformat": 4,
+ "nbformat_minor": 0,
+ "metadata": {
+ "celltoolbar": "Tags",
+ "kernelspec": {
+ "display_name": "Python 3",
+ "language": "python",
+ "name": "python3"
+ },
+ "language_info": {
+ "codemirror_mode": {
+ "name": "ipython",
+ "version": 3
+ },
+ "file_extension": ".py",
+ "mimetype": "text/x-python",
+ "name": "python",
+ "nbconvert_exporter": "python",
+ "pygments_lexer": "ipython3",
+ "version": "3.7.9"
+ },
+ "colab": {
+ "name": "chap02.ipynb",
+ "provenance": []
+ }
+ },
+ "cells": [
+ {
+ "cell_type": "markdown",
+ "metadata": {
+ "id": "QFAuYhOc0ljq"
+ },
+ "source": [
+ "# Chapter 2"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {
+ "tags": [],
+ "id": "GvoWOfg40ljt"
+ },
+ "source": [
+ "*Modeling and Simulation in Python* Edit by Chun San Yip (7 Jun 2021)\n",
+ "\n",
+ "Copyright 2021 Allen Downey\n",
+ "\n",
+ "License: [Creative Commons Attribution-NonCommercial-ShareAlike 4.0 International](https://creativecommons.org/licenses/by-nc-sa/4.0/)"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "metadata": {
+ "tags": [],
+ "id": "bGn3AD9p0ljy"
+ },
+ "source": [
+ "# check if the libraries we need are installed\n",
+ "\n",
+ "try:\n",
+ " import pint\n",
+ "except ImportError:\n",
+ " !pip install pint\n",
+ " import pint\n",
+ " \n",
+ "try:\n",
+ " from modsim import *\n",
+ "except ImportError:\n",
+ " !pip install modsimpy\n",
+ " from modsim import *"
+ ],
+ "execution_count": 1,
+ "outputs": []
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {
+ "id": "nCTyN4Nd0lj3"
+ },
+ "source": [
+ "## Modeling a bikeshare system"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {
+ "id": "HrH931E90lj6"
+ },
+ "source": [
+ "We'll start with a `State` object that represents the number of bikes at each station.\n",
+ "\n",
+ "When you display a `State` object, it lists the state variables and their values:"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "metadata": {
+ "id": "l1dU_fhm0lj7"
+ },
+ "source": [
+ "bikeshare = State(olin=10, wellesley=2, babson=0)"
+ ],
+ "execution_count": 2,
+ "outputs": []
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {
+ "id": "Xsx63Wr20lj7"
+ },
+ "source": [
+ "We can access the state variables using dot notation."
+ ]
+ },
+ {
+ "cell_type": "code",
+ "metadata": {
+ "colab": {
+ "base_uri": "https://localhost:8080/"
+ },
+ "id": "vu-rx73-0lj8",
+ "outputId": "27f05656-3c85-4160-b0f8-f8e3fcd41d83"
+ },
+ "source": [
+ "bikeshare.olin"
+ ],
+ "execution_count": 3,
+ "outputs": [
+ {
+ "output_type": "execute_result",
+ "data": {
+ "text/plain": [
+ "10"
+ ]
+ },
+ "metadata": {
+ "tags": []
+ },
+ "execution_count": 3
+ }
+ ]
+ },
+ {
+ "cell_type": "code",
+ "metadata": {
+ "scrolled": true,
+ "colab": {
+ "base_uri": "https://localhost:8080/",
+ "height": 143
+ },
+ "id": "-uM8G_N70lj9",
+ "outputId": "aaa1d1d9-9985-4fc8-fef6-807d714ce22c"
+ },
+ "source": [
+ "bikeshare"
+ ],
+ "execution_count": 4,
+ "outputs": [
+ {
+ "output_type": "execute_result",
+ "data": {
+ "text/html": [
+ "
\n",
+ "\n",
+ "
\n",
+ " \n",
+ "
\n",
+ "
\n",
+ "
values
\n",
+ "
\n",
+ " \n",
+ " \n",
+ "
\n",
+ "
olin
\n",
+ "
10
\n",
+ "
\n",
+ "
\n",
+ "
wellesley
\n",
+ "
2
\n",
+ "
\n",
+ "
\n",
+ "
babson
\n",
+ "
0
\n",
+ "
\n",
+ " \n",
+ "
\n",
+ "
"
+ ],
+ "text/plain": [
+ "olin 10\n",
+ "wellesley 2\n",
+ "babson 0\n",
+ "dtype: int64"
+ ]
+ },
+ "metadata": {
+ "tags": []
+ },
+ "execution_count": 4
+ }
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {
+ "id": "qMUJzvoz0lj-"
+ },
+ "source": [
+ "**Exercise:** What happens if you spell the name of a state variable wrong? Edit the previous cell, change the spelling of `wellesley`, and run the cell again.\n",
+ "\n",
+ "The error message uses the word \"attribute\", which is another name for what we are calling a state variable. "
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {
+ "id": "2yf1gSo90lj_"
+ },
+ "source": [
+ "**Exercise:** Add a third attribute called `babson` with initial value 0, and display the state of `bikeshare` again."
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {
+ "id": "D0BzeBhb0lkA"
+ },
+ "source": [
+ "## Updating\n",
+ "\n",
+ "We can use the update operators `+=` and `-=` to change state variables."
+ ]
+ },
+ {
+ "cell_type": "code",
+ "metadata": {
+ "id": "RyGmC3w10lkB"
+ },
+ "source": [
+ "bikeshare.olin -= 1"
+ ],
+ "execution_count": 5,
+ "outputs": []
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {
+ "id": "XuwGLBuw0lkC"
+ },
+ "source": [
+ "If we display `bikeshare`, we should see the change."
+ ]
+ },
+ {
+ "cell_type": "code",
+ "metadata": {
+ "colab": {
+ "base_uri": "https://localhost:8080/",
+ "height": 143
+ },
+ "id": "wtujy6gs0lkC",
+ "outputId": "1c08bf57-545a-4992-efdd-2d88e57b5c96"
+ },
+ "source": [
+ "bikeshare"
+ ],
+ "execution_count": 6,
+ "outputs": [
+ {
+ "output_type": "execute_result",
+ "data": {
+ "text/html": [
+ "
"
+ ]
+ },
+ "metadata": {
+ "tags": [],
+ "needs_background": "light"
+ }
+ }
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {
+ "id": "UpJ4SQn6vHui"
+ },
+ "source": [
+ "**Exercise:** Write a function called `sweep_p2` that runs simulations with `p1=0.5` and a range of values for `p2`. It should store the results in a `SweepSeries` and return the `SweepSeries`.\n"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "metadata": {
+ "id": "JgrQASKmvHuj"
+ },
+ "source": [
+ "p1=0.5\n",
+ "p2_array=linspace(0, 1, 5)\n",
+ "\n",
+ "def sweep_p2(p2_array):\n",
+ " sweep2 = SweepSeries()\n",
+ " for p2 in p2_array:\n",
+ " state = run_simulation(p1, p2, num_steps)\n",
+ " sweep2[p2]=state.wellesley_empty\n",
+ " return sweep2"
+ ],
+ "execution_count": 27,
+ "outputs": []
+ },
+ {
+ "cell_type": "code",
+ "metadata": {
+ "colab": {
+ "base_uri": "https://localhost:8080/",
+ "height": 297
+ },
+ "id": "K8Ke89X5vHuj",
+ "outputId": "3f99ada0-57e6-41bd-8195-1ba36e13944a"
+ },
+ "source": [
+ "plot(sweep_p2(p2_array), label='Wellesley')\n",
+ "\n",
+ "decorate(title='Olin-Wellesley Bikeshare',\n",
+ " xlabel='Arrival rate at Wellesley (p1 in customers/min)', \n",
+ " ylabel='Number of unhappy customers')"
+ ],
+ "execution_count": 28,
+ "outputs": [
+ {
+ "output_type": "display_data",
+ "data": {
+ "image/png": "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\n",
+ "text/plain": [
+ "
"
+ ]
+ },
+ "metadata": {
+ "tags": [],
+ "needs_background": "light"
+ }
+ }
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {
+ "id": "joTaW-bavHuk"
+ },
+ "source": [
+ "## Optional Exercises\n",
+ "\n",
+ "The following two exercises are a little more challenging. If you are comfortable with what you have learned so far, you should give them a try. If you feel like you have your hands full, you might want to skip them for now.\n",
+ "\n",
+ "**Exercise:** Because our simulations are random, the results vary from one run to another, and the results of a parameter sweep tend to be noisy. We can get a clearer picture of the relationship between a parameter and a metric by running multiple simulations with the same parameter and taking the average of the results.\n",
+ "\n",
+ "Write a function called `run_multiple_simulations` that takes as parameters `p1`, `p2`, `num_steps`, and `num_runs`.\n",
+ "\n",
+ "`num_runs` specifies how many times it should call `run_simulation`.\n",
+ "\n",
+ "After each run, it should store the total number of unhappy customers (at Olin or Wellesley) in a `TimeSeries`. At the end, it should return the `TimeSeries`.\n",
+ "\n",
+ "Test your function with parameters\n",
+ "\n",
+ "```\n",
+ "p1 = 0.3\n",
+ "p2 = 0.3\n",
+ "num_steps = 60\n",
+ "num_runs = 10\n",
+ "```\n",
+ "\n",
+ "Display the resulting `TimeSeries` and use the `mean` function provided by the `TimeSeries` object to compute the average number of unhappy customers (see Section 2.7)."
+ ]
+ },
+ {
+ "cell_type": "code",
+ "metadata": {
+ "id": "hsaYA6ZuvHuk"
+ },
+ "source": [
+ "def run_multiple_simulations(p1, p2, num_steps, num_runs):\n",
+ " results = TimeSeries() \n",
+ " for i in range(num_runs):\n",
+ " state = run_simulation(p1,p2,num_steps)\n",
+ " #print(state)\n",
+ " results[i] = state.wellesley_empty\n",
+ "\n",
+ " return results"
+ ],
+ "execution_count": 55,
+ "outputs": []
+ },
+ {
+ "cell_type": "code",
+ "metadata": {
+ "colab": {
+ "base_uri": "https://localhost:8080/",
+ "height": 315
+ },
+ "id": "l7_4Pc16vHuk",
+ "outputId": "9d4c5197-d55c-4de5-d63a-414a3ab5d8db"
+ },
+ "source": [
+ "results1=run_multiple_simulations(0.3,0.3,60,10)\n",
+ "plot(results1, label='wellesley')\n",
+ "\n",
+ "decorate(title='Olin-Wellesley Bikeshare',\n",
+ " xlabel='Time', \n",
+ " ylabel='Number of unhappy customers')\n",
+ "\n",
+ "results1.mean()"
+ ],
+ "execution_count": 56,
+ "outputs": [
+ {
+ "output_type": "execute_result",
+ "data": {
+ "text/plain": [
+ "2.9"
+ ]
+ },
+ "metadata": {
+ "tags": []
+ },
+ "execution_count": 56
+ },
+ {
+ "output_type": "display_data",
+ "data": {
+ "image/png": "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AD/99BPjxo1j69atbNiwgUceeYQOHToQERHBXXfdxYEDB9i4cWOj9/nss89IS0vjmmuuISIigsTERO68804+/fRT7HY74eHhVFRUsGPHDsrLy+nQoQPDhg2r81rvvvsuZ511Fueeey5hYWF07dqVGTNm1BRkjBo1ii5duvDFF8YyrYWFhSxevJipU6d66F0zWGpBKaUuBd7EmKBbyS8XjHUC8z0alRABwtW916dbBwAGpycBsHVnIVXVDsLDLH8HFC1gtTXjK2PHjmXZsmUMHDiQrl27ctZZZ/HAAw9QWFjI8uXLueuuu9i9ezdVVVVMmDDhF6+12+3k5eU1eo9du3aRmZnJiBEjao45nU5sNhv5+fmMGjWKe+65h3nz5nH33XczcOBAbrnlFsaMGVPntVatWsW3335bc8zhcOB0nvjonzp1Kh988AGXX345n3zyCf3792fgwIHNeXvqZbWL768YSWiW23bvQrR5WblGCyrdTFAJcVH0SI1jT14J2/ccYVBaki/DE35i3LhxzJ8/n379+jFu3DjCw8MZOXIk//rXv8jNzWXMmDFs376dqKgoVq5cSViY5dGXGikpKYwaNYr58+tvL1x22WVcdtllVFZW8s4773DTTTexcuVKoqOjT7rWxRdfzKOPPlrvtS6++GKeffZZtm7dygcffMANN9zQ5JgbY/XrXQrwgiQnIX7JVQzhSlAAGX2SAcjcIVMEhSEjI4OQkBDeffddxo8fDxhJa+7cuQwcOJAOHTowfPhw0tLSePjhhykoKACgqKiIr7/+mrKyskbvcemll7J582bee+89ysrKcDqdHDhwgMWLFwOQmZnJmjVrKC8vJzw8vGbsKCTk5DRwxRVXsGjRIr7++msqKyux2+3s3r2bH374oeY5cXFxnH/++TzwwAPk5+dz3nnntfh9qs1qgloIjPf43YUIYMfLq9ifX0pYqI2eneNqjmf0NROUTNgVptDQUEaPHk1VVVVNF9y4ceMoKSlh3LhxNc95/fXXiYyM5Ne//jXDhg3joosu4ptvvsFma3yV/C5duvDee+/x008/MWXKFEaMGMG0adPQWgNw7NgxnnzyScaMGcOIESNYsGABL7/8MpGRkSddKyMjg9dee40FCxYwceJERo8eze23387+/b/cm3bq1Kls2bKFCy+8kJiYmJOu01I29z7F+iil2gPvATuA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\n",
+ "text/plain": [
+ "
"
+ ]
+ },
+ "metadata": {
+ "tags": [],
+ "needs_background": "light"
+ }
+ }
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {
+ "id": "Hoxo_PJIvHuk"
+ },
+ "source": [
+ "**Exercise:** Continuting the previous exercise, use `run_multiple_simulations` to run simulations with a range of values for `p1` and\n",
+ "\n",
+ "```\n",
+ "p2 = 0.3\n",
+ "num_steps = 60\n",
+ "num_runs = 20\n",
+ "```\n",
+ "\n",
+ "Store the results in a `SweepSeries`, then plot the average number of unhappy customers as a function of `p1`. Label the axes.\n",
+ "\n",
+ "What value of `p1` minimizes the average number of unhappy customers?"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "metadata": {
+ "scrolled": true,
+ "id": "xBpQ5fzkvHuk"
+ },
+ "source": [
+ "def run_multiple_simulations(p1_array, p2, num_steps, num_runs):\n",
+ " unhappy = TimeSeries()\n",
+ " results2 = SweepSeries() \n",
+ " for p1 in p1_array:\n",
+ " for i in range(num_runs):\n",
+ " state = run_simulation(p1,p2,num_steps)\n",
+ " unhappy[i] = state.wellesley_empty\n",
+ " #print(state, unhappy[i])\n",
+ " results2[p1]=unhappy.mean()\n",
+ " print('result', results2[p1])\n",
+ "\n",
+ " return results2"
+ ],
+ "execution_count": 69,
+ "outputs": []
+ },
+ {
+ "cell_type": "code",
+ "metadata": {
+ "colab": {
+ "base_uri": "https://localhost:8080/",
+ "height": 513
+ },
+ "id": "7WOIEqsIvHuk",
+ "outputId": "610fe5ee-2697-47e7-885f-4d15d81eb2ea"
+ },
+ "source": [
+ "p1_array = linspace(0, 1, 11)\n",
+ "\n",
+ "plot(run_multiple_simulations(p1_array,0.3,60,20), label='olin')\n",
+ "\n",
+ "decorate(title='Olin-Wellesley Bikeshare',\n",
+ " xlabel='Time', \n",
+ " ylabel='Average Number of unhappy customers')"
+ ],
+ "execution_count": 70,
+ "outputs": [
+ {
+ "output_type": "stream",
+ "text": [
+ "result 16.25\n",
+ "result 9.15\n",
+ "result 6.8\n",
+ "result 2.15\n",
+ "result 0.6\n",
+ "result 0.0\n",
+ "result 0.0\n",
+ "result 0.05\n",
+ "result 0.0\n",
+ "result 0.0\n",
+ "result 0.0\n"
+ ],
+ "name": "stdout"
+ },
+ {
+ "output_type": "display_data",
+ "data": {
+ "image/png": "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\n",
+ "text/plain": [
+ "
"
+ ]
+ },
+ "metadata": {
+ "tags": [],
+ "needs_background": "light"
+ }
+ }
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {
+ "id": "uV_RE5D6oXvi"
+ },
+ "source": [
+ "p1>0.5 has minimum number of unhappy customers"
+ ]
+ }
+ ]
+}
\ No newline at end of file
diff --git a/colab/chap05.ipynb b/colab/chap05.ipynb
index 2dca482e3..a7cb59df0 100644
--- a/colab/chap05.ipynb
+++ b/colab/chap05.ipynb
@@ -1,617 +1,1318 @@
{
- "cells": [
- {
- "cell_type": "markdown",
- "metadata": {},
- "source": [
- "# Chapter 5"
- ]
+ "nbformat": 4,
+ "nbformat_minor": 0,
+ "metadata": {
+ "kernelspec": {
+ "display_name": "Python 3",
+ "language": "python",
+ "name": "python3"
+ },
+ "language_info": {
+ "codemirror_mode": {
+ "name": "ipython",
+ "version": 3
+ },
+ "file_extension": ".py",
+ "mimetype": "text/x-python",
+ "name": "python",
+ "nbconvert_exporter": "python",
+ "pygments_lexer": "ipython3",
+ "version": "3.7.9"
+ },
+ "colab": {
+ "name": "chap05.ipynb",
+ "provenance": []
+ }
},
- {
- "cell_type": "markdown",
- "metadata": {
- "tags": []
- },
- "source": [
- "*Modeling and Simulation in Python*\n",
- "\n",
- "Copyright 2021 Allen Downey\n",
- "\n",
- "License: [Creative Commons Attribution-NonCommercial-ShareAlike 4.0 International](https://creativecommons.org/licenses/by-nc-sa/4.0/)"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": 1,
- "metadata": {
- "tags": []
- },
- "outputs": [],
- "source": [
- "# check if the libraries we need are installed\n",
- "\n",
- "try:\n",
- " import pint\n",
- "except ImportError:\n",
- " !pip install pint\n",
- " import pint\n",
- " \n",
- "try:\n",
- " from modsim import *\n",
- "except ImportError:\n",
- " !pip install modsimpy\n",
- " from modsim import *"
- ]
- },
- {
- "cell_type": "markdown",
- "metadata": {},
- "source": [
- "## Reading data\n",
- "\n",
- "Pandas is a library that provides tools for reading and processing data. `read_html` reads a web page from a file or the Internet and creates one `DataFrame` for each table on the page."
- ]
- },
- {
- "cell_type": "code",
- "execution_count": 2,
- "metadata": {},
- "outputs": [],
- "source": [
- "from pandas import read_html"
- ]
- },
- {
- "cell_type": "markdown",
- "metadata": {},
- "source": [
- "The following cell downloads a copy of https://en.wikipedia.org/wiki/World_population_estimates"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": 4,
- "metadata": {},
- "outputs": [],
- "source": [
- "import os\n",
- "\n",
- "filename = 'World_population_estimates.html'\n",
- "\n",
- "if not os.path.exists(filename):\n",
- " !wget https://raw.githubusercontent.com/AllenDowney/ModSimPy/master/data/World_population_estimates.html"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": 5,
- "metadata": {},
- "outputs": [],
- "source": [
- "tables = read_html(filename, header=0, index_col=0, decimal='M')\n",
- "len(tables)"
- ]
- },
- {
- "cell_type": "markdown",
- "metadata": {},
- "source": [
- "The arguments of `read_html` specify the file to read and how to interpret the tables in the file. The result, `tables`, is a sequence of `DataFrame` objects; `len(tables)` reports the length of the sequence.\n",
- "\n",
- "We can select the `DataFrame` we want using the bracket operator. The tables are numbered from 0, so `tables[2]` is actually the third table on the page.\n",
- "\n",
- "`head` selects the header and the first five rows."
- ]
- },
- {
- "cell_type": "code",
- "execution_count": 6,
- "metadata": {
- "scrolled": true
- },
- "outputs": [],
- "source": [
- "table2 = tables[2]\n",
- "table2.head()"
- ]
- },
- {
- "cell_type": "markdown",
- "metadata": {},
- "source": [
- "`tail` selects the last five rows."
- ]
- },
- {
- "cell_type": "code",
- "execution_count": 7,
- "metadata": {},
- "outputs": [],
- "source": [
- "table2.tail()"
- ]
- },
- {
- "cell_type": "markdown",
- "metadata": {},
- "source": [
- "Long column names are awkard to work with, but we can replace them with abbreviated names."
- ]
- },
- {
- "cell_type": "code",
- "execution_count": 8,
- "metadata": {},
- "outputs": [],
- "source": [
- "table2.columns = ['census', 'prb', 'un', 'maddison', \n",
- " 'hyde', 'tanton', 'biraben', 'mj', \n",
- " 'thomlinson', 'durand', 'clark']"
- ]
- },
- {
- "cell_type": "markdown",
- "metadata": {},
- "source": [
- "Here's what the DataFrame looks like now. "
- ]
- },
- {
- "cell_type": "code",
- "execution_count": 9,
- "metadata": {},
- "outputs": [],
- "source": [
- "table2.head()"
- ]
- },
- {
- "cell_type": "markdown",
- "metadata": {},
- "source": [
- "The first column, which is labeled `Year`, is special. It is the **index** for this `DataFrame`, which means it contains the labels for the rows.\n",
- "\n",
- "Some of the values use scientific notation; for example, `2.544000e+09` is shorthand for $2.544 \\cdot 10^9$ or 2.544 billion.\n",
- "\n",
- "`NaN` is a special value that indicates missing data."
- ]
- },
- {
- "cell_type": "markdown",
- "metadata": {},
- "source": [
- "### Series\n",
- "\n",
- "We can use dot notation to select a column from a `DataFrame`. The result is a `Series`, which is like a `DataFrame` with a single column."
- ]
- },
- {
- "cell_type": "code",
- "execution_count": 10,
- "metadata": {},
- "outputs": [],
- "source": [
- "census = table2.census\n",
- "census.head()"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": 11,
- "metadata": {},
- "outputs": [],
- "source": [
- "census.tail()"
- ]
- },
- {
- "cell_type": "markdown",
- "metadata": {},
- "source": [
- "Like a `DataFrame`, a `Series` contains an index, which labels the rows.\n",
- "\n",
- "`1e9` is scientific notation for $1 \\cdot 10^9$ or 1 billion."
- ]
- },
- {
- "cell_type": "markdown",
- "metadata": {},
- "source": [
- "From here on, we will work in units of billions."
- ]
- },
- {
- "cell_type": "code",
- "execution_count": 12,
- "metadata": {},
- "outputs": [],
- "source": [
- "un = table2.un / 1e9\n",
- "un.head()"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": 13,
- "metadata": {},
- "outputs": [],
- "source": [
- "census = table2.census / 1e9\n",
- "census.head()"
- ]
- },
- {
- "cell_type": "markdown",
- "metadata": {},
- "source": [
- "Here's what these estimates look like."
- ]
- },
- {
- "cell_type": "code",
- "execution_count": 14,
- "metadata": {
- "scrolled": false
- },
- "outputs": [],
- "source": [
- "plot(census, ':', label='US Census')\n",
- "plot(un, '--', label='UN DESA')\n",
- " \n",
- "decorate(xlabel='Year',\n",
- " ylabel='World population (billion)')"
- ]
- },
- {
- "cell_type": "markdown",
- "metadata": {},
- "source": [
- "The following expression computes the elementwise differences between the two series, then divides through by the UN value to produce [relative errors](https://en.wikipedia.org/wiki/Approximation_error), then finds the largest element.\n",
- "\n",
- "So the largest relative error between the estimates is about 1.3%."
- ]
- },
- {
- "cell_type": "code",
- "execution_count": 15,
- "metadata": {},
- "outputs": [],
- "source": [
- "max(abs(census - un) / un) * 100"
- ]
- },
- {
- "cell_type": "markdown",
- "metadata": {},
- "source": [
- "**Exercise:** Break down that expression into smaller steps and display the intermediate results, to make sure you understand how it works.\n",
- "\n",
- "1. Compute the elementwise differences, `census - un`\n",
- "2. Compute the absolute differences, `abs(census - un)`\n",
- "3. Compute the relative differences, `abs(census - un) / un`\n",
- "4. Compute the percent differences, `abs(census - un) / un * 100`\n"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": 16,
- "metadata": {
- "scrolled": true
- },
- "outputs": [],
- "source": [
- "# Solution goes here"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": 17,
- "metadata": {
- "scrolled": true
- },
- "outputs": [],
- "source": [
- "# Solution goes here"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": 18,
- "metadata": {
- "scrolled": true
- },
- "outputs": [],
- "source": [
- "# Solution goes here"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": 19,
- "metadata": {},
- "outputs": [],
- "source": [
- "# Solution goes here"
- ]
- },
- {
- "cell_type": "markdown",
- "metadata": {},
- "source": [
- "`max` and `abs` are built-in functions provided by Python, but NumPy also provides version that are a little more general. When you import `modsim`, you get the NumPy versions of these functions."
- ]
- },
- {
- "cell_type": "markdown",
- "metadata": {},
- "source": [
- "### Constant growth"
- ]
- },
- {
- "cell_type": "markdown",
- "metadata": {},
- "source": [
- "We can select a value from a `Series` using bracket notation. Here's the first element:"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": 20,
- "metadata": {},
- "outputs": [],
- "source": [
- "census[1950]"
- ]
- },
- {
- "cell_type": "markdown",
- "metadata": {},
- "source": [
- "And the last value."
- ]
- },
- {
- "cell_type": "code",
- "execution_count": 21,
- "metadata": {},
- "outputs": [],
- "source": [
- "census[2016]"
- ]
- },
- {
- "cell_type": "markdown",
- "metadata": {},
- "source": [
- "But rather than \"hard code\" those dates, we can get the first and last labels from the `Series`:"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": 22,
- "metadata": {},
- "outputs": [],
- "source": [
- "t_0 = get_first_label(census)"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": 23,
- "metadata": {},
- "outputs": [],
- "source": [
- "t_end = get_last_label(census)"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": 24,
- "metadata": {},
- "outputs": [],
- "source": [
- "elapsed_time = t_end - t_0"
- ]
- },
- {
- "cell_type": "markdown",
- "metadata": {},
- "source": [
- "And we can get the first and last values:"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": 25,
- "metadata": {},
- "outputs": [],
- "source": [
- "p_0 = get_first_value(census)"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": 26,
- "metadata": {},
- "outputs": [],
- "source": [
- "p_end = get_last_value(census)"
- ]
- },
- {
- "cell_type": "markdown",
- "metadata": {},
- "source": [
- "Then we can compute the average annual growth in billions of people per year."
- ]
- },
- {
- "cell_type": "code",
- "execution_count": 27,
- "metadata": {},
- "outputs": [],
- "source": [
- "total_growth = p_end - p_0"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": 28,
- "metadata": {},
- "outputs": [],
- "source": [
- "annual_growth = total_growth / elapsed_time"
- ]
- },
- {
- "cell_type": "markdown",
- "metadata": {},
- "source": [
- "### TimeSeries"
- ]
- },
- {
- "cell_type": "markdown",
- "metadata": {},
- "source": [
- "Now let's create a `TimeSeries` to contain values generated by a linear growth model."
- ]
- },
- {
- "cell_type": "code",
- "execution_count": 29,
- "metadata": {},
- "outputs": [],
- "source": [
- "results = TimeSeries()"
- ]
- },
- {
- "cell_type": "markdown",
- "metadata": {},
- "source": [
- "Initially the `TimeSeries` is empty, but we can initialize it so the starting value, in 1950, is the 1950 population estimated by the US Census."
- ]
- },
- {
- "cell_type": "code",
- "execution_count": 30,
- "metadata": {},
- "outputs": [],
- "source": [
- "results[t_0] = census[t_0]\n",
- "results"
- ]
- },
- {
- "cell_type": "markdown",
- "metadata": {},
- "source": [
- "After that, the population in the model grows by a constant amount each year."
- ]
- },
- {
- "cell_type": "code",
- "execution_count": 31,
- "metadata": {},
- "outputs": [],
- "source": [
- "for t in linrange(t_0, t_end):\n",
- " results[t+1] = results[t] + annual_growth"
- ]
- },
- {
- "cell_type": "markdown",
- "metadata": {},
- "source": [
- "Here's what the results looks like, compared to the actual data."
- ]
- },
- {
- "cell_type": "code",
- "execution_count": 32,
- "metadata": {},
- "outputs": [],
- "source": [
- "plot(census, ':', label='US Census')\n",
- "plot(un, '--', label='UN DESA')\n",
- "plot(results, color='gray', label='model')\n",
- "\n",
- "decorate(xlabel='Year', \n",
- " ylabel='World population (billion)',\n",
- " title='Constant growth')"
- ]
- },
- {
- "cell_type": "markdown",
- "metadata": {},
- "source": [
- "The model fits the data pretty well after 1990, but not so well before."
- ]
- },
- {
- "cell_type": "markdown",
- "metadata": {},
- "source": [
- "### Exercises\n",
- "\n",
- "**Optional Exercise:** Try fitting the model using data from 1970 to the present, and see if that does a better job.\n",
- "\n",
- "Hint: \n",
- "\n",
- "1. Copy the code from above and make a few changes. Test your code after each small change.\n",
- "\n",
- "2. Make sure your `TimeSeries` starts in 1950, even though the estimated annual growth is based on later data.\n",
- "\n",
- "3. You might want to add a constant to the starting value to match the data better."
- ]
- },
- {
- "cell_type": "code",
- "execution_count": 33,
- "metadata": {},
- "outputs": [],
- "source": [
- "# Solution goes here"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": 34,
- "metadata": {},
- "outputs": [],
- "source": [
- "census.loc[1960:1970]"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": null,
- "metadata": {},
- "outputs": [],
- "source": []
- }
- ],
- "metadata": {
- "kernelspec": {
- "display_name": "Python 3",
- "language": "python",
- "name": "python3"
- },
- "language_info": {
- "codemirror_mode": {
- "name": "ipython",
- "version": 3
- },
- "file_extension": ".py",
- "mimetype": "text/x-python",
- "name": "python",
- "nbconvert_exporter": "python",
- "pygments_lexer": "ipython3",
- "version": "3.7.9"
- }
- },
- "nbformat": 4,
- "nbformat_minor": 2
-}
+ "cells": [
+ {
+ "cell_type": "markdown",
+ "metadata": {
+ "id": "iPE3oY-oHF4k"
+ },
+ "source": [
+ "# Chapter 5"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {
+ "tags": [],
+ "id": "OL-k7bYZHF4q"
+ },
+ "source": [
+ "*Modeling and Simulation in Python* Edit by Chun San Yip 14 June 2021\n",
+ "\n",
+ "Copyright 2021 Allen Downey\n",
+ "\n",
+ "License: [Creative Commons Attribution-NonCommercial-ShareAlike 4.0 International](https://creativecommons.org/licenses/by-nc-sa/4.0/)"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "metadata": {
+ "tags": [],
+ "id": "SKoI-0GzHF4u"
+ },
+ "source": [
+ "# check if the libraries we need are installed\n",
+ "\n",
+ "try:\n",
+ " import pint\n",
+ "except ImportError:\n",
+ " !pip install pint\n",
+ " import pint\n",
+ " \n",
+ "try:\n",
+ " from modsim import *\n",
+ "except ImportError:\n",
+ " !pip install modsimpy\n",
+ " from modsim import *"
+ ],
+ "execution_count": null,
+ "outputs": []
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {
+ "id": "yD_qlKjoHF4w"
+ },
+ "source": [
+ "## Reading data\n",
+ "\n",
+ "Pandas is a library that provides tools for reading and processing data. `read_html` reads a web page from a file or the Internet and creates one `DataFrame` for each table on the page."
+ ]
+ },
+ {
+ "cell_type": "code",
+ "metadata": {
+ "id": "-w9PSt6GHF4x"
+ },
+ "source": [
+ "from pandas import read_html"
+ ],
+ "execution_count": 2,
+ "outputs": []
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {
+ "id": "HQwRgN-NHF4x"
+ },
+ "source": [
+ "The following cell downloads a copy of https://en.wikipedia.org/wiki/World_population_estimates"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "metadata": {
+ "id": "XUfgy8SYHF4y"
+ },
+ "source": [
+ "import os\n",
+ "\n",
+ "filename = 'World_population_estimates.html'\n",
+ "\n",
+ "if not os.path.exists(filename):\n",
+ " !wget https://raw.githubusercontent.com/AllenDowney/ModSimPy/master/data/World_population_estimates.html"
+ ],
+ "execution_count": null,
+ "outputs": []
+ },
+ {
+ "cell_type": "code",
+ "metadata": {
+ "colab": {
+ "base_uri": "https://localhost:8080/"
+ },
+ "id": "r06mR0RHHF4z",
+ "outputId": "b6ffe2f0-9295-4e6a-ace5-feb17082dbb5"
+ },
+ "source": [
+ "tables = read_html(filename, header=0, index_col=0, decimal='M')\n",
+ "len(tables)"
+ ],
+ "execution_count": 4,
+ "outputs": [
+ {
+ "output_type": "execute_result",
+ "data": {
+ "text/plain": [
+ "6"
+ ]
+ },
+ "metadata": {
+ "tags": []
+ },
+ "execution_count": 4
+ }
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {
+ "id": "5_yvjBxaHF40"
+ },
+ "source": [
+ "The arguments of `read_html` specify the file to read and how to interpret the tables in the file. The result, `tables`, is a sequence of `DataFrame` objects; `len(tables)` reports the length of the sequence.\n",
+ "\n",
+ "We can select the `DataFrame` we want using the bracket operator. The tables are numbered from 0, so `tables[2]` is actually the third table on the page.\n",
+ "\n",
+ "`head` selects the header and the first five rows."
+ ]
+ },
+ {
+ "cell_type": "code",
+ "metadata": {
+ "scrolled": true,
+ "id": "yXWwe2T8HF41"
+ },
+ "source": [
+ "table2 = tables[2]\n",
+ "table2.head()"
+ ],
+ "execution_count": null,
+ "outputs": []
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {
+ "id": "dCRWa6o-HF42"
+ },
+ "source": [
+ "`tail` selects the last five rows."
+ ]
+ },
+ {
+ "cell_type": "code",
+ "metadata": {
+ "id": "bamRq_drHF45"
+ },
+ "source": [
+ "table2.tail()"
+ ],
+ "execution_count": null,
+ "outputs": []
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {
+ "id": "1ln86agCHF46"
+ },
+ "source": [
+ "Long column names are awkard to work with, but we can replace them with abbreviated names."
+ ]
+ },
+ {
+ "cell_type": "code",
+ "metadata": {
+ "id": "k4VOfUYFHF47"
+ },
+ "source": [
+ "table2.columns = ['census', 'prb', 'un', 'maddison', \n",
+ " 'hyde', 'tanton', 'biraben', 'mj', \n",
+ " 'thomlinson', 'durand', 'clark']"
+ ],
+ "execution_count": 7,
+ "outputs": []
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {
+ "id": "2AY8uySnHF47"
+ },
+ "source": [
+ "Here's what the DataFrame looks like now. "
+ ]
+ },
+ {
+ "cell_type": "code",
+ "metadata": {
+ "colab": {
+ "base_uri": "https://localhost:8080/",
+ "height": 237
+ },
+ "id": "0IYk34OqHF48",
+ "outputId": "ab6f3be7-a7f2-41c6-a9f8-ecf7c4301424"
+ },
+ "source": [
+ "table2.head()"
+ ],
+ "execution_count": 8,
+ "outputs": [
+ {
+ "output_type": "execute_result",
+ "data": {
+ "text/html": [
+ "
\n",
+ "\n",
+ "
\n",
+ " \n",
+ "
\n",
+ "
\n",
+ "
census
\n",
+ "
prb
\n",
+ "
un
\n",
+ "
maddison
\n",
+ "
hyde
\n",
+ "
tanton
\n",
+ "
biraben
\n",
+ "
mj
\n",
+ "
thomlinson
\n",
+ "
durand
\n",
+ "
clark
\n",
+ "
\n",
+ "
\n",
+ "
Year
\n",
+ "
\n",
+ "
\n",
+ "
\n",
+ "
\n",
+ "
\n",
+ "
\n",
+ "
\n",
+ "
\n",
+ "
\n",
+ "
\n",
+ "
\n",
+ "
\n",
+ " \n",
+ " \n",
+ "
\n",
+ "
1950
\n",
+ "
2557628654
\n",
+ "
2.516000e+09
\n",
+ "
2.525149e+09
\n",
+ "
2.544000e+09
\n",
+ "
2.527960e+09
\n",
+ "
2.400000e+09
\n",
+ "
2.527000e+09
\n",
+ "
2.500000e+09
\n",
+ "
2.400000e+09
\n",
+ "
NaN
\n",
+ "
2.486000e+09
\n",
+ "
\n",
+ "
\n",
+ "
1951
\n",
+ "
2594939877
\n",
+ "
NaN
\n",
+ "
2.572851e+09
\n",
+ "
2.571663e+09
\n",
+ "
NaN
\n",
+ "
NaN
\n",
+ "
NaN
\n",
+ "
NaN
\n",
+ "
NaN
\n",
+ "
NaN
\n",
+ "
NaN
\n",
+ "
\n",
+ "
\n",
+ "
1952
\n",
+ "
2636772306
\n",
+ "
NaN
\n",
+ "
2.619292e+09
\n",
+ "
2.617949e+09
\n",
+ "
NaN
\n",
+ "
NaN
\n",
+ "
NaN
\n",
+ "
NaN
\n",
+ "
NaN
\n",
+ "
NaN
\n",
+ "
NaN
\n",
+ "
\n",
+ "
\n",
+ "
1953
\n",
+ "
2682053389
\n",
+ "
NaN
\n",
+ "
2.665865e+09
\n",
+ "
2.665959e+09
\n",
+ "
NaN
\n",
+ "
NaN
\n",
+ "
NaN
\n",
+ "
NaN
\n",
+ "
NaN
\n",
+ "
NaN
\n",
+ "
NaN
\n",
+ "
\n",
+ "
\n",
+ "
1954
\n",
+ "
2730228104
\n",
+ "
NaN
\n",
+ "
2.713172e+09
\n",
+ "
2.716927e+09
\n",
+ "
NaN
\n",
+ "
NaN
\n",
+ "
NaN
\n",
+ "
NaN
\n",
+ "
NaN
\n",
+ "
NaN
\n",
+ "
NaN
\n",
+ "
\n",
+ " \n",
+ "
\n",
+ "
"
+ ],
+ "text/plain": [
+ " census prb un ... thomlinson durand clark\n",
+ "Year ... \n",
+ "1950 2557628654 2.516000e+09 2.525149e+09 ... 2.400000e+09 NaN 2.486000e+09\n",
+ "1951 2594939877 NaN 2.572851e+09 ... NaN NaN NaN\n",
+ "1952 2636772306 NaN 2.619292e+09 ... NaN NaN NaN\n",
+ "1953 2682053389 NaN 2.665865e+09 ... NaN NaN NaN\n",
+ "1954 2730228104 NaN 2.713172e+09 ... NaN NaN NaN\n",
+ "\n",
+ "[5 rows x 11 columns]"
+ ]
+ },
+ "metadata": {
+ "tags": []
+ },
+ "execution_count": 8
+ }
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {
+ "id": "Hi2zwKG2HF49"
+ },
+ "source": [
+ "The first column, which is labeled `Year`, is special. It is the **index** for this `DataFrame`, which means it contains the labels for the rows.\n",
+ "\n",
+ "Some of the values use scientific notation; for example, `2.544000e+09` is shorthand for $2.544 \\cdot 10^9$ or 2.544 billion.\n",
+ "\n",
+ "`NaN` is a special value that indicates missing data."
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {
+ "id": "8pBb-0xGHF4-"
+ },
+ "source": [
+ "### Series\n",
+ "\n",
+ "We can use dot notation to select a column from a `DataFrame`. The result is a `Series`, which is like a `DataFrame` with a single column."
+ ]
+ },
+ {
+ "cell_type": "code",
+ "metadata": {
+ "colab": {
+ "base_uri": "https://localhost:8080/"
+ },
+ "id": "EqY5l84xHF4-",
+ "outputId": "3bd17f42-d110-4b5d-eada-fac68fbb3559"
+ },
+ "source": [
+ "census = table2.census\n",
+ "census.head()"
+ ],
+ "execution_count": 9,
+ "outputs": [
+ {
+ "output_type": "execute_result",
+ "data": {
+ "text/plain": [
+ "Year\n",
+ "1950 2557628654\n",
+ "1951 2594939877\n",
+ "1952 2636772306\n",
+ "1953 2682053389\n",
+ "1954 2730228104\n",
+ "Name: census, dtype: int64"
+ ]
+ },
+ "metadata": {
+ "tags": []
+ },
+ "execution_count": 9
+ }
+ ]
+ },
+ {
+ "cell_type": "code",
+ "metadata": {
+ "colab": {
+ "base_uri": "https://localhost:8080/"
+ },
+ "id": "RkvvaZGYHF4-",
+ "outputId": "a0da5455-001d-4a21-8927-b0cd6f54d14b"
+ },
+ "source": [
+ "census.tail()"
+ ],
+ "execution_count": 10,
+ "outputs": [
+ {
+ "output_type": "execute_result",
+ "data": {
+ "text/plain": [
+ "Year\n",
+ "2012 7013871313\n",
+ "2013 7092128094\n",
+ "2014 7169968185\n",
+ "2015 7247892788\n",
+ "2016 7325996709\n",
+ "Name: census, dtype: int64"
+ ]
+ },
+ "metadata": {
+ "tags": []
+ },
+ "execution_count": 10
+ }
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {
+ "id": "WYS0-BN7HF4_"
+ },
+ "source": [
+ "Like a `DataFrame`, a `Series` contains an index, which labels the rows.\n",
+ "\n",
+ "`1e9` is scientific notation for $1 \\cdot 10^9$ or 1 billion."
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {
+ "id": "aU_OUgtsHF4_"
+ },
+ "source": [
+ "From here on, we will work in units of billions."
+ ]
+ },
+ {
+ "cell_type": "code",
+ "metadata": {
+ "colab": {
+ "base_uri": "https://localhost:8080/"
+ },
+ "id": "8JJ7oszbHF4_",
+ "outputId": "baf7586c-6380-491d-8542-71f15fbd69c0"
+ },
+ "source": [
+ "un = table2.un / 1e9\n",
+ "un.head()"
+ ],
+ "execution_count": 19,
+ "outputs": [
+ {
+ "output_type": "execute_result",
+ "data": {
+ "text/plain": [
+ "Year\n",
+ "1950 2.525149\n",
+ "1951 2.572851\n",
+ "1952 2.619292\n",
+ "1953 2.665865\n",
+ "1954 2.713172\n",
+ "Name: un, dtype: float64"
+ ]
+ },
+ "metadata": {
+ "tags": []
+ },
+ "execution_count": 19
+ }
+ ]
+ },
+ {
+ "cell_type": "code",
+ "metadata": {
+ "colab": {
+ "base_uri": "https://localhost:8080/"
+ },
+ "id": "g0X7PmvmHF5A",
+ "outputId": "d2b8fe0a-fe2f-4a98-94dc-682796ffaecf"
+ },
+ "source": [
+ "census = table2.census / 1e9\n",
+ "census.head()"
+ ],
+ "execution_count": 12,
+ "outputs": [
+ {
+ "output_type": "execute_result",
+ "data": {
+ "text/plain": [
+ "Year\n",
+ "1950 2.557629\n",
+ "1951 2.594940\n",
+ "1952 2.636772\n",
+ "1953 2.682053\n",
+ "1954 2.730228\n",
+ "Name: census, dtype: float64"
+ ]
+ },
+ "metadata": {
+ "tags": []
+ },
+ "execution_count": 12
+ }
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {
+ "id": "tgN0O_qlHF5A"
+ },
+ "source": [
+ "Here's what these estimates look like."
+ ]
+ },
+ {
+ "cell_type": "code",
+ "metadata": {
+ "scrolled": false,
+ "colab": {
+ "base_uri": "https://localhost:8080/",
+ "height": 297
+ },
+ "id": "hnk8748HHF5A",
+ "outputId": "4bc601d1-9a9f-46db-dd8c-fd37e618caf6"
+ },
+ "source": [
+ "plot(census, ':', label='US Census')\n",
+ "plot(un, '--', label='UN DESA')\n",
+ " \n",
+ "decorate(xlabel='Year',\n",
+ " ylabel='World population (billion)')"
+ ],
+ "execution_count": 13,
+ "outputs": [
+ {
+ "output_type": "display_data",
+ "data": {
+ "image/png": "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\n",
+ "text/plain": [
+ "
"
+ ]
+ },
+ "metadata": {
+ "tags": []
+ }
+ }
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {
+ "id": "pWChdo61ygxw"
+ },
+ "source": [
+ "Here's what it looks like. Remember that the x axis is population now, not time."
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {
+ "id": "fU1P9F-Aygxy"
+ },
+ "source": [
+ "It looks like the growth rate passes through 0 when the population is a little less than 14 billion.\n",
+ "\n",
+ "In the book we found that the net growth is 0 when the population is $-\\alpha/\\beta$:"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "metadata": {
+ "colab": {
+ "base_uri": "https://localhost:8080/"
+ },
+ "id": "K7HXGcYtygxz",
+ "outputId": "c1fbb108-1656-4fd8-bbea-380aae8d68a6"
+ },
+ "source": [
+ "-system.alpha / system.beta"
+ ],
+ "execution_count": 63,
+ "outputs": [
+ {
+ "output_type": "execute_result",
+ "data": {
+ "text/plain": [
+ "12.045454545454545"
+ ]
+ },
+ "metadata": {
+ "tags": []
+ },
+ "execution_count": 63
+ }
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {
+ "id": "BgLOPYX1ygx3"
+ },
+ "source": [
+ "This is the equilibrium the population tends toward."
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {
+ "id": "kmESMfaUygx4"
+ },
+ "source": [
+ "`sns` is a library called Seaborn which provides functions that control the appearance of plots. In this case I want a grid to make it easier to estimate the population where the growth rate crosses through 0."
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {
+ "id": "du9lSD2Gygx7"
+ },
+ "source": [
+ "### Dysfunctions"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {
+ "id": "xD0WdSbzygx8"
+ },
+ "source": [
+ "When people first learn about functions, there are a few things they often find confusing. In this section I present and explain some common problems with functions.\n",
+ "\n",
+ "As an example, suppose you want a function that takes a `System` object, with variables `alpha` and `beta`, as a parameter and computes the carrying capacity, `-alpha/beta`. Here's a good solution:"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "metadata": {
+ "colab": {
+ "base_uri": "https://localhost:8080/"
+ },
+ "id": "mH3HsTY7ygx9",
+ "outputId": "09aa8e23-d86e-4741-c72b-7273fbb9861d"
+ },
+ "source": [
+ "def carrying_capacity(system):\n",
+ " K = -system.alpha / system.beta\n",
+ " return K\n",
+ " \n",
+ "sys1 = System(alpha=0.025, beta=-0.0018)\n",
+ "pop = carrying_capacity(sys1)\n",
+ "print(pop)"
+ ],
+ "execution_count": 64,
+ "outputs": [
+ {
+ "output_type": "stream",
+ "text": [
+ "13.88888888888889\n"
+ ],
+ "name": "stdout"
+ }
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {
+ "id": "4-gbutp9ygx-"
+ },
+ "source": [
+ "Now let's see all the ways that can go wrong.\n",
+ "\n",
+ "**Dysfunction #1:** Not using parameters. In the following version, the function doesn't take any parameters; when `sys1` appears inside the function, it refers to the object we created outside the function.\n"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "metadata": {
+ "colab": {
+ "base_uri": "https://localhost:8080/"
+ },
+ "id": "atlAqcVTygx-",
+ "outputId": "273b5117-c4bb-43bf-bd5e-a6f2b332824e"
+ },
+ "source": [
+ "def carrying_capacity():\n",
+ " K = -sys1.alpha / sys1.beta\n",
+ " return K\n",
+ " \n",
+ "sys1 = System(alpha=0.025, beta=-0.0018)\n",
+ "pop = carrying_capacity()\n",
+ "print(pop)"
+ ],
+ "execution_count": 65,
+ "outputs": [
+ {
+ "output_type": "stream",
+ "text": [
+ "13.88888888888889\n"
+ ],
+ "name": "stdout"
+ }
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {
+ "id": "V4UZAKFrygx_"
+ },
+ "source": [
+ "This version actually works, but it is not as versatile as it could be. If there are several `System` objects, this function can only work with one of them, and only if it is named `system`.\n",
+ "\n",
+ "**Dysfunction #2:** Clobbering the parameters. When people first learn about parameters, they often write functions like this:"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "metadata": {
+ "colab": {
+ "base_uri": "https://localhost:8080/"
+ },
+ "id": "Onp1QBfhygyY",
+ "outputId": "439792a8-7fb4-4132-b6eb-370c5d3bc72f"
+ },
+ "source": [
+ "def carrying_capacity(system):\n",
+ " system = System(alpha=0.025, beta=-0.0018)\n",
+ " K = -system.alpha / system.beta\n",
+ " return K\n",
+ " \n",
+ "sys1 = System(alpha=0.025, beta=-0.0018)\n",
+ "pop = carrying_capacity(sys1)\n",
+ "print(pop)"
+ ],
+ "execution_count": 66,
+ "outputs": [
+ {
+ "output_type": "stream",
+ "text": [
+ "13.88888888888889\n"
+ ],
+ "name": "stdout"
+ }
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {
+ "id": "n8mxGjrbygya"
+ },
+ "source": [
+ "In this example, we have a `System` object named `sys1` that gets passed as an argument to `carrying_capacity`. But when the function runs, it ignores the argument and immediately replaces it with a new `System` object. As a result, this function always returns the same value, no matter what argument is passed.\n",
+ "\n",
+ "When you write a function, you generally don't know what the values of the parameters will be. Your job is to write a function that works for any valid values. If you assign your own values to the parameters, you defeat the whole purpose of functions.\n",
+ "\n",
+ "\n",
+ "**Dysfunction #3:** No return value. Here's a version that computes the value of `K` but doesn't return it."
+ ]
+ },
+ {
+ "cell_type": "code",
+ "metadata": {
+ "colab": {
+ "base_uri": "https://localhost:8080/"
+ },
+ "id": "h88I6XCxygyb",
+ "outputId": "78ee26ac-9c27-411c-a185-e28f3a572ef2"
+ },
+ "source": [
+ "def carrying_capacity(system):\n",
+ " K = -system.alpha / system.beta\n",
+ " \n",
+ "sys1 = System(alpha=0.025, beta=-0.0018)\n",
+ "pop = carrying_capacity(sys1)\n",
+ "print(pop)"
+ ],
+ "execution_count": 67,
+ "outputs": [
+ {
+ "output_type": "stream",
+ "text": [
+ "None\n"
+ ],
+ "name": "stdout"
+ }
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {
+ "id": "Hw2v9HTtygyb"
+ },
+ "source": [
+ "A function that doesn't have a return statement always returns a special value called `None`, so in this example the value of `pop` is `None`. If you are debugging a program and find that the value of a variable is `None` when it shouldn't be, a function without a return statement is a likely cause.\n",
+ "\n",
+ "**Dysfunction #4:** Ignoring the return value. Finally, here's a version where the function is correct, but the way it's used is not."
+ ]
+ },
+ {
+ "cell_type": "code",
+ "metadata": {
+ "colab": {
+ "base_uri": "https://localhost:8080/"
+ },
+ "id": "iy_M_odYygye",
+ "outputId": "de7824a3-56c8-45ba-a8e3-eab2bfa26939"
+ },
+ "source": [
+ "def carrying_capacity(system):\n",
+ " K = -system.alpha / system.beta\n",
+ " return K\n",
+ " \n",
+ "sys2 = System(alpha=0.025, beta=-0.0018)\n",
+ "carrying_capacity(sys2)\n",
+ "\n",
+ "# print(K) This line won't work because K only exists inside the function."
+ ],
+ "execution_count": 68,
+ "outputs": [
+ {
+ "output_type": "execute_result",
+ "data": {
+ "text/plain": [
+ "13.88888888888889"
+ ]
+ },
+ "metadata": {
+ "tags": []
+ },
+ "execution_count": 68
+ }
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {
+ "id": "KJ87E4Q9ygye"
+ },
+ "source": [
+ "In this example, `carrying_capacity` runs and returns `K`, but the return value is dropped.\n",
+ "\n",
+ "When you call a function that returns a value, you should do something with the result. Often you assign it to a variable, as in the previous examples, but you can also use it as part of an expression.\n",
+ "\n",
+ "For example, you could eliminate the temporary variable `pop` like this:"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "metadata": {
+ "colab": {
+ "base_uri": "https://localhost:8080/"
+ },
+ "id": "BgWdx9v9ygyf",
+ "outputId": "f20bafc6-2f0b-4c6e-861c-740f937ad1c1"
+ },
+ "source": [
+ "print(carrying_capacity(sys1))"
+ ],
+ "execution_count": 69,
+ "outputs": [
+ {
+ "output_type": "stream",
+ "text": [
+ "13.88888888888889\n"
+ ],
+ "name": "stdout"
+ }
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {
+ "id": "b7Tb6Xhzygyg"
+ },
+ "source": [
+ "Or if you had more than one system, you could compute the total carrying capacity like this:\n"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "metadata": {
+ "colab": {
+ "base_uri": "https://localhost:8080/"
+ },
+ "id": "gsktd5jwygyh",
+ "outputId": "171c6597-c4cc-49f9-d108-0e75d44b0ea0"
+ },
+ "source": [
+ "total = carrying_capacity(sys1) + carrying_capacity(sys2)\n",
+ "total"
+ ],
+ "execution_count": 70,
+ "outputs": [
+ {
+ "output_type": "execute_result",
+ "data": {
+ "text/plain": [
+ "27.77777777777778"
+ ]
+ },
+ "metadata": {
+ "tags": []
+ },
+ "execution_count": 70
+ }
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {
+ "id": "WGmOmd1Mygyi"
+ },
+ "source": [
+ "## Exercises\n",
+ "\n",
+ "**Exercise:** In the book, I present a different way to parameterize the quadratic model:\n",
+ "\n",
+ "$ \\Delta p = r p (1 - p / K) $\n",
+ "\n",
+ "where $r=\\alpha$ and $K=-\\alpha/\\beta$. Write a version of `update_func` that implements this version of the model. Test it by computing the values of `r` and `K` that correspond to `alpha=0.025, beta=-0.0018`, and confirm that you get the same results. "
+ ]
+ },
+ {
+ "cell_type": "code",
+ "metadata": {
+ "id": "jHdMeaOpygyj"
+ },
+ "source": [
+ "def update_func_quad_para(pop, t, system):\n",
+ " \"\"\"Compute the population next year with a quadratic model in parameterized way.\n",
+ " \n",
+ " pop: current population\n",
+ " t: current year\n",
+ " system: system object containing parameters of the model\n",
+ " \n",
+ " returns: population next year\n",
+ " \"\"\"\n",
+ " net_growth = system.r * pop*(1-pop/system.K)\n",
+ " return pop + net_growth"
+ ],
+ "execution_count": 81,
+ "outputs": []
+ },
+ {
+ "cell_type": "code",
+ "metadata": {
+ "id": "HYL_WInwygyk"
+ },
+ "source": [
+ "alpha = 0.025\n",
+ "beta = -0.0018\n",
+ "system.r=alpha\n",
+ "system.K=-alpha/beta"
+ ],
+ "execution_count": 82,
+ "outputs": []
+ },
+ {
+ "cell_type": "code",
+ "metadata": {
+ "colab": {
+ "base_uri": "https://localhost:8080/",
+ "height": 297
+ },
+ "id": "pTTLxQUtygyl",
+ "outputId": "1fd22e0b-46ab-4656-b9fa-4bfec902aa33"
+ },
+ "source": [
+ "results = run_simulation(system, update_func_quad_para)\n",
+ "plot_results(census, un, results, 'Quadratic model in Parameterized way')"
+ ],
+ "execution_count": 83,
+ "outputs": [
+ {
+ "output_type": "display_data",
+ "data": {
+ "image/png": "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zZw507a+pqZGJSUlqeXLl6vGxkaVk5OjDAaD2rp1q22bV199VU2ZMkWdPn1aVVZWqhkzZqgnnniiw/azdetW9Y9//EOlpqaqm2+++YL7cPRzpz10yIA6x2QyXfBEW7Jkid2DTCmlnn/+efXoo4/abl8uoN555x1177332i2bM2eOmj9/fjtUfXG/pReLxaJGjhypPv7440vud968eWrOnDl2y+699161fPnydqr84n7rsTlfQ0ODMhgM6pNPPrEtc8axUeq39xMXF6e+//572+0jR46osLAwVV5erpRyzvH5Lb0UFRWpsLAwVVZWZlu/b98+FRYWZnvBdtZjTSmlduzYoWJjY223N27cqIYPH64sFott2ZIlS9QjjzyilGp9bOl0OrVz507b+nM9dsR+zrdx48aLBpSznjtXo0N+xPdrrFYr6hfz3yqlOHTokN2y7777jsTERMaPH8+CBQsoLy+3rTt8+DBRUVF220dFRXH48OFrV/hFXK6Xo0ePcubMGSoqKrj99tsxGo2kpKTYfRzmKr1A24/NOV9++SVms5m77rrLtqyj9TNr1iy++OILqquraWhoYN26dSQkJBAcHAy4Tj+X68VqtV7wO+e2P7eNM3tJT08nIiLCdvvw4cNERkai1f7vS9z5tRw7doympiZ0Op1t/U033YSPj0+H7KctXOWxdiU6XUCNGzeOtLQ0vv/+e8xmMyaTie3bt1NXV2fb5uGHH2br1q2YTCZWr15NcXExTz75pO0JV1tbS2BgoN1+AwMDqa2tdalezn1GvXXrVlJTU9m1axdxcXHMmDGD6upql+oF2nZszve3v/2Nu+66Cz8/P9uyjtbPyJEjKS4utp3n2LVrF3/6059s612ln8v1MmDAAAYOHMjbb79NXV0dpaWlrFq1CsC2jbN6+frrr9mwYQMvv/yybVltbS0BAQGXrOXcv7/cJiAgwG6bjtJPW7jKY+1KdLqAio+P580332TZsmUkJyezcuVK7rvvPttfrND6V0P37t3RaDT069eP119/ndzcXI4dOwaAv7//BSd/q6ur8ff3d2Qrl+3lXD0pKSn0798fLy8vnn76aerr68nJyXGpXqBtx+ac/Px8CgoKePDBB+2Wd6R+qqurefTRRxkxYgTZ2dnk5eXx+OOP88ADD9guwOkq/VyuF3d3d1atWkV5eTkTJkxg6tSp/O53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\n",
+ "text/plain": [
+ "
"
+ ]
+ },
+ "metadata": {
+ "tags": []
+ }
+ }
+ ]
+ },
+ {
+ "cell_type": "code",
+ "metadata": {
+ "id": "11Bpvovhygyl"
+ },
+ "source": [
+ ""
+ ],
+ "execution_count": null,
+ "outputs": []
+ }
+ ]
+}
\ No newline at end of file
diff --git a/colab/chap08.ipynb b/colab/chap08.ipynb
index a77508ed6..e5a4fc0b2 100644
--- a/colab/chap08.ipynb
+++ b/colab/chap08.ipynb
@@ -1,609 +1,1292 @@
{
- "cells": [
- {
- "cell_type": "markdown",
- "metadata": {},
- "source": [
- "# Chapter 8"
- ]
+ "nbformat": 4,
+ "nbformat_minor": 0,
+ "metadata": {
+ "kernelspec": {
+ "display_name": "Python 3",
+ "language": "python",
+ "name": "python3"
+ },
+ "language_info": {
+ "codemirror_mode": {
+ "name": "ipython",
+ "version": 3
+ },
+ "file_extension": ".py",
+ "mimetype": "text/x-python",
+ "name": "python",
+ "nbconvert_exporter": "python",
+ "pygments_lexer": "ipython3",
+ "version": "3.7.9"
+ },
+ "colab": {
+ "name": "chap08.ipynb",
+ "provenance": []
+ }
},
- {
- "cell_type": "markdown",
- "metadata": {
- "tags": []
- },
- "source": [
- "*Modeling and Simulation in Python*\n",
- "\n",
- "Copyright 2021 Allen Downey\n",
- "\n",
- "License: [Creative Commons Attribution-NonCommercial-ShareAlike 4.0 International](https://creativecommons.org/licenses/by-nc-sa/4.0/)"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": 1,
- "metadata": {
- "tags": []
- },
- "outputs": [],
- "source": [
- "# check if the libraries we need are installed\n",
- "\n",
- "try:\n",
- " import pint\n",
- "except ImportError:\n",
- " !pip install pint\n",
- " import pint\n",
- " \n",
- "try:\n",
- " from modsim import *\n",
- "except ImportError:\n",
- " !pip install modsimpy\n",
- " from modsim import *"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": 2,
- "metadata": {},
- "outputs": [],
- "source": [
- "# Configure Jupyter so figures appear in the notebook\n",
- "%matplotlib inline\n",
- "\n",
- "# import functions from the modsim.py module\n",
- "from modsim import *"
- ]
- },
- {
- "cell_type": "markdown",
- "metadata": {},
- "source": [
- "### Functions from the previous chapter"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": 3,
- "metadata": {},
- "outputs": [],
- "source": [
- "def plot_results(census, un, timeseries, title):\n",
- " \"\"\"Plot the estimates and the model.\n",
- " \n",
- " census: TimeSeries of population estimates\n",
- " un: TimeSeries of population estimates\n",
- " timeseries: TimeSeries of simulation results\n",
- " title: string\n",
- " \"\"\"\n",
- " plot(census, ':', label='US Census')\n",
- " plot(un, '--', label='UN DESA')\n",
- " plot(timeseries, color='gray', label='model')\n",
- " \n",
- " decorate(xlabel='Year', \n",
- " ylabel='World population (billion)',\n",
- " title=title)"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": 4,
- "metadata": {},
- "outputs": [],
- "source": [
- "def run_simulation(system, update_func):\n",
- " \"\"\"Simulate the system using any update function.\n",
- " \n",
- " system: System object\n",
- " update_func: function that computes the population next year\n",
- " \n",
- " returns: TimeSeries\n",
- " \"\"\"\n",
- " results = TimeSeries()\n",
- " results[system.t_0] = system.p_0\n",
- " \n",
- " for t in linrange(system.t_0, system.t_end):\n",
- " results[t+1] = update_func(results[t], t, system)\n",
- " \n",
- " return results"
- ]
- },
- {
- "cell_type": "markdown",
- "metadata": {},
- "source": [
- "### Reading the data"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": 5,
- "metadata": {},
- "outputs": [],
- "source": [
- "# Get the data file\n",
- "\n",
- "import os\n",
- "\n",
- "filename = 'World_population_estimates2.csv'\n",
- "if not os.path.exists(filename):\n",
- " !wget https://raw.githubusercontent.com/AllenDowney/ModSimPy/master/data/World_population_estimates2.csv"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": 6,
- "metadata": {},
- "outputs": [],
- "source": [
- "table2 = pd.read_csv('World_population_estimates2.csv')\n",
- "table2.index = table2.Year\n",
- "table2.head()"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": 7,
- "metadata": {},
- "outputs": [],
- "source": [
- "un = table2.un / 1e9\n",
- "census = table2.census / 1e9\n",
- "plot(census, ':', label='US Census')\n",
- "plot(un, '--', label='UN DESA')\n",
- " \n",
- "decorate(xlabel='Year', \n",
- " ylabel='World population (billion)',\n",
- " title='Estimated world population')"
- ]
- },
- {
- "cell_type": "markdown",
- "metadata": {},
- "source": [
- "### Running the quadratic model"
- ]
- },
- {
- "cell_type": "markdown",
- "metadata": {},
- "source": [
- "Here's the update function for the quadratic growth model with parameters `alpha` and `beta`."
- ]
- },
- {
- "cell_type": "code",
- "execution_count": 8,
- "metadata": {},
- "outputs": [],
- "source": [
- "def update_func_quad(pop, t, system):\n",
- " \"\"\"Update population based on a quadratic model.\n",
- " \n",
- " pop: current population in billions\n",
- " t: what year it is\n",
- " system: system object with model parameters\n",
- " \"\"\"\n",
- " net_growth = system.alpha * pop + system.beta * pop**2\n",
- " return pop + net_growth"
- ]
- },
- {
- "cell_type": "markdown",
- "metadata": {},
- "source": [
- "Extract the starting time and population."
- ]
- },
- {
- "cell_type": "code",
- "execution_count": 9,
- "metadata": {},
- "outputs": [],
- "source": [
- "t_0 = get_first_label(census)\n",
- "t_end = get_last_label(census)\n",
- "p_0 = get_first_value(census)"
- ]
- },
- {
- "cell_type": "markdown",
- "metadata": {},
- "source": [
- "Initialize the system object."
- ]
- },
- {
- "cell_type": "code",
- "execution_count": 10,
- "metadata": {
- "scrolled": true
- },
- "outputs": [],
- "source": [
- "system = System(t_0=t_0, \n",
- " t_end=t_end,\n",
- " p_0=p_0,\n",
- " alpha=0.025,\n",
- " beta=-0.0018)"
- ]
- },
- {
- "cell_type": "markdown",
- "metadata": {},
- "source": [
- "Run the model and plot results."
- ]
- },
- {
- "cell_type": "code",
- "execution_count": 11,
- "metadata": {},
- "outputs": [],
- "source": [
- "results = run_simulation(system, update_func_quad)\n",
- "plot_results(census, un, results, 'Quadratic model')"
- ]
- },
- {
- "cell_type": "markdown",
- "metadata": {},
- "source": [
- "### Generating projections"
- ]
- },
- {
- "cell_type": "markdown",
- "metadata": {},
- "source": [
- "To generate projections, all we have to do is change `t_end`"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": 13,
- "metadata": {
- "scrolled": false
- },
- "outputs": [],
- "source": [
- "system.t_end = 2250\n",
- "results = run_simulation(system, update_func_quad)\n",
- "plot_results(census, un, results, 'World population projection')"
- ]
- },
- {
- "cell_type": "markdown",
- "metadata": {},
- "source": [
- "The population in the model converges on the equilibrium population, `-alpha/beta`"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": 14,
- "metadata": {},
- "outputs": [],
- "source": [
- "results[system.t_end]"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": 15,
- "metadata": {},
- "outputs": [],
- "source": [
- "-system.alpha / system.beta"
- ]
- },
- {
- "cell_type": "markdown",
- "metadata": {},
- "source": [
- "**Exercise:** What happens if we start with an initial population above the carrying capacity, like 20 billion? Run the model with initial populations between 1 and 20 billion, and plot the results on the same axes."
- ]
- },
- {
- "cell_type": "code",
- "execution_count": 16,
- "metadata": {},
- "outputs": [],
- "source": [
- "# Solution goes here"
- ]
- },
- {
- "cell_type": "markdown",
- "metadata": {},
- "source": [
- "### Comparing projections"
- ]
- },
- {
- "cell_type": "markdown",
- "metadata": {},
- "source": [
- "We can compare the projection from our model with projections produced by people who know what they are doing."
- ]
- },
- {
- "cell_type": "code",
- "execution_count": 17,
- "metadata": {},
- "outputs": [],
- "source": [
- "# Get the data file\n",
- "\n",
- "import os\n",
- "\n",
- "filename = 'World_population_estimates3.csv'\n",
- "if not os.path.exists(filename):\n",
- " !wget https://raw.githubusercontent.com/AllenDowney/ModSimPy/master/data/World_population_estimates3.csv\n"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": 18,
- "metadata": {},
- "outputs": [],
- "source": [
- "def read_table3(filename = 'data/World_population_estimates.html'):\n",
- " tables = pd.read_html(filename, header=0, index_col=0, decimal='M')\n",
- " table3 = tables[3]\n",
- " table3.columns = ['census', 'prb', 'un']\n",
- " return table3"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": 19,
- "metadata": {},
- "outputs": [],
- "source": [
- "#table3 = read_table3()\n",
- "#table3.to_csv('data/World_population_estimates3.csv')"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": 20,
- "metadata": {},
- "outputs": [],
- "source": [
- "table3 = pd.read_csv('World_population_estimates3.csv')\n",
- "table3.index = table3.Year\n",
- "table3.head()"
- ]
- },
- {
- "cell_type": "markdown",
- "metadata": {},
- "source": [
- "`NaN` is a special value that represents missing data, in this case because some agencies did not publish projections for some years."
- ]
- },
- {
- "cell_type": "markdown",
- "metadata": {},
- "source": [
- "This function plots projections from the UN DESA and U.S. Census. It uses `dropna` to remove the `NaN` values from each series before plotting it."
- ]
- },
- {
- "cell_type": "code",
- "execution_count": 21,
- "metadata": {},
- "outputs": [],
- "source": [
- "def plot_projections(table):\n",
- " \"\"\"Plot world population projections.\n",
- " \n",
- " table: DataFrame with columns 'un' and 'census'\n",
- " \"\"\"\n",
- " census_proj = table.census / 1e9\n",
- " un_proj = table.un / 1e9\n",
- " \n",
- " plot(census_proj.dropna(), ':', color='C0', label='US Census')\n",
- " plot(un_proj.dropna(), '--', color='C1', label='UN DESA')"
- ]
- },
- {
- "cell_type": "markdown",
- "metadata": {},
- "source": [
- "Run the model until 2100, which is as far as the other projections go."
- ]
- },
- {
- "cell_type": "code",
- "execution_count": 22,
- "metadata": {},
- "outputs": [],
- "source": [
- "system = System(t_0=t_0, \n",
- " t_end=2100,\n",
- " p_0=p_0,\n",
- " alpha=0.025,\n",
- " beta=-0.0018)"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": 23,
- "metadata": {},
- "outputs": [],
- "source": [
- "results = run_simulation(system, update_func_quad)\n",
- "\n",
- "plt.axvspan(1950, 2016, color='C0', alpha=0.05)\n",
- "plot_results(census, un, results, 'World population projections')\n",
- "plot_projections(table3)"
- ]
- },
- {
- "cell_type": "markdown",
- "metadata": {},
- "source": [
- "People who know what they are doing expect the growth rate to decline more sharply than our model projects."
- ]
- },
- {
- "cell_type": "markdown",
- "metadata": {},
- "source": [
- "## Exercises\n",
- "\n",
- "**Exercise:** The net growth rate of world population has been declining for several decades. That observation suggests one more way to generate projections, by extrapolating observed changes in growth rate.\n",
- "\n",
- "The `modsim` library provides a function, `compute_rel_diff`, that computes relative differences of the elements in a sequence.\n",
- "\n",
- "Here's how we can use it to compute the relative differences in the `census` and `un` estimates:"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": 24,
- "metadata": {},
- "outputs": [],
- "source": [
- "alpha_census = compute_rel_diff(census)\n",
- "plot(alpha_census, label='US Census')\n",
- "\n",
- "alpha_un = compute_rel_diff(un)\n",
- "plot(alpha_un, label='UN DESA')\n",
- "\n",
- "decorate(xlabel='Year', label='Net growth rate')"
- ]
- },
- {
- "cell_type": "markdown",
- "metadata": {},
- "source": [
- "Other than a bump around 1990, net growth rate has been declining roughly linearly since 1965. As an exercise, you can use this data to make a projection of world population until 2100.\n",
- "\n",
- "1. Define a function, `alpha_func`, that takes `t` as a parameter and returns an estimate of the net growth rate at time `t`, based on a linear function `alpha = intercept + slope * t`. Choose values of `slope` and `intercept` to fit the observed net growth rates since 1965.\n",
- "\n",
- "2. Call your function with a range of `ts` from 1960 to 2020 and plot the results.\n",
- "\n",
- "3. Create a `System` object that includes `alpha_func` as a system variable.\n",
- "\n",
- "4. Define an update function that uses `alpha_func` to compute the net growth rate at the given time `t`.\n",
- "\n",
- "5. Test your update function with `t_0 = 1960` and `p_0 = census[t_0]`.\n",
- "\n",
- "6. Run a simulation from 1960 to 2100 with your update function, and plot the results.\n",
- "\n",
- "7. Compare your projections with those from the US Census and UN."
- ]
- },
- {
- "cell_type": "code",
- "execution_count": 25,
- "metadata": {},
- "outputs": [],
- "source": [
- "# Solution goes here"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": 26,
- "metadata": {},
- "outputs": [],
- "source": [
- "# Solution goes here"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": 28,
- "metadata": {},
- "outputs": [],
- "source": [
- "# Solution goes here"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": 29,
- "metadata": {},
- "outputs": [],
- "source": [
- "# Solution goes here"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": 30,
- "metadata": {},
- "outputs": [],
- "source": [
- "# Solution goes here"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": 31,
- "metadata": {},
- "outputs": [],
- "source": [
- "# Solution goes here"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": 32,
- "metadata": {},
- "outputs": [],
- "source": [
- "# Solution goes here"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": 33,
- "metadata": {},
- "outputs": [],
- "source": [
- "# Solution goes here"
- ]
- },
- {
- "cell_type": "markdown",
- "metadata": {},
- "source": [
- "**Related viewing:** You might be interested in this [video by Hans Rosling about the demographic changes we expect in this century](https://www.youtube.com/watch?v=ezVk1ahRF78)."
- ]
- },
- {
- "cell_type": "code",
- "execution_count": null,
- "metadata": {},
- "outputs": [],
- "source": []
- }
- ],
- "metadata": {
- "kernelspec": {
- "display_name": "Python 3",
- "language": "python",
- "name": "python3"
- },
- "language_info": {
- "codemirror_mode": {
- "name": "ipython",
- "version": 3
- },
- "file_extension": ".py",
- "mimetype": "text/x-python",
- "name": "python",
- "nbconvert_exporter": "python",
- "pygments_lexer": "ipython3",
- "version": "3.7.9"
- }
- },
- "nbformat": 4,
- "nbformat_minor": 2
-}
+ "cells": [
+ {
+ "cell_type": "markdown",
+ "metadata": {
+ "id": "0_YM0iUXpVVp"
+ },
+ "source": [
+ "# Chapter 8"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {
+ "tags": [],
+ "id": "-h5aOosbpVVw"
+ },
+ "source": [
+ "*Modeling and Simulation in Python* edit by Chun San Yip \n",
+ "\n",
+ "Copyright 2021 Allen Downey\n",
+ "\n",
+ "License: [Creative Commons Attribution-NonCommercial-ShareAlike 4.0 International](https://creativecommons.org/licenses/by-nc-sa/4.0/)"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "metadata": {
+ "tags": [],
+ "id": "WOcq5JVupVVy"
+ },
+ "source": [
+ "# check if the libraries we need are installed\n",
+ "\n",
+ "try:\n",
+ " import pint\n",
+ "except ImportError:\n",
+ " !pip install pint\n",
+ " import pint\n",
+ " \n",
+ "try:\n",
+ " from modsim import *\n",
+ "except ImportError:\n",
+ " !pip install modsimpy\n",
+ " from modsim import *"
+ ],
+ "execution_count": 1,
+ "outputs": []
+ },
+ {
+ "cell_type": "code",
+ "metadata": {
+ "id": "eYIJJJNPpVV0"
+ },
+ "source": [
+ "# Configure Jupyter so figures appear in the notebook\n",
+ "%matplotlib inline\n",
+ "\n",
+ "# import functions from the modsim.py module\n",
+ "from modsim import *"
+ ],
+ "execution_count": 2,
+ "outputs": []
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {
+ "id": "0DDBEYaFpVV0"
+ },
+ "source": [
+ "### Functions from the previous chapter"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "metadata": {
+ "id": "1maBu1MOpVV1"
+ },
+ "source": [
+ "def plot_results(census, un, timeseries, title):\n",
+ " \"\"\"Plot the estimates and the model.\n",
+ " \n",
+ " census: TimeSeries of population estimates\n",
+ " un: TimeSeries of population estimates\n",
+ " timeseries: TimeSeries of simulation results\n",
+ " title: string\n",
+ " \"\"\"\n",
+ " plot(census, ':', label='US Census')\n",
+ " plot(un, '--', label='UN DESA')\n",
+ " plot(timeseries, color='gray', label='model')\n",
+ " \n",
+ " decorate(xlabel='Year', \n",
+ " ylabel='World population (billion)',\n",
+ " title=title)"
+ ],
+ "execution_count": 3,
+ "outputs": []
+ },
+ {
+ "cell_type": "code",
+ "metadata": {
+ "id": "8UNCFPjGpVV2"
+ },
+ "source": [
+ "def run_simulation(system, update_func):\n",
+ " \"\"\"Simulate the system using any update function.\n",
+ " \n",
+ " system: System object\n",
+ " update_func: function that computes the population next year\n",
+ " \n",
+ " returns: TimeSeries\n",
+ " \"\"\"\n",
+ " results = TimeSeries()\n",
+ " results[system.t_0] = system.p_0\n",
+ " \n",
+ " for t in linrange(system.t_0, system.t_end):\n",
+ " results[t+1] = update_func(results[t], t, system)\n",
+ " \n",
+ " return results"
+ ],
+ "execution_count": 4,
+ "outputs": []
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {
+ "id": "ZbrI5dj-pVV4"
+ },
+ "source": [
+ "### Reading the data"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "metadata": {
+ "id": "QdetVNyYpVV6"
+ },
+ "source": [
+ "# Get the data file\n",
+ "\n",
+ "import os\n",
+ "\n",
+ "filename = 'World_population_estimates2.csv'\n",
+ "if not os.path.exists(filename):\n",
+ " !wget https://raw.githubusercontent.com/AllenDowney/ModSimPy/master/data/World_population_estimates2.csv"
+ ],
+ "execution_count": 5,
+ "outputs": []
+ },
+ {
+ "cell_type": "code",
+ "metadata": {
+ "colab": {
+ "base_uri": "https://localhost:8080/",
+ "height": 237
+ },
+ "id": "vlfyzU9ppVV8",
+ "outputId": "2ff7ed6b-2b81-4c65-df66-95dc07079bc0"
+ },
+ "source": [
+ "table2 = pd.read_csv('World_population_estimates2.csv')\n",
+ "table2.index = table2.Year\n",
+ "table2.head()"
+ ],
+ "execution_count": 6,
+ "outputs": [
+ {
+ "output_type": "execute_result",
+ "data": {
+ "text/html": [
+ "
"
+ ],
+ "text/plain": [
+ " Year census prb un\n",
+ "Year \n",
+ "2016 2016 7.334772e+09 NaN 7.432663e+09\n",
+ "2017 2017 7.412779e+09 NaN NaN\n",
+ "2018 2018 7.490428e+09 NaN NaN\n",
+ "2019 2019 7.567403e+09 NaN NaN\n",
+ "2020 2020 7.643402e+09 NaN 7.758157e+09"
+ ]
+ },
+ "metadata": {
+ "tags": []
+ },
+ "execution_count": 19
+ }
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {
+ "id": "5bBFMNZupVWF"
+ },
+ "source": [
+ "`NaN` is a special value that represents missing data, in this case because some agencies did not publish projections for some years."
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {
+ "id": "ijHqbm3RpVWF"
+ },
+ "source": [
+ "This function plots projections from the UN DESA and U.S. Census. It uses `dropna` to remove the `NaN` values from each series before plotting it."
+ ]
+ },
+ {
+ "cell_type": "code",
+ "metadata": {
+ "id": "EJe4VxBOpVWG"
+ },
+ "source": [
+ "def plot_projections(table):\n",
+ " \"\"\"Plot world population projections.\n",
+ " \n",
+ " table: DataFrame with columns 'un' and 'census'\n",
+ " \"\"\"\n",
+ " census_proj = table.census / 1e9\n",
+ " un_proj = table.un / 1e9\n",
+ " \n",
+ " plot(census_proj.dropna(), ':', color='C0', label='US Census')\n",
+ " plot(un_proj.dropna(), '--', color='C1', label='UN DESA')"
+ ],
+ "execution_count": 20,
+ "outputs": []
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {
+ "id": "jNXOqUGTpVWG"
+ },
+ "source": [
+ "Run the model until 2100, which is as far as the other projections go."
+ ]
+ },
+ {
+ "cell_type": "code",
+ "metadata": {
+ "id": "NI34nu3EpVWG"
+ },
+ "source": [
+ "system = System(t_0=t_0, \n",
+ " t_end=2100,\n",
+ " p_0=p_0,\n",
+ " alpha=0.025,\n",
+ " beta=-0.0018)"
+ ],
+ "execution_count": 21,
+ "outputs": []
+ },
+ {
+ "cell_type": "code",
+ "metadata": {
+ "colab": {
+ "base_uri": "https://localhost:8080/",
+ "height": 297
+ },
+ "id": "69_AnQGhpVWG",
+ "outputId": "d5529b91-a317-49dc-cf0f-23b170a8335d"
+ },
+ "source": [
+ "results = run_simulation(system, update_func_quad)\n",
+ "\n",
+ "plt.axvspan(1950, 2016, color='C0', alpha=0.05)\n",
+ "plot_results(census, un, results, 'World population projections')\n",
+ "plot_projections(table3)"
+ ],
+ "execution_count": 22,
+ "outputs": [
+ {
+ "output_type": "display_data",
+ "data": {
+ "image/png": "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\n",
+ "text/plain": [
+ "
"
+ ]
+ },
+ "metadata": {
+ "tags": [],
+ "needs_background": "light"
+ }
+ }
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {
+ "id": "MWpCXMSdpVWI"
+ },
+ "source": [
+ "People who know what they are doing expect the growth rate to decline more sharply than our model projects."
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {
+ "id": "D20CaVqbpVWJ"
+ },
+ "source": [
+ "## Exercises\n",
+ "\n",
+ "**Exercise:** The net growth rate of world population has been declining for several decades. That observation suggests one more way to generate projections, by extrapolating observed changes in growth rate.\n",
+ "\n",
+ "The `modsim` library provides a function, `compute_rel_diff`, that computes relative differences of the elements in a sequence.\n",
+ "\n",
+ "Here's how we can use it to compute the relative differences in the `census` and `un` estimates:"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "metadata": {
+ "colab": {
+ "base_uri": "https://localhost:8080/",
+ "height": 523
+ },
+ "id": "kcjtnJh-pVWJ",
+ "outputId": "54273697-3478-40d0-b813-6b0285f77dcd"
+ },
+ "source": [
+ "alpha_census = compute_rel_diff(census)\n",
+ "plot(alpha_census, label='US Census')\n",
+ "\n",
+ "alpha_un = compute_rel_diff(un)\n",
+ "plot(alpha_un, label='UN DESA')\n",
+ "\n",
+ "decorate(xlabel='Year', label='Net growth rate')\n",
+ "print(alpha_un)\n"
+ ],
+ "execution_count": 35,
+ "outputs": [
+ {
+ "output_type": "stream",
+ "text": [
+ "Year\n",
+ "1950 0.018891\n",
+ "1951 0.018050\n",
+ "1952 0.017781\n",
+ "1953 0.017745\n",
+ "1954 0.017868\n",
+ " ... \n",
+ "2012 0.011588\n",
+ "2013 0.011402\n",
+ "2014 0.014590\n",
+ "2015 NaN\n",
+ "2016 NaN\n",
+ "Length: 67, dtype: float64\n"
+ ],
+ "name": "stdout"
+ },
+ {
+ "output_type": "display_data",
+ "data": {
+ "image/png": "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\n",
+ "text/plain": [
+ "
"
+ ]
+ },
+ "metadata": {
+ "tags": [],
+ "needs_background": "light"
+ }
+ }
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {
+ "id": "0eZD6MWepVWK"
+ },
+ "source": [
+ "Other than a bump around 1990, net growth rate has been declining roughly linearly since 1965. As an exercise, you can use this data to make a projection of world population until 2100.\n",
+ "\n",
+ "1. Define a function, `alpha_func`, that takes `t` as a parameter and returns an estimate of the net growth rate at time `t`, based on a linear function `alpha = intercept + slope * t`. Choose values of `slope` and `intercept` to fit the observed net growth rates since 1965.\n",
+ "\n",
+ "2. Call your function with a range of `ts` from 1960 to 2020 and plot the results.\n",
+ "\n",
+ "3. Create a `System` object that includes `alpha_func` as a system variable.\n",
+ "\n",
+ "4. Define an update function that uses `alpha_func` to compute the net growth rate at the given time `t`.\n",
+ "\n",
+ "5. Test your update function with `t_0 = 1960` and `p_0 = census[t_0]`.\n",
+ "\n",
+ "6. Run a simulation from 1960 to 2100 with your update function, and plot the results.\n",
+ "\n",
+ "7. Compare your projections with those from the US Census and UN."
+ ]
+ },
+ {
+ "cell_type": "code",
+ "metadata": {
+ "id": "8JwS4y86pVWK"
+ },
+ "source": [
+ "def alpha_func(t):\n",
+ " intercept = 0.765\n",
+ " slope = -0.0003778\n",
+ " alpha = intercept + slope * t\n",
+ " return alpha\n"
+ ],
+ "execution_count": 51,
+ "outputs": []
+ },
+ {
+ "cell_type": "code",
+ "metadata": {
+ "colab": {
+ "base_uri": "https://localhost:8080/",
+ "height": 289
+ },
+ "id": "Al01bvZvpVWL",
+ "outputId": "bc70d11e-c3c3-4340-faf0-162990449d53"
+ },
+ "source": [
+ "growth_rate = TimeSeries()\n",
+ "for ts in linrange(1960,2020):\n",
+ " growth_rate[ts]=alpha_func(ts)\n",
+ "\n",
+ "plot(growth_rate, label='Growth Rate')"
+ ],
+ "execution_count": 65,
+ "outputs": [
+ {
+ "output_type": "execute_result",
+ "data": {
+ "text/plain": [
+ "[]"
+ ]
+ },
+ "metadata": {
+ "tags": []
+ },
+ "execution_count": 65
+ },
+ {
+ "output_type": "display_data",
+ "data": {
+ "image/png": "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\n",
+ "text/plain": [
+ "
"
+ ]
+ },
+ "metadata": {
+ "tags": [],
+ "needs_background": "light"
+ }
+ }
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {
+ "id": "-sI2kU02r12v"
+ },
+ "source": [
+ "It's often useful to separate the code that generates results from the code that plots the results, so we can run the simulations once, save the results, and then use them for different analysis, visualization, etc.\n",
+ "\n",
+ "After running `sweep_parameters`, we have a `SweepFrame` with one row for each value of `beta` and one column for each value of `gamma`."
+ ]
+ },
+ {
+ "cell_type": "code",
+ "metadata": {
+ "scrolled": true,
+ "colab": {
+ "base_uri": "https://localhost:8080/",
+ "height": 297
+ },
+ "id": "UbiN4K46r12w",
+ "outputId": "b4855176-2450-40f3-91d0-e38b3589edef"
+ },
+ "source": [
+ "contour(frame)\n",
+ "\n",
+ "decorate(xlabel='Recovery rate (gamma)',\n",
+ " ylabel='Contact rate (beta)',\n",
+ " title='Fraction infected, contour plot')"
+ ],
+ "execution_count": 22,
+ "outputs": [
+ {
+ "output_type": "display_data",
+ "data": {
+ "image/png": "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\n",
+ "text/plain": [
+ "
"
+ ]
+ },
+ "metadata": {
+ "tags": [],
+ "needs_background": "light"
+ }
+ }
+ ]
+ },
+ {
+ "cell_type": "code",
+ "metadata": {
+ "id": "rYrbymbTr12w"
+ },
+ "source": [
+ ""
+ ],
+ "execution_count": 22,
+ "outputs": []
+ }
+ ]
+}
\ No newline at end of file
diff --git a/colab/chap14.ipynb b/colab/chap14.ipynb
index c8522091a..cd1e7ab78 100644
--- a/colab/chap14.ipynb
+++ b/colab/chap14.ipynb
@@ -1,487 +1,826 @@
{
- "cells": [
- {
- "cell_type": "markdown",
- "metadata": {},
- "source": [
- "# Chapter 14"
- ]
- },
- {
- "cell_type": "markdown",
- "metadata": {
- "tags": []
- },
- "source": [
- "*Modeling and Simulation in Python*\n",
- "\n",
- "Copyright 2021 Allen Downey\n",
- "\n",
- "License: [Creative Commons Attribution-NonCommercial-ShareAlike 4.0 International](https://creativecommons.org/licenses/by-nc-sa/4.0/)"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": 1,
- "metadata": {
- "tags": []
- },
- "outputs": [],
- "source": [
- "# check if the libraries we need are installed\n",
- "\n",
- "try:\n",
- " import pint\n",
- "except ImportError:\n",
- " !pip install pint\n",
- " import pint\n",
- " \n",
- "try:\n",
- " from modsim import *\n",
- "except ImportError:\n",
- " !pip install modsimpy\n",
- " from modsim import *"
- ]
- },
- {
- "cell_type": "markdown",
- "metadata": {},
- "source": [
- "### Code from previous chapters"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": 2,
- "metadata": {},
- "outputs": [],
- "source": [
- "def make_system(beta, gamma):\n",
- " \"\"\"Make a system object for the SIR model.\n",
- " \n",
- " beta: contact rate in days\n",
- " gamma: recovery rate in days\n",
- " \n",
- " returns: System object\n",
- " \"\"\"\n",
- " init = State(S=89, I=1, R=0)\n",
- " init /= np.sum(init)\n",
- "\n",
- " t0 = 0\n",
- " t_end = 7 * 14\n",
- "\n",
- " return System(init=init, t0=t0, t_end=t_end,\n",
- " beta=beta, gamma=gamma)"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": 3,
- "metadata": {},
- "outputs": [],
- "source": [
- "def update_func(state, t, system):\n",
- " \"\"\"Update the SIR model.\n",
- " \n",
- " state: State (s, i, r)\n",
- " t: time\n",
- " system: System object\n",
- " \n",
- " returns: State (sir)\n",
- " \"\"\"\n",
- " s, i, r = state\n",
- "\n",
- " infected = system.beta * i * s \n",
- " recovered = system.gamma * i\n",
- " \n",
- " s -= infected\n",
- " i += infected - recovered\n",
- " r += recovered\n",
- " \n",
- " return State(S=s, I=i, R=r)"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": 4,
- "metadata": {},
- "outputs": [],
- "source": [
- "def run_simulation(system, update_func):\n",
- " \"\"\"Runs a simulation of the system.\n",
- " \n",
- " system: System object\n",
- " update_func: function that updates state\n",
- " \n",
- " returns: TimeFrame\n",
- " \"\"\"\n",
- " init, t0, t_end = system.init, system.t0, system.t_end\n",
- " \n",
- " frame = TimeFrame(columns=init.index)\n",
- " frame.row[t0] = init\n",
- " \n",
- " for t in linrange(t0, t_end):\n",
- " frame.row[t+1] = update_func(frame.row[t], t, system)\n",
- " \n",
- " return frame"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": 5,
- "metadata": {},
- "outputs": [],
- "source": [
- "def calc_total_infected(results):\n",
- " \"\"\"Fraction of population infected during the simulation.\n",
- " \n",
- " results: DataFrame with columns S, I, R\n",
- " \n",
- " returns: fraction of population\n",
- " \"\"\"\n",
- " return get_first_value(results.S) - get_last_value(results.S)"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": 6,
- "metadata": {},
- "outputs": [],
- "source": [
- "def sweep_beta(beta_array, gamma):\n",
- " \"\"\"Sweep a range of values for beta.\n",
- " \n",
- " beta_array: array of beta values\n",
- " gamma: recovery rate\n",
- " \n",
- " returns: SweepSeries that maps from beta to total infected\n",
- " \"\"\"\n",
- " sweep = SweepSeries()\n",
- " for beta in beta_array:\n",
- " system = make_system(beta, gamma)\n",
- " results = run_simulation(system, update_func)\n",
- " sweep[system.beta] = calc_total_infected(results)\n",
- " return sweep"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": 7,
- "metadata": {},
- "outputs": [],
- "source": [
- "def sweep_parameters(beta_array, gamma_array):\n",
- " \"\"\"Sweep a range of values for beta and gamma.\n",
- " \n",
- " beta_array: array of infection rates\n",
- " gamma_array: array of recovery rates\n",
- " \n",
- " returns: SweepFrame with one row for each beta\n",
- " and one column for each gamma\n",
- " \"\"\"\n",
- " frame = SweepFrame(columns=gamma_array)\n",
- " for gamma in gamma_array:\n",
- " frame[gamma] = sweep_beta(beta_array, gamma)\n",
- " return frame"
- ]
- },
- {
- "cell_type": "markdown",
- "metadata": {},
- "source": [
- "### Contact number"
- ]
- },
- {
- "cell_type": "markdown",
- "metadata": {},
- "source": [
- "Here's the `SweepFrame` from the previous chapter, with one row for each value of `beta` and one column for each value of `gamma`."
- ]
- },
- {
- "cell_type": "code",
- "execution_count": 8,
- "metadata": {},
- "outputs": [],
- "source": [
- "beta_array = [0.1, 0.2, 0.3, 0.4, 0.5, 0.6, 0.7, 0.8, 0.9, 1.0 , 1.1]\n",
- "gamma_array = [0.2, 0.4, 0.6, 0.8]\n",
- "frame = sweep_parameters(beta_array, gamma_array)\n",
- "frame.head()"
- ]
- },
- {
- "cell_type": "markdown",
- "metadata": {},
- "source": []
- },
- {
- "cell_type": "code",
- "execution_count": 9,
- "metadata": {},
- "outputs": [],
- "source": [
- "frame.shape"
- ]
- },
- {
- "cell_type": "markdown",
- "metadata": {},
- "source": [
- "The following loop shows how we can loop through the columns and rows of the `SweepFrame`. With 11 rows and 4 columns, there are 44 elements."
- ]
- },
- {
- "cell_type": "code",
- "execution_count": 10,
- "metadata": {},
- "outputs": [],
- "source": [
- "for gamma in frame.columns:\n",
- " column = frame[gamma]\n",
- " for beta in column.index:\n",
- " frac_infected = column[beta]\n",
- " print(beta, gamma, frac_infected)"
- ]
- },
- {
- "cell_type": "markdown",
- "metadata": {},
- "source": [
- "Now we can wrap that loop in a function and plot the results. For each element of the `SweepFrame`, we have `beta`, `gamma`, and `frac_infected`, and we plot `beta/gamma` on the x-axis and `frac_infected` on the y-axis."
- ]
- },
- {
- "cell_type": "code",
- "execution_count": 11,
- "metadata": {},
- "outputs": [],
- "source": [
- "def plot_sweep_frame(frame):\n",
- " \"\"\"Plot the values from a SweepFrame.\n",
- " \n",
- " For each (beta, gamma), compute the contact number,\n",
- " beta/gamma\n",
- " \n",
- " frame: SweepFrame with one row per beta, one column per gamma\n",
- " \"\"\"\n",
- " for gamma in frame.columns:\n",
- " column = frame[gamma]\n",
- " for beta in column.index:\n",
- " frac_infected = column[beta]\n",
- " plot(beta/gamma, frac_infected, 'ro')"
- ]
- },
- {
- "cell_type": "markdown",
- "metadata": {},
- "source": [
- "Here's what it looks like:"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": 12,
- "metadata": {},
- "outputs": [],
- "source": [
- "plot_sweep_frame(frame)\n",
- "\n",
- "decorate(xlabel='Contact number (beta/gamma)',\n",
- " ylabel='Fraction infected')\n",
- "\n"
- ]
- },
- {
- "cell_type": "markdown",
- "metadata": {},
- "source": [
- "It turns out that the ratio `beta/gamma`, called the \"contact number\" is sufficient to predict the total number of infections; we don't have to know `beta` and `gamma` separately.\n",
- "\n",
- "We can see that in the previous plot: when we plot the fraction infected versus the contact number, the results fall close to a curve."
- ]
- },
- {
- "cell_type": "markdown",
- "metadata": {},
- "source": [
- "### Analysis"
- ]
- },
- {
- "cell_type": "markdown",
- "metadata": {},
- "source": [
- "In the book we figured out the relationship between $c$ and $s_{\\infty}$ analytically. Now we can compute it for a range of values:"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": 13,
- "metadata": {},
- "outputs": [],
- "source": [
- "s_inf_array = linspace(0.0001, 0.9999, 101);"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": 14,
- "metadata": {},
- "outputs": [],
- "source": [
- "c_array = log(s_inf_array) / (s_inf_array - 1);"
- ]
- },
- {
- "cell_type": "markdown",
- "metadata": {},
- "source": [
- "`total_infected` is the change in $s$ from the beginning to the end."
- ]
- },
- {
- "cell_type": "code",
- "execution_count": 15,
- "metadata": {},
- "outputs": [],
- "source": [
- "frac_infected = 1 - s_inf_array\n",
- "frac_infected_series = Series(frac_infected, index=c_array);"
- ]
- },
- {
- "cell_type": "markdown",
- "metadata": {},
- "source": [
- "Now we can plot the analytic results and compare them to the simulations."
- ]
- },
- {
- "cell_type": "code",
- "execution_count": 16,
- "metadata": {},
- "outputs": [],
- "source": [
- "plot_sweep_frame(frame)\n",
- "plot(frac_infected_series, label='Analysis')\n",
- "\n",
- "decorate(xlabel='Contact number (c)',\n",
- " ylabel='Fraction infected')\n",
- "\n"
- ]
- },
- {
- "cell_type": "markdown",
- "metadata": {},
- "source": [
- "The agreement is generally good, except for values of `c` less than 1."
- ]
- },
- {
- "cell_type": "markdown",
- "metadata": {},
- "source": [
- "## Exercises"
- ]
- },
- {
- "cell_type": "markdown",
- "metadata": {},
- "source": [
- "**Exercise:** If we didn't know about contact numbers, we might have explored other possibilities, like the difference between `beta` and `gamma`, rather than their ratio.\n",
- "\n",
- "Write a version of `plot_sweep_frame`, called `plot_sweep_frame_difference`, that plots the fraction infected versus the difference `beta-gamma`.\n",
- "\n",
- "What do the results look like, and what does that imply? "
- ]
- },
- {
- "cell_type": "code",
- "execution_count": 17,
- "metadata": {},
- "outputs": [],
- "source": [
- "# Solution goes here"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": 18,
- "metadata": {},
- "outputs": [],
- "source": [
- "# Solution goes here"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": 19,
- "metadata": {},
- "outputs": [],
- "source": [
- "# Solution goes here"
- ]
- },
- {
- "cell_type": "markdown",
- "metadata": {},
- "source": [
- "**Exercise:** Suppose you run a survey at the end of the semester and find that 26% of students had the Freshman Plague at some point.\n",
- "\n",
- "What is your best estimate of `c`?\n",
- "\n",
- "Hint: if you print `frac_infected_series`, you can read off the answer. "
- ]
- },
- {
- "cell_type": "code",
- "execution_count": 20,
- "metadata": {
- "scrolled": true
- },
- "outputs": [],
- "source": [
- "# Solution goes here"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": 21,
- "metadata": {},
- "outputs": [],
- "source": [
- "# Solution goes here"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": null,
- "metadata": {},
- "outputs": [],
- "source": []
- }
- ],
- "metadata": {
- "kernelspec": {
- "display_name": "Python 3",
- "language": "python",
- "name": "python3"
- },
- "language_info": {
- "codemirror_mode": {
- "name": "ipython",
- "version": 3
- },
- "file_extension": ".py",
- "mimetype": "text/x-python",
- "name": "python",
- "nbconvert_exporter": "python",
- "pygments_lexer": "ipython3",
- "version": "3.7.9"
- }
- },
- "nbformat": 4,
- "nbformat_minor": 2
-}
+ "nbformat": 4,
+ "nbformat_minor": 0,
+ "metadata": {
+ "kernelspec": {
+ "display_name": "Python 3",
+ "language": "python",
+ "name": "python3"
+ },
+ "language_info": {
+ "codemirror_mode": {
+ "name": "ipython",
+ "version": 3
+ },
+ "file_extension": ".py",
+ "mimetype": "text/x-python",
+ "name": "python",
+ "nbconvert_exporter": "python",
+ "pygments_lexer": "ipython3",
+ "version": "3.7.9"
+ },
+ "colab": {
+ "name": "chap14.ipynb",
+ "provenance": []
+ }
+ },
+ "cells": [
+ {
+ "cell_type": "markdown",
+ "metadata": {
+ "id": "ldCqTSAtYi0P"
+ },
+ "source": [
+ "# Chapter 14"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {
+ "tags": [],
+ "id": "tfLqgaqMYi0Y"
+ },
+ "source": [
+ "*Modeling and Simulation in Python* Chun San Yip Final Exam\n",
+ "\n",
+ "Copyright 2021 Allen Downey\n",
+ "\n",
+ "License: [Creative Commons Attribution-NonCommercial-ShareAlike 4.0 International](https://creativecommons.org/licenses/by-nc-sa/4.0/)"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "metadata": {
+ "tags": [],
+ "id": "DrI2kU7dYi0g"
+ },
+ "source": [
+ "# check if the libraries we need are installed\n",
+ "\n",
+ "try:\n",
+ " import pint\n",
+ "except ImportError:\n",
+ " !pip install pint\n",
+ " import pint\n",
+ " \n",
+ "try:\n",
+ " from modsim import *\n",
+ "except ImportError:\n",
+ " !pip install modsimpy\n",
+ " from modsim import *"
+ ],
+ "execution_count": null,
+ "outputs": []
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {
+ "id": "tA6p4KUBYi0k"
+ },
+ "source": [
+ "### Code from previous chapters"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "metadata": {
+ "id": "jT2NtFYcYi0l"
+ },
+ "source": [
+ "def make_system(beta, gamma):\n",
+ " \"\"\"Make a system object for the SIR model.\n",
+ " \n",
+ " beta: contact rate in days\n",
+ " gamma: recovery rate in days\n",
+ " \n",
+ " returns: System object\n",
+ " \"\"\"\n",
+ " init = State(S=89, I=1, R=0)\n",
+ " init /= np.sum(init)\n",
+ "\n",
+ " t0 = 0\n",
+ " t_end = 7 * 14\n",
+ "\n",
+ " return System(init=init, t0=t0, t_end=t_end,\n",
+ " beta=beta, gamma=gamma)"
+ ],
+ "execution_count": 2,
+ "outputs": []
+ },
+ {
+ "cell_type": "code",
+ "metadata": {
+ "id": "HFiSQ6EfYi0n"
+ },
+ "source": [
+ "def update_func(state, t, system):\n",
+ " \"\"\"Update the SIR model.\n",
+ " \n",
+ " state: State (s, i, r)\n",
+ " t: time\n",
+ " system: System object\n",
+ " \n",
+ " returns: State (sir)\n",
+ " \"\"\"\n",
+ " s, i, r = state\n",
+ "\n",
+ " infected = system.beta * i * s \n",
+ " recovered = system.gamma * i\n",
+ " \n",
+ " s -= infected\n",
+ " i += infected - recovered\n",
+ " r += recovered\n",
+ " \n",
+ " return State(S=s, I=i, R=r)"
+ ],
+ "execution_count": 3,
+ "outputs": []
+ },
+ {
+ "cell_type": "code",
+ "metadata": {
+ "id": "zpqWezbyYi0p"
+ },
+ "source": [
+ "def run_simulation(system, update_func):\n",
+ " \"\"\"Runs a simulation of the system.\n",
+ " \n",
+ " system: System object\n",
+ " update_func: function that updates state\n",
+ " \n",
+ " returns: TimeFrame\n",
+ " \"\"\"\n",
+ " init, t0, t_end = system.init, system.t0, system.t_end\n",
+ " \n",
+ " frame = TimeFrame(columns=init.index)\n",
+ " frame.row[t0] = init\n",
+ " \n",
+ " for t in linrange(t0, t_end):\n",
+ " frame.row[t+1] = update_func(frame.row[t], t, system)\n",
+ " \n",
+ " return frame"
+ ],
+ "execution_count": 4,
+ "outputs": []
+ },
+ {
+ "cell_type": "code",
+ "metadata": {
+ "id": "Hme1Weg2Yi0q"
+ },
+ "source": [
+ "def calc_total_infected(results):\n",
+ " \"\"\"Fraction of population infected during the simulation.\n",
+ " \n",
+ " results: DataFrame with columns S, I, R\n",
+ " \n",
+ " returns: fraction of population\n",
+ " \"\"\"\n",
+ " return get_first_value(results.S) - get_last_value(results.S)"
+ ],
+ "execution_count": 5,
+ "outputs": []
+ },
+ {
+ "cell_type": "code",
+ "metadata": {
+ "id": "wzCL0guZYi0s"
+ },
+ "source": [
+ "def sweep_beta(beta_array, gamma):\n",
+ " \"\"\"Sweep a range of values for beta.\n",
+ " \n",
+ " beta_array: array of beta values\n",
+ " gamma: recovery rate\n",
+ " \n",
+ " returns: SweepSeries that maps from beta to total infected\n",
+ " \"\"\"\n",
+ " sweep = SweepSeries()\n",
+ " for beta in beta_array:\n",
+ " system = make_system(beta, gamma)\n",
+ " results = run_simulation(system, update_func)\n",
+ " sweep[system.beta] = calc_total_infected(results)\n",
+ " return sweep"
+ ],
+ "execution_count": 6,
+ "outputs": []
+ },
+ {
+ "cell_type": "code",
+ "metadata": {
+ "id": "1D5HvcS7Yi0v"
+ },
+ "source": [
+ "def sweep_parameters(beta_array, gamma_array):\n",
+ " \"\"\"Sweep a range of values for beta and gamma.\n",
+ " \n",
+ " beta_array: array of infection rates\n",
+ " gamma_array: array of recovery rates\n",
+ " \n",
+ " returns: SweepFrame with one row for each beta\n",
+ " and one column for each gamma\n",
+ " \"\"\"\n",
+ " frame = SweepFrame(columns=gamma_array)\n",
+ " for gamma in gamma_array:\n",
+ " frame[gamma] = sweep_beta(beta_array, gamma)\n",
+ " return frame"
+ ],
+ "execution_count": 7,
+ "outputs": []
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {
+ "id": "f2B1a3jiYi0x"
+ },
+ "source": [
+ "### Contact number"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {
+ "id": "PoFEkAv8Yi0y"
+ },
+ "source": [
+ "Here's the `SweepFrame` from the previous chapter, with one row for each value of `beta` and one column for each value of `gamma`."
+ ]
+ },
+ {
+ "cell_type": "code",
+ "metadata": {
+ "colab": {
+ "base_uri": "https://localhost:8080/",
+ "height": 206
+ },
+ "id": "vdxwlnoEYi0z",
+ "outputId": "50c60d69-f8bf-412f-eb0a-97660aca8f5f"
+ },
+ "source": [
+ "beta_array = [0.1, 0.2, 0.3, 0.4, 0.5, 0.6, 0.7, 0.8, 0.9, 1.0 , 1.1]\n",
+ "gamma_array = [0.2, 0.4, 0.6, 0.8]\n",
+ "frame = sweep_parameters(beta_array, gamma_array)\n",
+ "frame.head()"
+ ],
+ "execution_count": 8,
+ "outputs": [
+ {
+ "output_type": "execute_result",
+ "data": {
+ "text/html": [
+ "
\n",
+ "\n",
+ "
\n",
+ " \n",
+ "
\n",
+ "
\n",
+ "
0.2
\n",
+ "
0.4
\n",
+ "
0.6
\n",
+ "
0.8
\n",
+ "
\n",
+ " \n",
+ " \n",
+ "
\n",
+ "
0.1
\n",
+ "
0.010756
\n",
+ "
0.003642
\n",
+ "
0.002191
\n",
+ "
0.001567
\n",
+ "
\n",
+ "
\n",
+ "
0.2
\n",
+ "
0.118984
\n",
+ "
0.010763
\n",
+ "
0.005447
\n",
+ "
0.003644
\n",
+ "
\n",
+ "
\n",
+ "
0.3
\n",
+ "
0.589095
\n",
+ "
0.030185
\n",
+ "
0.010771
\n",
+ "
0.006526
\n",
+ "
\n",
+ "
\n",
+ "
0.4
\n",
+ "
0.801339
\n",
+ "
0.131563
\n",
+ "
0.020917
\n",
+ "
0.010780
\n",
+ "
\n",
+ "
\n",
+ "
0.5
\n",
+ "
0.896577
\n",
+ "
0.396409
\n",
+ "
0.046140
\n",
+ "
0.017640
\n",
+ "
\n",
+ " \n",
+ "
\n",
+ "
"
+ ],
+ "text/plain": [
+ " 0.2 0.4 0.6 0.8\n",
+ "0.1 0.010756 0.003642 0.002191 0.001567\n",
+ "0.2 0.118984 0.010763 0.005447 0.003644\n",
+ "0.3 0.589095 0.030185 0.010771 0.006526\n",
+ "0.4 0.801339 0.131563 0.020917 0.010780\n",
+ "0.5 0.896577 0.396409 0.046140 0.017640"
+ ]
+ },
+ "metadata": {
+ "tags": []
+ },
+ "execution_count": 8
+ }
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {
+ "id": "-QXyeAb2Yi0z"
+ },
+ "source": [
+ ""
+ ]
+ },
+ {
+ "cell_type": "code",
+ "metadata": {
+ "colab": {
+ "base_uri": "https://localhost:8080/"
+ },
+ "id": "vgJh_tfOYi00",
+ "outputId": "229a8d16-0140-41c6-bd3c-ea04b915545b"
+ },
+ "source": [
+ "frame.shape"
+ ],
+ "execution_count": 9,
+ "outputs": [
+ {
+ "output_type": "execute_result",
+ "data": {
+ "text/plain": [
+ "(11, 4)"
+ ]
+ },
+ "metadata": {
+ "tags": []
+ },
+ "execution_count": 9
+ }
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {
+ "id": "uFvTM1UeYi00"
+ },
+ "source": [
+ "The following loop shows how we can loop through the columns and rows of the `SweepFrame`. With 11 rows and 4 columns, there are 44 elements."
+ ]
+ },
+ {
+ "cell_type": "code",
+ "metadata": {
+ "colab": {
+ "base_uri": "https://localhost:8080/"
+ },
+ "id": "r7rub0N4Yi00",
+ "outputId": "c4ddb5f9-2d2c-46cb-ea22-8a500538c63e"
+ },
+ "source": [
+ "for gamma in frame.columns:\n",
+ " column = frame[gamma]\n",
+ " for beta in column.index:\n",
+ " frac_infected = column[beta]\n",
+ " print(beta, gamma, frac_infected)"
+ ],
+ "execution_count": 10,
+ "outputs": [
+ {
+ "output_type": "stream",
+ "text": [
+ "0.1 0.2 0.010756340768063644\n",
+ "0.2 0.2 0.11898421353185373\n",
+ "0.3 0.2 0.5890954199973404\n",
+ "0.4 0.2 0.8013385277185551\n",
+ "0.5 0.2 0.8965769637207062\n",
+ "0.6 0.2 0.942929291399791\n",
+ "0.7 0.2 0.966299311298026\n",
+ "0.8 0.2 0.9781518959989762\n",
+ "0.9 0.2 0.9840568957948106\n",
+ "1.0 0.2 0.9868823507202488\n",
+ "1.1 0.2 0.988148177093735\n",
+ "0.1 0.4 0.0036416926514175607\n",
+ "0.2 0.4 0.010763463373360094\n",
+ "0.3 0.4 0.030184952469116566\n",
+ "0.4 0.4 0.131562924303259\n",
+ "0.5 0.4 0.3964094037932606\n",
+ "0.6 0.4 0.5979016626615987\n",
+ "0.7 0.4 0.7284704154876106\n",
+ "0.8 0.4 0.8144604459153759\n",
+ "0.9 0.4 0.8722697237137128\n",
+ "1.0 0.4 0.9116692168795855\n",
+ "1.1 0.4 0.9386802509510287\n",
+ "0.1 0.6 0.002190722188881611\n",
+ "0.2 0.6 0.005446688837466351\n",
+ "0.3 0.6 0.010771139974975585\n",
+ "0.4 0.6 0.020916599304195316\n",
+ "0.5 0.6 0.04614035896610047\n",
+ "0.6 0.6 0.13288938996079536\n",
+ "0.7 0.6 0.3118432512847451\n",
+ "0.8 0.6 0.47832565854255393\n",
+ "0.9 0.6 0.605687582114665\n",
+ "1.0 0.6 0.7014254793376209\n",
+ "1.1 0.6 0.7738176405451065\n",
+ "0.1 0.8 0.0015665254038139675\n",
+ "0.2 0.8 0.003643953969662994\n",
+ "0.3 0.8 0.006526163529085194\n",
+ "0.4 0.8 0.010779807499500693\n",
+ "0.5 0.8 0.017639902596349066\n",
+ "0.6 0.8 0.030291868201986594\n",
+ "0.7 0.8 0.05882382948158804\n",
+ "0.8 0.8 0.13358889291095588\n",
+ "0.9 0.8 0.2668895539427739\n",
+ "1.0 0.8 0.40375121210421994\n",
+ "1.1 0.8 0.519583469821867\n"
+ ],
+ "name": "stdout"
+ }
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {
+ "id": "RhFgMlb5Yi01"
+ },
+ "source": [
+ "Now we can wrap that loop in a function and plot the results. For each element of the `SweepFrame`, we have `beta`, `gamma`, and `frac_infected`, and we plot `beta/gamma` on the x-axis and `frac_infected` on the y-axis."
+ ]
+ },
+ {
+ "cell_type": "code",
+ "metadata": {
+ "id": "MLOiE2bBYi01"
+ },
+ "source": [
+ "def plot_sweep_frame(frame):\n",
+ " \"\"\"Plot the values from a SweepFrame.\n",
+ " \n",
+ " For each (beta, gamma), compute the contact number,\n",
+ " beta/gamma\n",
+ " \n",
+ " frame: SweepFrame with one row per beta, one column per gamma\n",
+ " \"\"\"\n",
+ " for gamma in frame.columns:\n",
+ " column = frame[gamma]\n",
+ " for beta in column.index:\n",
+ " frac_infected = column[beta]\n",
+ " plot(beta/gamma, frac_infected, 'ro')"
+ ],
+ "execution_count": 11,
+ "outputs": []
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {
+ "id": "TLrzCoKmYi02"
+ },
+ "source": [
+ "Here's what it looks like:"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "metadata": {
+ "colab": {
+ "base_uri": "https://localhost:8080/",
+ "height": 297
+ },
+ "id": "__rnPcYFYi02",
+ "outputId": "7f00d532-8d90-4c84-f545-e83cb33ed8af"
+ },
+ "source": [
+ "plot_sweep_frame(frame)\n",
+ "\n",
+ "decorate(xlabel='Contact number (beta/gamma)',\n",
+ " ylabel='Fraction infected')\n",
+ "\n"
+ ],
+ "execution_count": 12,
+ "outputs": [
+ {
+ "output_type": "display_data",
+ "data": {
+ "image/png": "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\n",
+ "text/plain": [
+ ""
+ ]
+ },
+ "metadata": {
+ "tags": [],
+ "needs_background": "light"
+ }
+ }
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {
+ "id": "WLoGTh-hYi02"
+ },
+ "source": [
+ "It turns out that the ratio `beta/gamma`, called the \"contact number\" is sufficient to predict the total number of infections; we don't have to know `beta` and `gamma` separately.\n",
+ "\n",
+ "We can see that in the previous plot: when we plot the fraction infected versus the contact number, the results fall close to a curve."
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {
+ "id": "TphjxSEYYi02"
+ },
+ "source": [
+ "### Analysis"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {
+ "id": "xtRlpGlLYi03"
+ },
+ "source": [
+ "In the book we figured out the relationship between $c$ and $s_{\\infty}$ analytically. Now we can compute it for a range of values:"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "metadata": {
+ "id": "Hwj_h57wYi03"
+ },
+ "source": [
+ "s_inf_array = linspace(0.0001, 0.9999, 101);"
+ ],
+ "execution_count": 13,
+ "outputs": []
+ },
+ {
+ "cell_type": "code",
+ "metadata": {
+ "id": "1A7FhZgaYi03"
+ },
+ "source": [
+ "c_array = log(s_inf_array) / (s_inf_array - 1);"
+ ],
+ "execution_count": 14,
+ "outputs": []
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {
+ "id": "J62MuR9QYi04"
+ },
+ "source": [
+ "`total_infected` is the change in $s$ from the beginning to the end."
+ ]
+ },
+ {
+ "cell_type": "code",
+ "metadata": {
+ "id": "qJUEwS0yYi04"
+ },
+ "source": [
+ "frac_infected = 1 - s_inf_array\n",
+ "frac_infected_series = Series(frac_infected, index=c_array);"
+ ],
+ "execution_count": 15,
+ "outputs": []
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {
+ "id": "yTi29MB-Yi05"
+ },
+ "source": [
+ "Now we can plot the analytic results and compare them to the simulations."
+ ]
+ },
+ {
+ "cell_type": "code",
+ "metadata": {
+ "colab": {
+ "base_uri": "https://localhost:8080/",
+ "height": 297
+ },
+ "id": "Lo760tC_Yi05",
+ "outputId": "bf39504d-a58e-4dcf-e698-4f97f9c794ba"
+ },
+ "source": [
+ "plot_sweep_frame(frame)\n",
+ "plot(frac_infected_series, label='Analysis')\n",
+ "\n",
+ "decorate(xlabel='Contact number (c)',\n",
+ " ylabel='Fraction infected')\n",
+ "\n"
+ ],
+ "execution_count": 16,
+ "outputs": [
+ {
+ "output_type": "display_data",
+ "data": {
+ "image/png": "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\n",
+ "text/plain": [
+ ""
+ ]
+ },
+ "metadata": {
+ "tags": [],
+ "needs_background": "light"
+ }
+ }
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {
+ "id": "uw-lv1lbYi05"
+ },
+ "source": [
+ "The agreement is generally good, except for values of `c` less than 1."
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {
+ "id": "aYp7D_zZYi05"
+ },
+ "source": [
+ "## Exercises"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {
+ "id": "aOoOytyUYi06"
+ },
+ "source": [
+ "**Exercise:** If we didn't know about contact numbers, we might have explored other possibilities, like the difference between `beta` and `gamma`, rather than their ratio.\n",
+ "\n",
+ "Write a version of `plot_sweep_frame`, called `plot_sweep_frame_difference`, that plots the fraction infected versus the difference `beta-gamma`.\n",
+ "\n",
+ "What do the results look like, and what does that imply? "
+ ]
+ },
+ {
+ "cell_type": "code",
+ "metadata": {
+ "id": "sNpeVH71Yi06"
+ },
+ "source": [
+ "def plot_sweep_frame_difference(frame):\n",
+ " \"\"\"Plot the values from a SweepFrame.\n",
+ " \n",
+ " For each (beta, gamma), compute the contact number,\n",
+ " beta/gamma\n",
+ " \n",
+ " frame: SweepFrame with one row per beta, one column per gamma\n",
+ " \"\"\"\n",
+ " for gamma in frame.columns:\n",
+ " column = frame[gamma]\n",
+ " for beta in column.index:\n",
+ " frac_infected = column[beta]\n",
+ " plot(beta-gamma, frac_infected, 'ro')"
+ ],
+ "execution_count": 17,
+ "outputs": []
+ },
+ {
+ "cell_type": "code",
+ "metadata": {
+ "colab": {
+ "base_uri": "https://localhost:8080/",
+ "height": 297
+ },
+ "id": "cBAe2QP-Yi07",
+ "outputId": "b00a9fec-5be7-462b-b622-cca30cd00d47"
+ },
+ "source": [
+ "plot_sweep_frame_difference(frame)\n",
+ "\n",
+ "decorate(xlabel='Difference (beta-gamma)',\n",
+ " ylabel='Fraction infected')"
+ ],
+ "execution_count": 18,
+ "outputs": [
+ {
+ "output_type": "display_data",
+ "data": {
+ "image/png": "iVBORw0KGgoAAAANSUhEUgAAAagAAAEYCAYAAAAJeGK1AAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAALEgAACxIB0t1+/AAAADh0RVh0U29mdHdhcmUAbWF0cGxvdGxpYiB2ZXJzaW9uMy4yLjIsIGh0dHA6Ly9tYXRwbG90bGliLm9yZy+WH4yJAAAgAElEQVR4nO3de3wcdb3/8VdSJFwKLZBCgVouBT8HOAgCRUDaAhXEcxARK4i1Kj8KqVxUQCqIIMhFKXAUsIf+QAEtFREoKnJTC7SlR9TIVQ5+kFJaW1vSAqFcg7Q5f3xn08mySWaTmc1s9v18PPJI9juzM59N0/3s9zuf+X7r2tvbERERyZv6/g5ARESkFCUoERHJJSUoERHJJSUoERHJpfX6O4AsmVkDMBpYDqzp53BEROS9BgFbA39297b4hgGdoAjJaX5/ByEiIj0aAzwcbxjoCWo5wKxZsxg+fHh/xyIiIkVWrFjBxIkTIXq/jhvoCWoNwPDhwxkxYkR/xyIiIl17z2UYFUmIiEguKUGJiEguVXSIz8w+C5wC7AFs4u51Pey/A3AtcCDwBnA9cJ67a34mEZEBrtLXoF4B/hvYEPhxdzua2SDgN8ACYDiwLXAf0ApckW2YIiLS3yo6xOfu97v7LcDzCXYfA+wETHX3193dgWnAyVnGKCIi+ZDnKr49gOfcvTXW1gzsYGabuvvqfopLRKTqtMydx5KZs2hb9RINjVswctJEthw3NjfHKyXPCWpTwnBeXGtsmxKUiAxIWSSThdNnsLYtTNTQtnIVC6fPAOjVcdM+XlfyXMW3GhhS1DY0tk1EpN+1zJ1H8+QmFhw1gebJTbTMndfn4y2cPoO2laugvb3jzb8vx10yc1ZHMilY29bGkpmzcnG8ruQ5QT0B7GRm8SS1N7BIw3sikgfVkEwA2la9VFZ7pY/XlUqXmQ8C3gesHz3eINr0jruvLdp9PrAQuMzMziRU8U0llJ2LiPRKmsNn3SWT3h4zizf/hsYtQhIt0Z6H43Wl0j2oScBbwP3R47eir7FmNtLMXjezMQDuvgY4AtgBaCFMIngLKjEXkV5Ku8eTVTIppz2JkZMmUt/Q0KmtvqGBkZMm5uJ4XaloD8rdbwJu6maXwUX7LwI+lmFIIlJD0u7xZNGTGDlpYqcCBOj7m3/htaXVc0z7eF3JcxWfiEiq0u7xVEMyiR83zQSS9vFKUYISkZqRdo+nWpJJtVKCEpHcSvt+oKx6PEom2VCCEpFcyuJm0EpdO+mrSszSUA2UoEQkl7Io4Yb893gqNUtDNcjzjboiUsMqdTNo3lRqloZqoAQlIrmUxf1A1aBWE3MpSlAikkuVuhk0b2o1MZeiBCUiubTluLGMOmUKDcMaoa6OhmGNjDplyoC/DlOribkUFUmISG7lvaAB0q+4q5ZKw0pQghIR6aWsKu6qITFXgob4RER6SRV32VIPSkRSU2s3mKriLlvqQYlIKrJYvC/vVHGXLSUoEUlFLQ53qeIuWxriE5FU1OJwlyrusqUEJSKpqNQy4HmjirvsaIhPRFJRLcNdLXPn0Ty5iQVHTaB5ctOAvkZW7dSDEpFUVMNwl2YKry5KUCKSmrwPd2W1hIdkQ0N8IlIzarGQo5opQYlIzdB9S9VFCUpEaka1FHJIoGtQIlIzqqGQQ9ZRghKRmpL3Qg5ZR0N8IiKSS0pQIiKSS0pQIiKSS0pQIiKSSyqSEJHcqrUFEKUzJSgRySXNmyca4hORXKrFBRCls4r2oMysHrgYOAHYGHgYaHL3xV3sPxE4G9gOWA3cDnzD3dtK7S8iyeV9+Ezz5kmle1BTgeOAscBwYAlwV5S4OjGzPYCfAhcCQ4CPAB8DvlWxaEUGqMLwWdvKVdDe3jF8lqe1kTRvnlQ6QU0BpnnwOiFhGXBgiX13BF5299vdvT3qZd0N7Fm5cEUGpmoYPtO8eVKxIT4zG0IYqmsutLl7q5k9R0g6xR/d7gcWmdlngduA7YFPAN+rSMAiA1g1DJ9p3jyp5DWoTaPvrUXtrbFtHdz9TTP7MTADuBkYBPyEMOwnIn3Q0LhFGN4r0Z4nmjevtlVyiG919H1IUfvQ2LYOZvZF4LuEXtP6wDZAIyFJiUgf1PLwWcvceTRPbmLBURNontyUq+tu0lnFelDu/qqZLQb2IRrmi4b9RgGPl3jKPsCD7j4/erzczK4D8jNILlKlanX4TPdWVZdK36g7AzjLzB4AlgGXAc8Sys2LzQeuNbP9gUeAYcBJwF8qFKvIgFaLw2fdFYfU2u+iGnSZoMzsc0kP4u4/S7jrNMIQ38Osuw/qSHdfa2ZjgHuBXd19ibv/wsy2Bm4EtgXeBB4Cvpw0LhGRuGooDpF1uutB3Vz0uB2oK9EGkChBufta4Jzoq3jbfGBwUdtVwFVJji0i0pNqKQ6RoMsiCXevL3wBhwB/JRQsbBZ9fQJ4EhhfiUBFRPqqlotDqlHSa1A/AM5w9zmxtrvN7G3gauCDqUcmIpKyWi0OqVZJE5QRihqKLQN2Ti8cEZFs1WJxSLVKeh/Us8DX43PmmVkd8PVom4iISKqS9qC+BtwFjDezP0Vt+xJKvz+RRWAiIlLbEiUod3/QzHYGTgF2iZpvBq51939mFZyIVJe8L+Eh1SXxjbruvhwtdSEiXdAsDZK2xAnKzAxoAnYCTnL3FWZ2JLDY3Z/IKkARqQ6apUHSlqhIIprl4XFgD8KigRtFm3YFzs8mNBGpJpqlQdKWtIrvUuA77j4eeCfW/gChWEJEapxWwJW0JU1QewC3lmh/kVDJJyI1LotZGrQ0Rm1Leg3qbd67jhPAB4CV6YUjItUq7VkaVHQhSRPUPcA50fLrAO1m1ghcDPw6k8hEpOqkOUuDii4k6RDfVGA34AVgA+CXwCJgQ1R6LiIZUNGFJEpQ7t4C7E2o2Pv/wALgq8Bod38lu/BEpFap6EKSlpmPBd5195vc/VR3P9ndbwDWRNtERFKlpTEk6TWoB4GtgZai9iHRtkFpBiUioqUxJGmCqmPd6rlxQwhLsYuIpE5LY9S2bhOUmd0Q/dgOXG1mb8U2DyJcl/pLRrGJiEgN66kH9f7oex2wDZ1nkXgHeAi4Mv2wRESk1nWboNz9UAAzuxH4qruvrkhUIiJS85LeB/U1SiQzM9vczDZNNyQREZHkCepnQKnazuOAWemFIyIiEiRNUB8mlJMXewjYL7VoREREIkkT1MbAuyXa1wCD0wtHREQkSJqgngaOLtE+AfhbeuGIiIgESW/UvRyYaWZbAb+L2g4jLAH/pQziEhGRGpcoQbn7rWa2EXABcFrUvBQ42d1vySg2ERGpYUl7ULj7jcCNZjYseqyFCkVEJDNJr0EBYGYfBMYCb0SPG8ysrGOIiIgkkagHZWabA7MJyakd2Bl4HpgOrAbOyCpAEakeLXPnafZxSU3SIb4rCCXl2xMq+gpup4y5+KLe1sXACYTS9YeBJndf3MX+G0b7HwtsBiwHTnP3e5OeU0Qqo2XuPBZOn9GxTHvbylUsnD4DQElKeiXp8NxhwFR3X1LU/iwwsozzTSXMPjEWGA4sAe4qNUxoZnXAnYSl5se4+8bAQcAzZZxPRLrQMncezZObWHDUBJonN9Eyd16fjrdk5qyO5FSwtq2NJTM12Yz0TtIe1OZAqaXdNwHWlnG+KcBl7u4AZjYVeBE4ECj+33EoMA54v7uvAnD3pWWcS0S6kEVvp23VS2W1i/QkaQ/qUeDwEu1fAP6Y5ABmNgTYDmgutLl7K/AcsGeJpxwCLAK+ZWYrzOwFM7vGzDRzhdSkNHs8WfR2Ghq3KKtdpCdJE9SFwOVmdilhocJJZvYL4NRoWxKFWc9bi9pbY9viGoFdop93JAwL7o/Wn5IaVOjxtK1cBe3tHT2e3iapLHo7IydNpL6hoVNbfUMDIyeVmmdapGeJEpS7/w74BCFBrAW+QbiG9DF3X5DwXIW1pIYUtQ+NbYt7jVCYcba7vxld/7oMOCrh+UQGjLR7PFn0drYcN5ZRp0yhYVgj1NXRMKyRUadMUYGE9FqX16DM7HzgCnd/08xGAg+6+wO9PZG7v2pmi4F9iIb5omG/UcDjJZ7yaPS9PdbWXmI/kQEv7R7PyEkTO12DgnR6O1uOG6uEJKnprgd1PutmKl8EDEvhfDOAs8zsA2a2MaFH9Cyh3LzYnYQCikuiG4K3IVQB3p5CHCJVJe0ej3o7Ug26q+JbDhxtZncBdcBwMyu5v7v/M+H5phGG+B5m3X1QR7r7WjMbA9wL7OruS9z9dTM7DPgh8BLhWtVtwLkJzyUyYGTR41FvR/KuuwQ1jZAcphOG1h4rsU9dtG1QkpO5+1rgnOireNt8itaWcvengYOTHFtkICskEs3SILWkywTl7teY2e2Ea0TzgE8DL1cqMBHpTD0eqTXd3qjr7suB5WZ2IXC/u79ZmbBERKTWJV0PKum9TiIiIqlIOpv5RoR7nz4KbEVR9Z+775h+aCIiUsuSzsV3LXAEcCvwT3Q/koiIZCxpgjoCONbdf59lMCIiIgVJ5+J7h7A0hoiISEUk7UFNB5qAMzOMRUSqnFbUlTQlTVDbAZ82s0OAJwg9qg7uflLagYlIddGKupK2pAlqJ0JigpCs4lQwISLdzriuBCW9kfQ+KE03JCLd0oq6krakRRIiIt3SirqStu7Wg7oOOCOaVfy67g6ia1AiktUaU1K7uhvi2zm2fedu9tM1KBHRjOuSuu5mMz+41M8iIl3RjOuSJl2DEhGRXEpaZi4iA4xuqpW8U4ISqUG6qVaqgYb4RGpQdzfViuSFEpRIDdJNtVINlKBEapBuqpVqkHRF3WHAFaxbUbcuvt3dB6UfmohkRTfVSjVIWiTxI2B34Cq0oq5I1dNNtVINkiaog4DD3P2PGcYiIhWkm2ol75Jeg3oFeC3LQEREROKSJqhLgHPNTPdNiYhIRSRNOMcAo4GlZvY33rui7mFpByYiIrUtaYJaGn2JiIhURNIVdY/POhAREZG4sq4pmdn7gV2jh0+7u3pVIiKSiaQ36m4EXAt8nnU36a41s5uBL7v7WxnFJyIiNSppD+pywr1QnwLmRm0HAVdH205NOzARyZaW25C8S5qgJgBfcPf7Y22/MrM24CckTFBmVg9cDJwAbAw8DDS5++Ienrc38AiwwN0PShiziHRBy21INUh6H9QQYFGJ9kXApmWcbypwHDAWGA4sAe6KEldJZrYBcBPrem4iNall7jyaJzex4KgJNE9uomXuvF4fS8ttSDVImqD+CpxUor0p2pbUFGCaB68TEpYBB3bznEuAOYTelkhNKvR42laugvb2jh5Pb5OUltuQapB0iO98wpDegUDhf8RYYC/gyCQHMLMhwHZAc6HN3VvN7Dlgz9hx488ZCxwBfIiQzERqUnc9nt4MyTU0bhGSXYl2kbxI1INy93uAvYFngfHR17PA3u5+X8JzFYYCW4vaWykxTGhmg4EbgBPd/c2E5xAZkNLu8YycNJH6hoZObVpuQ/Im8X1Q7v4k8IU+nGt19H1IUfvQ2La4K4B73L33A+0iA0TaPR4ttyHVoGKTv7r7q2a2GNiHaJgvGvYbBTxe4imHA0PN7HPR442A95nZKmC0u5cq2hAZkLJYYFDLbUjedZmgzOwdYFt3X2lm/6KbRQrdff2E55sBnGVmDwDLgMsIQ4WlCiD2K4rvDGB/4DPA8oTnExkQ1OORWtRdD+pE1g29nUg6q+hOIwzxPcy6+6COdPe1ZjYGuBfY1d2XuPuK+BPNbDXQpumVpFapxyO1pq69feCu3m5m2wOL5syZw4gRI/o7HBERKbJ06VLGjx8PsIO7vxDflqiKz8yeN7P3XI01s6Fm9nwqUYqIiMQkvVF3e2BQifYGQF0TERFJXbdVfNGNsgX7m9krsceDgMOAf2QRmIiI1LaeyswfIhRHtAN3ltj+OnByyjGJiIj0mKDeT1j/aQlhWqOVsW3vAKvcfeBWWYiISL/pNkG5+7Lox6TXqkRERFKRtIrvbDM7oUT7CWamSVxFRCR1SXtGJwFeov0ZwpIbIiIiqUo6F982QKkZHP4JbJteOCLSFS3RLrUmaYJqAXYHXihq/yCgFc5EMqYl2qUWJR3imw1838w+VGgws72AK4HbswhMRNbREu1Si5L2oM4lrHrbHLtZdzPCZK/fzCIwEVlHS7RLLUqUoNz9DeAgMxtPuB8K4C/u/kBmkYlIBy3RLrWorAUL3X0OMCejWESkC1ksWCiSd4kTlJltRljldjug0wKF7v6dlOMSkRgtWCi1KFGCMrPRwH2EaY82JUx5tCXwJmF1WyUokYxpwUKpNUmr+C4H7gAagbeAjxB6Uo8B38gmNBERqWVJE9SewPfdfS2wFlg/Wnr9G8ClWQUnIiK1K+k1qDXAv6KfWwiznP8NWEXoSYlIxjSThNSapAnqSUIv6jngEeCbZlYPnEjpOfpEJEWaSUJqUdIhvkuAd6OfzyMUSNwLjAG+kkFcIhKjmSSkFiXtQc0nGuJz9xeA3cxsc+AVLVgokj3NJCG1qMcEZWbrAW8AewBPF9rd/eUM4xKRGM0kIbWoxyE+d38X+EeSfUUkGyMnTaS+oaFTm2aSkIEuadK5ErjAzDbMMhgRKW3LcWMZdcoUGoY1Ql0dDcMaGXXKFBVIyICW9BrUJ4F9gWVm9gxhyK+Dux+WdmAi0plmkpBakzRBLaX0iroiIiKZ6DZBmdkxwC/d/fgKxSMiIgL0fA3qFmBo4YGZPWNmI7MNSUREpOcEVVf0eARlriElIiLSGyodFxGRXOopQbVHX8VtIiIimeppuK4OuM3M3okebwD81Mzeiu+UtMw8mmD2YuAEYGPgYaDJ3ReX2Hc/wrx/+wAbEiaqvdjdZyc5l4iIVLeeelA/ARYBy6KvmwmJYlnRV1JTgeOAscBwYAlwV5S4im0O3ArsRijUuAT4mZntW8b5RESkSnXbg8qgvHwKcJm7O4CZTQVeBA4E5hWd+56i595hZudE+/4p5bhERCRnKlYkYWZDCIsbNhfa3L2V0CPbM8HztwF2AZ7IKkYREcmPSlbxbRp9by1qb41tK8nMBgOzgbvcfU4GsYmISM5UMkGtjr4PKWofGtv2HlHP6z5gOfCFbEITEZG8qViCcvdXgcWEqjygI/mMAh4v9Rwz2wKYQ1ju4zPu/k6p/UREZOCp9KwQM4CzzOwBQvXfZcCzhHLzTsxsOPB7QkHEZHdfW8lARUSkf1U6QU0jDPE9zLr7oI5097VmNga4F9jV3ZcATYQS8x2AY8yscIyb3X1KheMWEZEKq2iCinpB50RfxdvmA4Njjy8ELqxcdCIikieai09ERHJJCUpERHJJCUpERHJJCUpERHJJiw+KZOCp8y5g9ZNPdTze9IO7s/tFF/RfQCJVSD0okZQVJyeA1U8+xVPnXdA/AYlUKSUokZQVJ6ee2kWkNCUoERHJJSUoERHJJSUokbQNGlReu4iUpAQlkra1Xcxr3FW7iJSkBCWSsobGLcpqF5HSlKBEUjZy0kTqGxo6tdU3NDBy0sR+ikikOulGXZGUbTluLABLZs6ibdVLNDRuwchJEzvaRSQZJSiRDGw5bqwSkkgfaYhPRERySQlKRERySQlKRERySQlKRERySUUSIkDL3HmquhPJGSUoqXktc+excPoM1ra1AdC2chULp88AUJIS6Uca4pOat2TmrI7kVLC2rY0lM2f1U0QiAkpQIrSteqmsdhGpDCUoqXnrDR5cVruIVIYSlNS8dtrLaheRylCRhFSdtCvu1rz+RlntIlIZSlBSVbKouFtv8GDefe21ku0i0n80xCdVJYuKOw3xieSTelCSqbSH49pWriqrPQkN8YnkkxKUdJJmQmmZO4/nrp5O+7vvAiGJPHf1dKAPN8DW15deOr2+94MBDY1blExwWgFXpH9piK+KtcydR/PkJhYcNYHmyU20zJ3X5+M9d/X08Gbd3t6RUHp73EXX39CRnAra332XRdff0PsgSyWn7toTGLrP3mW1i0hlVLQHZWb1wMXACcDGwMNAk7sv7mL/DwHTgT2BVcAV7n51JWLNYm62vPdOuksovTlmqcKD7toTyaAH1dr8l7LaRaQyKt2DmgocB4wFhgNLgLuixNWJmW0K3AfcD2wOHANcYGYTsg6yUCkW70ksnD6jTz2UtI+ZRe8kk4SStgx6UJpJQiSfKp2gpgDTPHidkLAMOLDEvkcDa4CL3P1td38EuB44Oesgs6gUS/uYVZFMMtAwrLGs9kTH7OJak65BifSviiUoMxsCbAc0F9rcvRV4jjCEV2wP4DF3j380bu5i31Rl8Ym6Gj6lD9qk9H0/XbX3h5GTJlLf0NCprb6hgZGTJubqmCLSd5XsQW0afW8tam+NbSveP+m+qcriE3Xax8wimex44gkwaFDRAQeF9l7Iorez5bixjDplSjhGXR0NwxoZdcqUPl0fzOKYItJ3lSySWB19H1LUPjS2rXj/rRLum6qRkyZ2mq0A0vmUnuYxdzzxBP5+1Q9hzZp1jX1IJrCuuCKtQo4sfo+FONNOHlkcU0T6pmIJyt1fNbPFwD5Ew3zRsN8o4PEST3kCOMbM6mPDfHt3sW+q0n6jzuKYWcRYOG5ab9RZxSgitaGuvb1y07mY2dnAicDHgWXAlcABwJ5F15oKVXx/B34ITCNck7oXmOLutyU83/bAojlz5jBixIi0XoaIiKRk6dKljB8/HmAHd38hvq3SVXzTgF8Q7n9qAXYAjnT3tWY2xsxeN7ORAO6+Gjgc+A/Ctac7gAuTJicREaluFb1RN+olnRN9FW+bDwwuansM2L8y0YmISJ5oqiMREcklJSgREcmlgT6b+SCAFStW9HccIiJSQuz9eVDxtoGeoLYGmDhRMwKIiOTc1sDCeMNAT1B/BsYAywnz+omISL4MIiSnPxdvqOh9UCIiIkmpSEJERHJJCUpERHJJCUpERHJJCUpERHJJCUpERHJJCUpERHJJCUpERHJJCUpERHJJCUpERHJpoE91lAtm9jXgDKAReAw42d2f6Gb/QcDZwAnAVsBLwLfd/ca8xBh73kjgKeAVd98+q/jKjdHMPgBcSlhPbFPgH8AP3P26lGOqBy4m/FttTFiMs8ndF3ex/4eA6cCewCrgCne/Os2Y+hKjme0HnAfsA2wIPAdc7O6z8xJj0fP2Bh4BFrj7QXmK0cw2jPY/FtiMMOXaae5+b45inEh4r9kOWA3cDnzD3duyirEc6kFlzMw+C5wPHANsDvwWuM/MNunmaf8NfAo4krCI417A/+QsRsysDriR8AaRqV7EuBnwIDCakKCmAJeb2adTDm0qcBwwFhgOLAHuit4oil/DpsB9wP3RazgGuMDMJqQcU69jjOK6FdgNGApcAvzMzPbNUYwAmNkGwE3A3IxjKyjn37oOuJPwexzj7hsDBwHP5CjGPYCfAhcCQ4CPAB8DvpVxjImpB5W9KcD17v4IgJldFLV9ivDH0YmZGXAisLu7Px01r4q+chFjzKnAa8AvgQsyjK/sGN39j8AfY03zzOx3wDjgjpTjuszdPYprKvAicCAwr2jfowmTFl8UrS79iJldD5xM+OSalcQxuvs9Rc+9w8zOifb9Ux5ijLkEmAO0Et78s1ZOjIcS/tbe7+6rANx9ac5i3BF42d0Lf3uLzexuQu8+F9SDyt4eQHPhQfTG9Chd/xEcDLwOfNLM/mFmy8xsppltmaMYMbOdCZ/WpmQYV1zZMcaZ2cbAh4Eehy2TMrMhhKGReFythGGxUnHtATwWxV7Q3MW+/RVj8fO3AXYhxd9bGjGa2VjgCOCbWcXVxxgPARYB3zKzFWb2gpldY2aDcxTj/cAiM/usmQ0ys1HAJ4BMh3PLoR5UL5nZTcAXu9nlDnefQBheai3a1hq1l9IIbEL4g9qd8G/0U2Amofvd7zFG18h+Apzj7itCp693Mvw9xs+xHjALeIHue4TlKpw7aVy9fg19UG6MHaI309nAXe4+J4PYCsqKMYrrBuD/ufubffn7K0O5v8dGQmL/LaGn0kj4XV4JNOUhxuh392NgBnAzYdmLn5Du/5E+UQ+q904FhnXzdXy032rC+G7c0Ki9lNei7+e6e2s0PPBt4NCoF5CHGM8CVrn7zWXGU8kYATCz9QnXVLYEjnD3f6UQc0Hh3Enj6tVr6KNyYwQ6Po3fR7iw/4VsQutQboxXAPe4e1dDf1koN8bXCMO5Z7v7m+6+BLgMOCq7EMuL0cy+CHyX0GtaH9iGkEh/kmGMZVEPqpfc/XXCUFxPniBURN0OHVU2HyK8aZbyaPQ9vlBXe9Hj/o7xcGAvMytcF2sANooeH13OG0eGMRaqqGYDGwCHRedKjbu/amaLo7iao3MOAUYBj3fxGo4xs/rYMN/eXezbXzFiZlsQhn/+Dkxy93eziq+XMR4ODDWzz0WPNwLeF/39jXb3RTmIsav/x5npRYz7AA+6+/zo8XIzu44w2pALSlDZmwFMN7PZhDeoqUChwqeUBdF+F5nZiYR/o28D97n7GzmJ8TOEpBR/fAahpHtlHmKMqvvuAt4G/sPd38owrrPM7AFgGeFT8rOE8t5is6Pt55rZNMI1qRPJ/jpe4hjNbDjwe0JBxOSi62W5iBHYj87vXYW/vc8Qenx5iPFO4HvAJWZ2LrAF4W82y2KYcmOcD1xrZvsTKnGHAScBf8k4xsSUoDLm7j83s60JlWOF+3cOd/fXoOM+ov8FPu7u8919rZkdQbhXZjnwBmGo5cwcxdgpCZnZK8CaLKuUyo2RUDE3DngLWBm7TjHf3T+eYmjTCEMqD7PuvpMjo3/HMcC9wK7uvsTdV5vZ4YTbCL5JqMy80N1vSzGePsVIuD6yG7ADobdXOMbN7p5lIi3n97gi/kQzWw20VaBKrpwYXzezw4AfEu5jbAVuA87NUYy/iP5P3QhsC7wJPAR8OeMYE9OS7yIikksqkhARkVxSghIRkVxSghIRkVxSghIRkVxSghIRkVxSghIRkVxSgpJ+YWY3mdnvi9pOM7OlZrbWzC6I2j5jZgvNbE00b9+AZWb1ZvZYfPkNM2s3s8/3Z1y1wsw2iSZ23aO/Y5FAN+pKaoomfn0XeBX4G/BrYHrRTBhfJfYBKZo1++n+oWIAAAfhSURBVAfAVwgzLrwWTUp7A+Fmxx+SbEqkanY8YXaMNJcDwcxGEBZsPNjdH0rz2AOJu79mZv9FmND1o/0dj6gHJembD2xNmPb/YMK8XqcCj5rZVoWd3P1Vd38l9rwdCX+Pv3b35dG8eVsTFmy8x92XufurvQko6pkM6t3LqajTgevcXXfP95+bgHFm9u/9HYhoJglJUdSDGuHuHy1q35awLPyv3P344n2j4bxvFx3ueMIULHEHu/tDFpb5/i5wAGEqo/nA6YVlraPjfZ4wrcyFwE6EpUv+QVjkbgJhxV0nLB44O3re9oQ1fI4lzOB9CLAC+I673xR7PYMJy2p/mjBL+nJCYrk02r4VYQ60/yRMVPskYWmSLifRNbM9CdM3bevu/4y1twNfI6yQejhhypxp7n5VUTzdva7i/+SL3X17M9uB0FvYjzDj9cLo2DO7ijN2zq8BXyeswDufsFzDTwkL9C01s82Aa6K4hxFWdr0O+K9CAi78DQC/Ar4RxfBzwlQ7JwDnEJaJuA041d3fiZ73UBTrcsLccesTpgY7j7Aa7CmEDzvXuXvH1ELR5LJfBf4N+BdhQcvT3f3Zotc2F/iDu5/d0+9BsqUelGTO3ZcRelJHW+klvK8gvNlDWN5+a8KbUmGZ8U9Gbf9jZrsSlvj+A2E25kMIyxr8zsIS4AXbEFaq/SKwK7CUMHnsHoQE9O/AtcDPzWx8UTzfI7zZfpDwhvkjM/sAdCzl/RvgSOA0wpo/XyCaJDeaQf1BwppeHyfMuH5PFN8u3fyaxgHL4skp5tuEOdI+RJhr7Uoz+2Qsnp5e117R909Hv8fR0ePBwANRnLsTEsiNZnZwN3FiZkcT/s0uj857CyEhxzUAfyUsL7ErcBHhw8KXivbbl/DveChhqfLPE4aEDyAk5M8DkwgJK24C8D7CSrFnEOY2vDt6TWMIyfObZhafd7GB8MFir+h8a4C7oyVZ4v5I6P1LP9M1KKmUpwmfhhuBlviGaGLNl6OHKwuTgZpZYVLal2NtU4HfuHtHjysqIniF8Ib2y6h5A8JSEUuifQ4izHi9VWyo8Doz24+QaOIL8v3Q3X8RPe+8aPvBhFmhDyEkk9HuXli59HnWLad9bPQ6j40tU3FJlCyaCL2hUnYgzD5dyt3ufk3087Nm9mHCG/Cvolh6el3v+T0CuPtThJ5twTVm9lHgc4Qk25UzgVtivbi/m9m/EXpBhWOvICT6gkVmNjo6drxn/DZwYtQ7esbM5hBWPt7W3duitt8C4wmJt+N47l4437NmdiahR/7xWNsZ0fPujWLq1CM3sy8RJnIdTVhFoGApYchZ+pkSlFRKXfS9r2PKo4GdzKy4YGIDYOfY4xcLySn2vPWBZdZ5Bdb1CesexXWsnePua8ysBShcP9sbeCWWnErFNxxoLTpPA2E4sisbEt6sS/lD0eMFhB5J4XxJX1cnZrYRcD5hwbqto+c0ECWn2OzXBZdGw5i7Aj/rLsaopzwV+CxhGG8DQo9ncdHznikM3UVWAB4lp3hbce+zeAn6FdFXcduWsZj2JPRG9yR8UCr8TW5H5wT1NuHfQ/qZEpRUym6Eqr6X+nicemAmnT+dF8SPXbx2Vn10/tG81zs9PG4n+XB4PfAM8KkS297s5nkrCcNa5SrndRW7nDB8egbhutUbhGtShRVZmwlv5gUvx37u6YPGmYRrSKcTrq29Fv38n0X7Fa9w3N5FW/Hvv6znRcn4t4TlJ44HXoz2eZqQmOM2J7t1zaQMSlCSuahIYiIwO4UF8JoJ14YWllnt1ky4CL+Bu/+1D+f/C7CZme3TRS+qmXBNarW7t5TY3pVHgTPN7H0llqXfj7CGVMEBhLWvCufr6XUVElVxJeNYYFZsOLMe+ADRm3e0yONzJY73v4RhxXhM+5U49n3ufkOhwcx2pv/sQijWONfdn4niOYB1vai43YlWpJX+pQQlaVs/WpW1nrCK6IGET9It0fe+upSw2uvNZnYV4ZPu9oSL8Ve5+/NdPO8Bwkqxs6PrWE8SKt4OAN529+sTnv8BQtXardE1jicJBRm7uPuPCMUgpxMuvp9LuG61FeHa1TPu/svSh+245rNfdPy4I8zsVMIy7IcTrnN9pozXtYpwD9lhZvY0YXG/Vwi9pk+a2R3R9jOi1/Ii3bsyev1/IgwBHkBIyrCuZ+XApKjgYlm0/cOEa4X9YTHQBpxmZlcS/ma+R1FPMCo6GUuoCJR+pio+SdsYQvnvEkLl2UTCTbZ7uXtPb3w9ij79HkCo1rqf8Gn+esI1g9ZuntdOqLybDXyfcAPx3YQhp4VlnL89es49hOW1nVBi3Rhtf5tQuNBMKAZ4Njrnvrz3+kv8uK8QKgYnldj8HcKNo08QqtWmuvudSV9X1Gs9BTiGUADwWHTc06OYHiQUUywjwZLkUfn6VOBsQpHFREKFHqy7jnYRodryV4TrU5sBV/d07Ky4+ypCReChhGG9KwiFJsU9+oMIf1u/qGR8UprugxLJCTPbCfgzsFsX5ea5ZWbnA19x98b+jqUvzOweYK67F5fNSz/QEJ9ITrj7c2bWRCg5z22CMrP3EYog7iEUVhwMnEW4WbZqmdkmhN7e9/s7FgnUgxKRspjZeoSblfcm3JC8iHBj8+Wxe79E+kwJSkREcklFEiIikktKUCIikktKUCIikktKUCIikktKUCIikkv/B460QIgVwBAcAAAAAElFTkSuQmCC\n",
+ "text/plain": [
+ ""
+ ]
+ },
+ "metadata": {
+ "tags": [],
+ "needs_background": "light"
+ }
+ }
+ ]
+ },
+ {
+ "cell_type": "code",
+ "metadata": {
+ "id": "Znoxq-U9Yi07"
+ },
+ "source": [
+ ""
+ ],
+ "execution_count": 18,
+ "outputs": []
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {
+ "id": "oZoJ2q0dYi07"
+ },
+ "source": [
+ "**Exercise:** Suppose you run a survey at the end of the semester and find that 26% of students had the Freshman Plague at some point.\n",
+ "\n",
+ "What is your best estimate of `c`?\n",
+ "\n",
+ "Hint: if you print `frac_infected_series`, you can read off the answer. "
+ ]
+ },
+ {
+ "cell_type": "code",
+ "metadata": {
+ "scrolled": true,
+ "colab": {
+ "base_uri": "https://localhost:8080/"
+ },
+ "id": "Tj1lfhKPYi08",
+ "outputId": "859af73c-ea96-4cc9-8ae8-0844610caa32"
+ },
+ "source": [
+ "print(frac_infected_series.iloc[70:80])"
+ ],
+ "execution_count": 19,
+ "outputs": [
+ {
+ "output_type": "stream",
+ "text": [
+ "1.188948 0.300040\n",
+ "1.181034 0.290042\n",
+ "1.173263 0.280044\n",
+ "1.165630 0.270046\n",
+ "1.158132 0.260048\n",
+ "1.150765 0.250050\n",
+ "1.143524 0.240052\n",
+ "1.136407 0.230054\n",
+ "1.129409 0.220056\n",
+ "1.122527 0.210058\n",
+ "dtype: float64\n"
+ ],
+ "name": "stdout"
+ }
+ ]
+ },
+ {
+ "cell_type": "code",
+ "metadata": {
+ "id": "H4CcoZ7fYi08"
+ },
+ "source": [
+ "The best estimate of c is 1.158"
+ ],
+ "execution_count": 20,
+ "outputs": []
+ },
+ {
+ "cell_type": "code",
+ "metadata": {
+ "id": "B-LtYTdjYi08"
+ },
+ "source": [
+ ""
+ ],
+ "execution_count": null,
+ "outputs": []
+ }
+ ]
+}
\ No newline at end of file
diff --git a/examples/queue.ipynb b/examples/queue.ipynb
index eed8b76c1..869878818 100644
--- a/examples/queue.ipynb
+++ b/examples/queue.ipynb
@@ -1,592 +1,1153 @@
{
- "cells": [
- {
- "cell_type": "markdown",
- "metadata": {},
- "source": [
- "# One Queue or Two"
- ]
+ "nbformat": 4,
+ "nbformat_minor": 0,
+ "metadata": {
+ "kernelspec": {
+ "display_name": "Python 3",
+ "language": "python",
+ "name": "python3"
+ },
+ "language_info": {
+ "codemirror_mode": {
+ "name": "ipython",
+ "version": 3
+ },
+ "file_extension": ".py",
+ "mimetype": "text/x-python",
+ "name": "python",
+ "nbconvert_exporter": "python",
+ "pygments_lexer": "ipython3",
+ "version": "3.9.1"
+ },
+ "colab": {
+ "name": "queue.ipynb",
+ "provenance": []
+ }
},
- {
- "cell_type": "markdown",
- "metadata": {},
- "source": [
- "*Modeling and Simulation in Python*\n",
- "\n",
- "Copyright 2021 Allen Downey\n",
- "\n",
- "License: [Creative Commons Attribution-NonCommercial-ShareAlike 4.0 International](https://creativecommons.org/licenses/by-nc-sa/4.0/)"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": 1,
- "metadata": {
- "tags": []
- },
- "outputs": [],
- "source": [
- "# install Pint if necessary\n",
- "\n",
- "try:\n",
- " import pint\n",
- "except ImportError:\n",
- " !pip install pint"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": 2,
- "metadata": {
- "tags": []
- },
- "outputs": [],
- "source": [
- "# download modsim.py if necessary\n",
- "\n",
- "from os.path import exists\n",
- "\n",
- "filename = 'modsim.py'\n",
- "if not exists(filename):\n",
- " from urllib.request import urlretrieve\n",
- " url = 'https://raw.githubusercontent.com/AllenDowney/ModSim/main/'\n",
- " local, _ = urlretrieve(url+filename, filename)\n",
- " print('Downloaded ' + local)"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": 3,
- "metadata": {
- "tags": []
- },
- "outputs": [],
- "source": [
- "# import functions from modsim\n",
- "\n",
- "from modsim import *"
- ]
- },
- {
- "cell_type": "markdown",
- "metadata": {},
- "source": [
- "This notebook presents a case study from *Modeling and Simulation in Python*. It explores a question related to queueing theory, which is the study of systems that involve waiting in lines, also known as \"queues\".\n",
- "\n",
- "Suppose you are designing the checkout area for a new store. There is room for two checkout counters and a waiting area for customers. You can make two lines, one for each counter, or one line that serves both counters.\n",
- "\n",
- "In theory, you might expect a single line to be better, but it has some practical drawbacks: in order to maintain a single line, you would have to install rope barriers, and customers might be put off by what seems to be a longer line, even if it moves faster.\n",
- "\n",
- "So you'd like to check whether the single line is really better and by how much. Simulation can help answer this question."
- ]
- },
- {
- "cell_type": "markdown",
- "metadata": {},
- "source": [
- "As we did in the bikeshare model, we'll assume that a customer is equally likely to arrive during any timestep. I'll denote this probability using the Greek letter lambda, $\\lambda$, or the variable name `lam`. The value of $\\lambda$ probably varies from day to day, so we'll have to consider a range of possibilities.\n",
- "\n",
- "Based on data from other stores, you know that it takes 5 minutes for a customer to check out, on average. But checkout times are highly variable: most customers take less than 5 minutes, but some take substantially more. A simple way to model this variability is to assume that when a customer is checking out, they have the same probability of finishing up during each time step. I'll denote this probability using the Greek letter mu, $\\mu$, or the variable name `mu`.\n",
- "\n",
- "If we choose $\\mu=1/5$, the average number of time steps for each checkout will be 5 minutes, which is consistent with the data."
- ]
- },
- {
- "cell_type": "markdown",
- "metadata": {},
- "source": [
- "## One server, one queue\n",
- "\n",
- "Write a function called `make_system` that takes `lam` and `mu` as parameters and returns a `System` object with variables `lam`, `mu`, and `duration`. Set `duration`, which is the number of time steps to simulate, to 10 hours, expressed in minutes. "
- ]
- },
- {
- "cell_type": "code",
- "execution_count": 4,
- "metadata": {},
- "outputs": [],
- "source": [
- "# Solution goes here"
- ]
- },
- {
- "cell_type": "markdown",
- "metadata": {},
- "source": [
- "Test this function by creating a `System` object with `lam=1/8` and `mu=1/5`."
- ]
- },
- {
- "cell_type": "code",
- "execution_count": 5,
- "metadata": {},
- "outputs": [],
- "source": [
- "# Solution goes here"
- ]
- },
- {
- "cell_type": "markdown",
- "metadata": {},
- "source": [
- "Write an update function that takes as parameters `x`, which is the total number of customer in the store, including the one checking out; `t`, which is the number of minutes that have elapsed in the simulation, and `system`, which is a `System` object.\n",
- "\n",
- "If there's a customer checking out, it should use `flip` to decide whether they are done. And it should use `flip` to decide if a new customer has arrived.\n",
- "\n",
- "It should return the total number of customers at the end of the time step."
- ]
- },
- {
- "cell_type": "code",
- "execution_count": 6,
- "metadata": {},
- "outputs": [],
- "source": [
- "# Solution goes here"
- ]
- },
- {
- "cell_type": "markdown",
- "metadata": {},
- "source": [
- "Test your function by calling it with `x=1`, `t=0`, and the `System` object you created. If you run it a few times, you should see different results."
- ]
- },
- {
- "cell_type": "code",
- "execution_count": 7,
- "metadata": {},
- "outputs": [],
- "source": [
- "# Solution goes here"
- ]
- },
- {
- "cell_type": "markdown",
- "metadata": {},
- "source": [
- "Now we can run the simulation. Here's a version of `run_simulation` that creates a `TimeSeries` with the total number of customers in the store, including the one checking out."
- ]
- },
- {
- "cell_type": "code",
- "execution_count": 8,
- "metadata": {},
- "outputs": [],
- "source": [
- "def run_simulation(system, update_func):\n",
- " \"\"\"Simulate a queueing system.\n",
- " \n",
- " system: System object\n",
- " update_func: function object\n",
- " \"\"\"\n",
- " x = 0\n",
- " results = TimeSeries()\n",
- " results[0] = x\n",
- " \n",
- " for t in linrange(0, system.duration):\n",
- " x = update_func(x, t, system)\n",
- " results[t+1] = x\n",
- "\n",
- " return results"
- ]
- },
- {
- "cell_type": "markdown",
- "metadata": {},
- "source": [
- "Call `run_simulation` with your update function and plot the results."
- ]
- },
- {
- "cell_type": "code",
- "execution_count": 9,
- "metadata": {},
- "outputs": [],
- "source": [
- "# Solution goes here"
- ]
- },
- {
- "cell_type": "markdown",
- "metadata": {},
- "source": [
- "After the simulation, we can compute `L`, which is the average number of customers in the system, and `W`, which is the average time customers spend in the store. `L` and `W` are related by Little's Law:\n",
- "\n",
- "$L = \\lambda W$\n",
- "\n",
- "Where $\\lambda$ is the arrival rate. Here's a function that computes them."
- ]
- },
- {
- "cell_type": "code",
- "execution_count": 10,
- "metadata": {},
- "outputs": [],
- "source": [
- "def compute_metrics(results, system):\n",
- " \"\"\"Compute average number of customers and wait time.\n",
- " \n",
- " results: TimeSeries of queue lengths\n",
- " system: System object\n",
- " \n",
- " returns: L, W\n",
- " \"\"\"\n",
- " L = results.mean()\n",
- " W = L / system.lam\n",
- " return L, W"
- ]
- },
- {
- "cell_type": "markdown",
- "metadata": {},
- "source": [
- "Call `compute_metrics` with the results from your simulation."
- ]
- },
- {
- "cell_type": "code",
- "execution_count": 11,
- "metadata": {},
- "outputs": [],
- "source": [
- "# Solution goes here"
- ]
- },
- {
- "cell_type": "markdown",
- "metadata": {},
- "source": [
- "### Parameter sweep\n",
- "\n",
- "Since we don't know the actual value of $\\lambda$, we can sweep through a range of possibilities, from 10% to 80% of the completion rate, $\\mu$. (If customers arrive faster than the completion rate, the queue grows without bound. In that case the metrics `L` and `W` just depend on how long the store is open.)\n",
- "\n",
- "Create an array of values for `lam`."
- ]
- },
- {
- "cell_type": "code",
- "execution_count": 12,
- "metadata": {},
- "outputs": [],
- "source": [
- "# Solution goes here"
- ]
- },
- {
- "cell_type": "markdown",
- "metadata": {},
- "source": [
- "Write a function that takes an array of values for `lam`, a single value for `mu`, and an update function.\n",
- "\n",
- "For each value of `lam`, it should run a simulation, compute `L` and `W`, and store the value of `W` in a `SweepSeries`.\n",
- "\n",
- "It should return the `SweepSeries`."
- ]
- },
- {
- "cell_type": "code",
- "execution_count": 13,
- "metadata": {},
- "outputs": [],
- "source": [
- "# Solution goes here"
- ]
- },
- {
- "cell_type": "markdown",
- "metadata": {},
- "source": [
- "Call your function to generate a `SweepSeries`, and plot it."
- ]
- },
- {
- "cell_type": "code",
- "execution_count": 14,
- "metadata": {},
- "outputs": [],
- "source": [
- "# Solution goes here"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": 15,
- "metadata": {},
- "outputs": [],
- "source": [
- "# Solution goes here"
- ]
- },
- {
- "cell_type": "markdown",
- "metadata": {},
- "source": [
- "If we imagine that this range of values represents arrival rates on different days, we can use the average value of `W`, for a range of values of `lam`, to compare different queueing strategies."
- ]
- },
- {
- "cell_type": "code",
- "execution_count": 16,
- "metadata": {},
- "outputs": [],
- "source": [
- "# Solution goes here"
- ]
- },
- {
- "cell_type": "markdown",
- "metadata": {},
- "source": [
- "### Analysis\n",
- "\n",
- "The model I chose for this system is a common model in queueing theory, in part because many of its properties can be derived analytically.\n",
- "\n",
- "In particular, we can derive the average time in the store as a function of $\\mu$ and $\\lambda$:\n",
- "\n",
- "$W = 1 / (\\mu - \\lambda)$\n",
- "\n",
- "The following function plots the theoretical value of $W$ as a function of $\\lambda$."
- ]
- },
- {
- "cell_type": "code",
- "execution_count": 19,
- "metadata": {},
- "outputs": [],
- "source": [
- "def plot_W(lam_array, mu):\n",
- " \"\"\"Plot the theoretical mean wait time.\n",
- " \n",
- " lam_array: array of values for `lam`\n",
- " mu: probability of finishing a checkout\n",
- " \"\"\"\n",
- " W_array = 1 / (mu - lam_array)\n",
- " W_series = make_series(lam_array, W_array)\n",
- " W_series.plot(style='-', label='analysis')"
- ]
- },
- {
- "cell_type": "markdown",
- "metadata": {},
- "source": [
- "Use this function to plot the theoretical results, then plot your simulation results again on the same graph. How do they compare?"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": 23,
- "metadata": {},
- "outputs": [],
- "source": [
- "# Solution goes here"
- ]
- },
- {
- "cell_type": "markdown",
- "metadata": {},
- "source": [
- "## Multiple servers\n",
- "\n",
- "Now let's try the other two queueing strategies:\n",
- "\n",
- "1. One queue with two checkout counters.\n",
- "2. Two queues, one for each counter.\n",
- "\n",
- "The following figure shows the three scenarios:\n",
- "\n",
- "\n",
- "\n",
- "Write an update function for one queue with two servers."
- ]
- },
- {
- "cell_type": "code",
- "execution_count": 24,
- "metadata": {},
- "outputs": [],
- "source": [
- "# Solution goes here"
- ]
- },
- {
- "cell_type": "markdown",
- "metadata": {},
- "source": [
- "Use this update function to simulate the system, plot the results, and print the metrics."
- ]
- },
- {
- "cell_type": "code",
- "execution_count": 26,
- "metadata": {},
- "outputs": [],
- "source": [
- "# Solution goes here"
- ]
- },
- {
- "cell_type": "markdown",
- "metadata": {},
- "source": [
- "Since we have two checkout counters now, we can consider values for $\\lambda$ that exceed $\\mu$.\n",
- "\n",
- "Create a new array of values for `lam` from 10% to 160% of `mu`."
- ]
- },
- {
- "cell_type": "code",
- "execution_count": 27,
- "metadata": {},
- "outputs": [],
- "source": [
- "# Solution goes here"
- ]
- },
- {
- "cell_type": "markdown",
- "metadata": {},
- "source": [
- "Use your sweep function to simulate the two server, one queue scenario with a range of values for `lam`.\n",
- "\n",
- "Plot the results and print the average value of `W` across all values of `lam`."
- ]
- },
- {
- "cell_type": "code",
- "execution_count": 28,
- "metadata": {},
- "outputs": [],
- "source": [
- "# Solution goes here"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": 29,
- "metadata": {},
- "outputs": [],
- "source": [
- "# Solution goes here"
- ]
- },
- {
- "cell_type": "markdown",
- "metadata": {},
- "source": [
- "## Multiple queues\n",
- "\n",
- "To simulate the scenario with two separate queues, we need two state variables to keep track of customers in each queue.\n",
- "\n",
- "Write an update function that takes `x1`, `x2`, `t`, and `system` as parameters and returns `x1` and `x2` as return values. f you are not sure how to return more than one return value, see `compute_metrics`.\n",
- "\n",
- "When a customer arrives, which queue do they join?"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": 30,
- "metadata": {},
- "outputs": [],
- "source": [
- "# Solution goes here"
- ]
- },
- {
- "cell_type": "markdown",
- "metadata": {},
- "source": [
- "Write a version of `run_simulation` that works with this update function."
- ]
- },
- {
- "cell_type": "code",
- "execution_count": 31,
- "metadata": {},
- "outputs": [],
- "source": [
- "# Solution goes here"
- ]
- },
- {
- "cell_type": "markdown",
- "metadata": {},
- "source": [
- "Test your functions by running a simulation with a single value of `lam`."
- ]
- },
- {
- "cell_type": "code",
- "execution_count": 32,
- "metadata": {},
- "outputs": [],
- "source": [
- "# Solution goes here"
- ]
- },
- {
- "cell_type": "markdown",
- "metadata": {},
- "source": [
- "Sweep a range of values for `lam`, plot the results, and print the average wait time across all values of `lam`.\n",
- "\n",
- "How do the results compare to the scenario with two servers and one queue."
- ]
- },
- {
- "cell_type": "code",
- "execution_count": 33,
- "metadata": {},
- "outputs": [],
- "source": [
- "# Solution goes here"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": 34,
- "metadata": {},
- "outputs": [],
- "source": [
- "# Solution goes here"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": 27,
- "metadata": {},
- "outputs": [],
- "source": [
- "# Solution goes here"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": null,
- "metadata": {},
- "outputs": [],
- "source": []
- }
- ],
- "metadata": {
- "kernelspec": {
- "display_name": "Python 3",
- "language": "python",
- "name": "python3"
- },
- "language_info": {
- "codemirror_mode": {
- "name": "ipython",
- "version": 3
- },
- "file_extension": ".py",
- "mimetype": "text/x-python",
- "name": "python",
- "nbconvert_exporter": "python",
- "pygments_lexer": "ipython3",
- "version": "3.9.1"
- }
- },
- "nbformat": 4,
- "nbformat_minor": 2
-}
+ "cells": [
+ {
+ "cell_type": "markdown",
+ "metadata": {
+ "id": "rTR10W46fb5B"
+ },
+ "source": [
+ "# One Queue or Two"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {
+ "id": "aN5sgJ2Efb5G"
+ },
+ "source": [
+ "*Modeling and Simulation in Python*\n",
+ "\n",
+ "Copyright 2021 Allen Downey\n",
+ "\n",
+ "License: [Creative Commons Attribution-NonCommercial-ShareAlike 4.0 International](https://creativecommons.org/licenses/by-nc-sa/4.0/)"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "metadata": {
+ "tags": [],
+ "id": "28lKMv5bfb5N"
+ },
+ "source": [
+ "# install Pint if necessary\n",
+ "\n",
+ "try:\n",
+ " import pint\n",
+ "except ImportError:\n",
+ " !pip install pint"
+ ],
+ "execution_count": 1,
+ "outputs": []
+ },
+ {
+ "cell_type": "code",
+ "metadata": {
+ "tags": [],
+ "id": "OI4qD7p7fb5Q"
+ },
+ "source": [
+ "# download modsim.py if necessary\n",
+ "\n",
+ "from os.path import exists\n",
+ "\n",
+ "filename = 'modsim.py'\n",
+ "if not exists(filename):\n",
+ " from urllib.request import urlretrieve\n",
+ " url = 'https://raw.githubusercontent.com/AllenDowney/ModSim/main/'\n",
+ " local, _ = urlretrieve(url+filename, filename)\n",
+ " print('Downloaded ' + local)"
+ ],
+ "execution_count": 2,
+ "outputs": []
+ },
+ {
+ "cell_type": "code",
+ "metadata": {
+ "tags": [],
+ "id": "TxjXc0FKfb5S"
+ },
+ "source": [
+ "# import functions from modsim\n",
+ "\n",
+ "from modsim import *\n",
+ "import matplotlib.pyplot as plt\n"
+ ],
+ "execution_count": 3,
+ "outputs": []
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {
+ "id": "syF1fguXfb5U"
+ },
+ "source": [
+ "This notebook presents a case study from *Modeling and Simulation in Python*. It explores a question related to queueing theory, which is the study of systems that involve waiting in lines, also known as \"queues\".\n",
+ "\n",
+ "Suppose you are designing the checkout area for a new store. There is room for two checkout counters and a waiting area for customers. You can make two lines, one for each counter, or one line that serves both counters.\n",
+ "\n",
+ "In theory, you might expect a single line to be better, but it has some practical drawbacks: in order to maintain a single line, you would have to install rope barriers, and customers might be put off by what seems to be a longer line, even if it moves faster.\n",
+ "\n",
+ "So you'd like to check whether the single line is really better and by how much. Simulation can help answer this question."
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {
+ "id": "Ia5gtH1gfb5V"
+ },
+ "source": [
+ "As we did in the bikeshare model, we'll assume that a customer is equally likely to arrive during any timestep. I'll denote this probability using the Greek letter lambda, $\\lambda$, or the variable name `lam`. The value of $\\lambda$ probably varies from day to day, so we'll have to consider a range of possibilities.\n",
+ "\n",
+ "Based on data from other stores, you know that it takes 5 minutes for a customer to check out, on average. But checkout times are highly variable: most customers take less than 5 minutes, but some take substantially more. A simple way to model this variability is to assume that when a customer is checking out, they have the same probability of finishing up during each time step. I'll denote this probability using the Greek letter mu, $\\mu$, or the variable name `mu`.\n",
+ "\n",
+ "If we choose $\\mu=1/5$, the average number of time steps for each checkout will be 5 minutes, which is consistent with the data."
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {
+ "id": "KXZB-uW_fb5X"
+ },
+ "source": [
+ "## One server, one queue\n",
+ "\n",
+ "Write a function called `make_system` that takes `lam` and `mu` as parameters and returns a `System` object with variables `lam`, `mu`, and `duration`. Set `duration`, which is the number of time steps to simulate, to 10 hours, expressed in minutes. "
+ ]
+ },
+ {
+ "cell_type": "code",
+ "metadata": {
+ "id": "xo2kZ003fb5Y"
+ },
+ "source": [
+ "def make_system(lam, mu):\n",
+ " \"\"\" lam - a customer arrival rate\n",
+ " mu - process rate\"\"\"\n",
+ "\n",
+ " return System(lam=lam, mu=mu, duration=600)"
+ ],
+ "execution_count": 4,
+ "outputs": []
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {
+ "id": "lC_ASxZRfb5a"
+ },
+ "source": [
+ "Test this function by creating a `System` object with `lam=1/8` and `mu=1/5`."
+ ]
+ },
+ {
+ "cell_type": "code",
+ "metadata": {
+ "colab": {
+ "base_uri": "https://localhost:8080/"
+ },
+ "id": "jwwsXSkbfb5b",
+ "outputId": "d92179de-55ba-49e8-f27e-4b5fa081a779"
+ },
+ "source": [
+ "interarrival_time = 8\n",
+ "service_time = 5\n",
+ "\n",
+ "lam = 1/interarrival_time\n",
+ "mu = 1/service_time\n",
+ "\n",
+ "system1 = make_system(lam=lam, mu=mu)\n",
+ "system1"
+ ],
+ "execution_count": 5,
+ "outputs": [
+ {
+ "output_type": "execute_result",
+ "data": {
+ "text/plain": [
+ "System(duration=600, lam=0.125, mu=0.2)"
+ ]
+ },
+ "metadata": {
+ "tags": []
+ },
+ "execution_count": 5
+ }
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {
+ "id": "YntObvyvfb5c"
+ },
+ "source": [
+ "Write an update function that takes as parameters `x`, which is the total number of customer in the store, including the one checking out; `t`, which is the number of minutes that have elapsed in the simulation, and `system`, which is a `System` object.\n",
+ "\n",
+ "If there's a customer checking out, it should use `flip` to decide whether they are done. And it should use `flip` to decide if a new customer has arrived.\n",
+ "\n",
+ "It should return the total number of customers at the end of the time step."
+ ]
+ },
+ {
+ "cell_type": "code",
+ "metadata": {
+ "id": "dqlrPfpxfb5c"
+ },
+ "source": [
+ "def update_func(x, t, system):\n",
+ "\n",
+ " \"\"\" Check if the customers are done at check out\"\"\"\n",
+ " if x > 0:\n",
+ " if flip(system.mu):\n",
+ " x -= 1\n",
+ " \n",
+ " if flip(system.lam):\n",
+ " x += 1\n",
+ "\n",
+ " return x"
+ ],
+ "execution_count": 6,
+ "outputs": []
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {
+ "id": "JCpd9NEafb5e"
+ },
+ "source": [
+ "Test your function by calling it with `x=1`, `t=0`, and the `System` object you created. If you run it a few times, you should see different results."
+ ]
+ },
+ {
+ "cell_type": "code",
+ "metadata": {
+ "colab": {
+ "base_uri": "https://localhost:8080/"
+ },
+ "id": "V5kLW5Zlfb5g",
+ "outputId": "c3c44903-3022-4a8e-e8d2-3279af1816fa"
+ },
+ "source": [
+ "update_func(1,0,system1)"
+ ],
+ "execution_count": 7,
+ "outputs": [
+ {
+ "output_type": "execute_result",
+ "data": {
+ "text/plain": [
+ "1"
+ ]
+ },
+ "metadata": {
+ "tags": []
+ },
+ "execution_count": 7
+ }
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {
+ "id": "KucbdBmAfb5h"
+ },
+ "source": [
+ "Now we can run the simulation. Here's a version of `run_simulation` that creates a `TimeSeries` with the total number of customers in the store, including the one checking out."
+ ]
+ },
+ {
+ "cell_type": "code",
+ "metadata": {
+ "id": "pxDUTd1Ifb5j"
+ },
+ "source": [
+ "def run_simulation(system, update_func):\n",
+ " \"\"\"Simulate a queueing system.\n",
+ " \n",
+ " system: System object\n",
+ " update_func: function object\n",
+ " \"\"\"\n",
+ " x = 0\n",
+ " results = TimeSeries()\n",
+ " results[0] = x\n",
+ " \n",
+ " for t in linrange(0, system.duration):\n",
+ " x = update_func(x, t, system)\n",
+ " results[t+1] = x\n",
+ "\n",
+ " return results"
+ ],
+ "execution_count": 8,
+ "outputs": []
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {
+ "id": "DmYMhFCWfb5j"
+ },
+ "source": [
+ "Call `run_simulation` with your update function and plot the results."
+ ]
+ },
+ {
+ "cell_type": "code",
+ "metadata": {
+ "colab": {
+ "base_uri": "https://localhost:8080/",
+ "height": 297
+ },
+ "id": "58daXIAtfb5j",
+ "outputId": "fc952943-f036-4631-a35b-5a022de76715"
+ },
+ "source": [
+ "results1 = run_simulation(system1, update_func)\n",
+ "#results1.plot(label='results1')\n",
+ "plt.plot(results1, label='label')\n",
+ "decorate(title='Customer Checkout',\n",
+ " xlabel='Time (mins)',\n",
+ " ylabel='Number of customer')"
+ ],
+ "execution_count": 9,
+ "outputs": [
+ {
+ "output_type": "display_data",
+ "data": {
+ "image/png": "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\n",
+ "text/plain": [
+ ""
+ ]
+ },
+ "metadata": {
+ "tags": [],
+ "needs_background": "light"
+ }
+ }
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {
+ "id": "JzGms4B1fb5j"
+ },
+ "source": [
+ "After the simulation, we can compute `L`, which is the average number of customers in the system, and `W`, which is the average time customers spend in the store. `L` and `W` are related by Little's Law:\n",
+ "\n",
+ "$L = \\lambda W$\n",
+ "\n",
+ "Where $\\lambda$ is the arrival rate. Here's a function that computes them."
+ ]
+ },
+ {
+ "cell_type": "code",
+ "metadata": {
+ "id": "oL9Zv9UIfb5k"
+ },
+ "source": [
+ "def compute_metrics(results, system):\n",
+ " \"\"\"Compute average number of customers and wait time.\n",
+ " \n",
+ " results: TimeSeries of queue lengths\n",
+ " system: System object\n",
+ " \n",
+ " returns: L, W\n",
+ " \"\"\"\n",
+ " L = results.mean()\n",
+ " W = L / system.lam\n",
+ " return L, W"
+ ],
+ "execution_count": 10,
+ "outputs": []
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {
+ "id": "E_F8wnVFfb5k"
+ },
+ "source": [
+ "Call `compute_metrics` with the results from your simulation."
+ ]
+ },
+ {
+ "cell_type": "code",
+ "metadata": {
+ "id": "CxSbMgtPfb5k",
+ "colab": {
+ "base_uri": "https://localhost:8080/"
+ },
+ "outputId": "d570123a-14da-4714-ae9b-7889e4805573"
+ },
+ "source": [
+ "L, W = compute_metrics(results1, system1)\n",
+ "print(L,W)"
+ ],
+ "execution_count": 11,
+ "outputs": [
+ {
+ "output_type": "stream",
+ "text": [
+ "1.323920265780731 10.591362126245848\n"
+ ],
+ "name": "stdout"
+ }
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {
+ "id": "mVan5hCGfb5l"
+ },
+ "source": [
+ "### Parameter sweep\n",
+ "\n",
+ "Since we don't know the actual value of $\\lambda$, we can sweep through a range of possibilities, from 10% to 80% of the completion rate, $\\mu$. (If customers arrive faster than the completion rate, the queue grows without bound. In that case the metrics `L` and `W` just depend on how long the store is open.)\n",
+ "\n",
+ "Create an array of values for `lam`."
+ ]
+ },
+ {
+ "cell_type": "code",
+ "metadata": {
+ "id": "313vn1h4fb5m",
+ "colab": {
+ "base_uri": "https://localhost:8080/"
+ },
+ "outputId": "59487a31-07d9-4775-f3b2-f4341631f918"
+ },
+ "source": [
+ "lam_array = linspace(0.1*mu, 0.8*mu, 101)\n",
+ "lam_array"
+ ],
+ "execution_count": 12,
+ "outputs": [
+ {
+ "output_type": "execute_result",
+ "data": {
+ "text/plain": [
+ "array([0.02 , 0.0214, 0.0228, 0.0242, 0.0256, 0.027 , 0.0284, 0.0298,\n",
+ " 0.0312, 0.0326, 0.034 , 0.0354, 0.0368, 0.0382, 0.0396, 0.041 ,\n",
+ " 0.0424, 0.0438, 0.0452, 0.0466, 0.048 , 0.0494, 0.0508, 0.0522,\n",
+ " 0.0536, 0.055 , 0.0564, 0.0578, 0.0592, 0.0606, 0.062 , 0.0634,\n",
+ " 0.0648, 0.0662, 0.0676, 0.069 , 0.0704, 0.0718, 0.0732, 0.0746,\n",
+ " 0.076 , 0.0774, 0.0788, 0.0802, 0.0816, 0.083 , 0.0844, 0.0858,\n",
+ " 0.0872, 0.0886, 0.09 , 0.0914, 0.0928, 0.0942, 0.0956, 0.097 ,\n",
+ " 0.0984, 0.0998, 0.1012, 0.1026, 0.104 , 0.1054, 0.1068, 0.1082,\n",
+ " 0.1096, 0.111 , 0.1124, 0.1138, 0.1152, 0.1166, 0.118 , 0.1194,\n",
+ " 0.1208, 0.1222, 0.1236, 0.125 , 0.1264, 0.1278, 0.1292, 0.1306,\n",
+ " 0.132 , 0.1334, 0.1348, 0.1362, 0.1376, 0.139 , 0.1404, 0.1418,\n",
+ " 0.1432, 0.1446, 0.146 , 0.1474, 0.1488, 0.1502, 0.1516, 0.153 ,\n",
+ " 0.1544, 0.1558, 0.1572, 0.1586, 0.16 ])"
+ ]
+ },
+ "metadata": {
+ "tags": []
+ },
+ "execution_count": 12
+ }
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {
+ "id": "dBIa2Zxgfb5n"
+ },
+ "source": [
+ "Write a function that takes an array of values for `lam`, a single value for `mu`, and an update function.\n",
+ "\n",
+ "For each value of `lam`, it should run a simulation, compute `L` and `W`, and store the value of `W` in a `SweepSeries`.\n",
+ "\n",
+ "It should return the `SweepSeries`."
+ ]
+ },
+ {
+ "cell_type": "code",
+ "metadata": {
+ "id": "T3Lw9Hq0fb5n"
+ },
+ "source": [
+ "def sweep_lam(lam_array, mu, update_func):\n",
+ "\n",
+ " sweep = SweepSeries()\n",
+ " \"\"\"mu = 1/5\n",
+ " \"\"\"\n",
+ "\n",
+ " for lam in lam_array:\n",
+ " system = make_system(lam, mu) \n",
+ " results = run_simulation(system, update_func)\n",
+ " L, W=compute_metrics(results, system)\n",
+ " sweep[lam]=W\n",
+ " \n",
+ " return sweep\n"
+ ],
+ "execution_count": 13,
+ "outputs": []
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {
+ "id": "rbBAMakvfb5n"
+ },
+ "source": [
+ "Call your function to generate a `SweepSeries`, and plot it."
+ ]
+ },
+ {
+ "cell_type": "code",
+ "metadata": {
+ "id": "3vzZjt54fb5n",
+ "colab": {
+ "base_uri": "https://localhost:8080/",
+ "height": 297
+ },
+ "outputId": "7cbaa806-3144-4031-a967-bf4b56bcb228"
+ },
+ "source": [
+ "sweep1 = sweep_lam(lam_array, mu, update_func)\n",
+ "plt.scatter(sweep1.index, sweep1)\n",
+ "decorate(xlabel='Lamda, the arrival rate',\n",
+ " ylabel='Average Time Customer Spend')\n"
+ ],
+ "execution_count": 14,
+ "outputs": [
+ {
+ "output_type": "display_data",
+ "data": {
+ "image/png": "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\n",
+ "text/plain": [
+ ""
+ ]
+ },
+ "metadata": {
+ "tags": [],
+ "needs_background": "light"
+ }
+ }
+ ]
+ },
+ {
+ "cell_type": "code",
+ "metadata": {
+ "id": "OYwignSvfb5o",
+ "colab": {
+ "base_uri": "https://localhost:8080/"
+ },
+ "outputId": "e212183d-7289-42d9-ce53-35dcea8d3da4"
+ },
+ "source": [
+ "print(sweep1)"
+ ],
+ "execution_count": 15,
+ "outputs": [
+ {
+ "output_type": "stream",
+ "text": [
+ "Parameter\n",
+ "0.0200 3.405316\n",
+ "0.0214 7.296550\n",
+ "0.0228 3.497115\n",
+ "0.0242 5.491337\n",
+ "0.0256 8.305648\n",
+ " ... \n",
+ "0.1544 29.769077\n",
+ "0.1558 8.412267\n",
+ "0.1572 11.739917\n",
+ "0.1586 10.410862\n",
+ "0.1600 20.691445\n",
+ "Name: Metric, Length: 101, dtype: float64\n"
+ ],
+ "name": "stdout"
+ }
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {
+ "id": "_WIZ7TJSfb5o"
+ },
+ "source": [
+ "If we imagine that this range of values represents arrival rates on different days, we can use the average value of `W`, for a range of values of `lam`, to compare different queueing strategies."
+ ]
+ },
+ {
+ "cell_type": "code",
+ "metadata": {
+ "id": "z434VukEfb5o",
+ "colab": {
+ "base_uri": "https://localhost:8080/"
+ },
+ "outputId": "29dd82d9-87f5-4537-91b6-4f02d33a517f"
+ },
+ "source": [
+ "sweep1.mean()"
+ ],
+ "execution_count": 16,
+ "outputs": [
+ {
+ "output_type": "execute_result",
+ "data": {
+ "text/plain": [
+ "8.914936037880679"
+ ]
+ },
+ "metadata": {
+ "tags": []
+ },
+ "execution_count": 16
+ }
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {
+ "id": "K1sF_1gkfb5p"
+ },
+ "source": [
+ "### Analysis\n",
+ "\n",
+ "The model I chose for this system is a common model in queueing theory, in part because many of its properties can be derived analytically.\n",
+ "\n",
+ "In particular, we can derive the average time in the store as a function of $\\mu$ and $\\lambda$:\n",
+ "\n",
+ "$W = 1 / (\\mu - \\lambda)$\n",
+ "\n",
+ "The following function plots the theoretical value of $W$ as a function of $\\lambda$."
+ ]
+ },
+ {
+ "cell_type": "code",
+ "metadata": {
+ "id": "56XsHQKQfb5p"
+ },
+ "source": [
+ "def plot_W(lam_array, mu):\n",
+ " \"\"\"Plot the theoretical mean wait time.\n",
+ " \n",
+ " lam_array: array of values for `lam`\n",
+ " mu: probability of finishing a checkout\n",
+ " \"\"\"\n",
+ " W_array = 1 / (mu - lam_array)\n",
+ " W_series = make_series(lam_array, W_array)\n",
+ " W_series.plot(style='-', label='analysis')"
+ ],
+ "execution_count": 17,
+ "outputs": []
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {
+ "id": "5FY36b9gfb5q"
+ },
+ "source": [
+ "Use this function to plot the theoretical results, then plot your simulation results again on the same graph. How do they compare?"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "metadata": {
+ "id": "HSfR9uqDfb5q",
+ "colab": {
+ "base_uri": "https://localhost:8080/",
+ "height": 282
+ },
+ "outputId": "09c6e867-97fc-43f7-da8d-f8da105a38f2"
+ },
+ "source": [
+ "plot_W(lam_array, mu)\n",
+ "plt.scatter(sweep1.index, sweep1)"
+ ],
+ "execution_count": 18,
+ "outputs": [
+ {
+ "output_type": "execute_result",
+ "data": {
+ "text/plain": [
+ ""
+ ]
+ },
+ "metadata": {
+ "tags": []
+ },
+ "execution_count": 18
+ },
+ {
+ "output_type": "display_data",
+ "data": {
+ "image/png": "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\n",
+ "text/plain": [
+ ""
+ ]
+ },
+ "metadata": {
+ "tags": [],
+ "needs_background": "light"
+ }
+ }
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {
+ "id": "mpwanurrfb5q"
+ },
+ "source": [
+ "## Multiple servers\n",
+ "\n",
+ "Now let's try the other two queueing strategies:\n",
+ "\n",
+ "1. One queue with two checkout counters.\n",
+ "2. Two queues, one for each counter.\n",
+ "\n",
+ "The following figure shows the three scenarios:\n",
+ "\n",
+ "\n",
+ "\n",
+ "Write an update function for one queue with two servers."
+ ]
+ },
+ {
+ "cell_type": "code",
+ "metadata": {
+ "id": "JmqYCbJXfb5q"
+ },
+ "source": [
+ "\"\"\" \n",
+ "x - the total number of customer in the store, including the one checking out\n",
+ "t - the number of minutes that have elapsed in the simulation\n",
+ "\"\"\"\n",
+ "\n",
+ "def update_func1(x, t, system):\n",
+ " \n",
+ " \"\"\" Check if the customers are done at check out\"\"\"\n",
+ " # if both servers are busy, check whether the\n",
+ " # second is complete\n",
+ " \n",
+ " if x > 1:\n",
+ " if flip(system.mu):\n",
+ " x -= 1\n",
+ " \n",
+ " # check whether the first is complete\n",
+ " if x > 0:\n",
+ " if flip(system.mu):\n",
+ " x -= 1\n",
+ " \n",
+ " if flip(system.lam):\n",
+ " x += 1\n",
+ "\n",
+ " return x"
+ ],
+ "execution_count": 19,
+ "outputs": []
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {
+ "id": "v0sZ6kZzfb5r"
+ },
+ "source": [
+ "Use this update function to simulate the system, plot the results, and print the metrics."
+ ]
+ },
+ {
+ "cell_type": "code",
+ "metadata": {
+ "id": "95-yeHQyfb5r",
+ "colab": {
+ "base_uri": "https://localhost:8080/",
+ "height": 332
+ },
+ "outputId": "c14d91b7-2af5-4be5-e60c-b45dae28b607"
+ },
+ "source": [
+ "system=make_system(lam,mu)\n",
+ "print(lam,mu)\n",
+ "results2 = run_simulation(system, update_func1)\n",
+ "#results1.plot(label='results1')\n",
+ "plt.plot(results2, label='label')\n",
+ "decorate(title='Customer Checkout',\n",
+ " xlabel='Time (mins)',\n",
+ " ylabel='Number of customer')\n",
+ "compute_metrics(results2, system)"
+ ],
+ "execution_count": 20,
+ "outputs": [
+ {
+ "output_type": "stream",
+ "text": [
+ "0.125 0.2\n"
+ ],
+ "name": "stdout"
+ },
+ {
+ "output_type": "execute_result",
+ "data": {
+ "text/plain": [
+ "(0.8272425249169435, 6.617940199335548)"
+ ]
+ },
+ "metadata": {
+ "tags": []
+ },
+ "execution_count": 20
+ },
+ {
+ "output_type": "display_data",
+ "data": {
+ "image/png": "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\n",
+ "text/plain": [
+ ""
+ ]
+ },
+ "metadata": {
+ "tags": [],
+ "needs_background": "light"
+ }
+ }
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {
+ "id": "HUbVXSa1fb5r"
+ },
+ "source": [
+ "Since we have two checkout counters now, we can consider values for $\\lambda$ that exceed $\\mu$.\n",
+ "\n",
+ "Create a new array of values for `lam` from 10% to 160% of `mu`."
+ ]
+ },
+ {
+ "cell_type": "code",
+ "metadata": {
+ "id": "Qz2NNqjTfb5s"
+ },
+ "source": [
+ "counter=2\n",
+ "lam_array2 = linspace(0.1*mu, 0.8*counter*mu, 101)"
+ ],
+ "execution_count": 21,
+ "outputs": []
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {
+ "id": "W2XYsjwWfb5s"
+ },
+ "source": [
+ "Use your sweep function to simulate the two server, one queue scenario with a range of values for `lam`.\n",
+ "\n",
+ "Plot the results and print the average value of `W` across all values of `lam`."
+ ]
+ },
+ {
+ "cell_type": "code",
+ "metadata": {
+ "id": "wFDtQiGlfb5s",
+ "colab": {
+ "base_uri": "https://localhost:8080/"
+ },
+ "outputId": "2e20dc8e-e9de-4470-e1b2-e9c75f7a4992"
+ },
+ "source": [
+ "sweep2 = sweep_lam(lam_array2, mu, update_func1)\n",
+ "sweep2.mean()"
+ ],
+ "execution_count": 22,
+ "outputs": [
+ {
+ "output_type": "execute_result",
+ "data": {
+ "text/plain": [
+ "6.107548279708789"
+ ]
+ },
+ "metadata": {
+ "tags": []
+ },
+ "execution_count": 22
+ }
+ ]
+ },
+ {
+ "cell_type": "code",
+ "metadata": {
+ "id": "qB4CA94zfb5t",
+ "colab": {
+ "base_uri": "https://localhost:8080/",
+ "height": 297
+ },
+ "outputId": "7de169a0-0cbc-44a2-f04c-91880cf43319"
+ },
+ "source": [
+ "plt.scatter(sweep2.index, sweep2)\n",
+ "decorate(xlabel='Lamda, the arrival rate',\n",
+ " ylabel='Average Time Customer Spend')"
+ ],
+ "execution_count": 23,
+ "outputs": [
+ {
+ "output_type": "display_data",
+ "data": {
+ "image/png": "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\n",
+ "text/plain": [
+ ""
+ ]
+ },
+ "metadata": {
+ "tags": [],
+ "needs_background": "light"
+ }
+ }
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {
+ "id": "dQxYDULRfb5t"
+ },
+ "source": [
+ "## Multiple queues\n",
+ "\n",
+ "To simulate the scenario with two separate queues, we need two state variables to keep track of customers in each queue.\n",
+ "\n",
+ "Write an update function that takes `x1`, `x2`, `t`, and `system` as parameters and returns `x1` and `x2` as return values. f you are not sure how to return more than one return value, see `compute_metrics`.\n",
+ "\n",
+ "When a customer arrives, which queue do they join?"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "metadata": {
+ "id": "djikYu5sfb5t"
+ },
+ "source": [
+ "def update_func2(x1, x2, t, system):\n",
+ " \n",
+ " \"\"\" Check if the customers are done at check out\"\"\"\n",
+ " # if both servers are busy, check whether the\n",
+ " # second is complete\n",
+ " \n",
+ " if x1 > 1:\n",
+ " if flip(system.mu):\n",
+ " x1 -= 1\n",
+ " \n",
+ " # check whether the first is complete\n",
+ " if x2 > 0:\n",
+ " if flip(system.mu):\n",
+ " x2 -= 1\n",
+ " \n",
+ " if flip(system.lam):\n",
+ " if x1 > x2:\n",
+ " x2 += 1\n",
+ " else:\n",
+ " x1 += 1\n",
+ "\n",
+ " return x1, x2"
+ ],
+ "execution_count": 24,
+ "outputs": []
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {
+ "id": "6Lw5AJg7fb5u"
+ },
+ "source": [
+ "Write a version of `run_simulation` that works with this update function."
+ ]
+ },
+ {
+ "cell_type": "code",
+ "metadata": {
+ "id": "sCOv3EVVfb5u"
+ },
+ "source": [
+ "def run_simulation(system, update_func):\n",
+ " \"\"\"Simulate a queueing system.\n",
+ " \n",
+ " system: System object\n",
+ " update_func: function object\n",
+ " \"\"\"\n",
+ " x1 = 0\n",
+ " x2 = 0\n",
+ " results = TimeSeries()\n",
+ " results[0]=x1+x2\n",
+ "\n",
+ " for t in linrange(0, system.duration):\n",
+ " x1, x2 = update_func(x1, x2, t, system)\n",
+ " results[t+1] = x1 + x2\n",
+ "\n",
+ " return results"
+ ],
+ "execution_count": 25,
+ "outputs": []
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {
+ "id": "0j_vDUnqfb5v"
+ },
+ "source": [
+ "Test your functions by running a simulation with a single value of `lam`."
+ ]
+ },
+ {
+ "cell_type": "code",
+ "metadata": {
+ "id": "abcmm87wfb5w",
+ "colab": {
+ "base_uri": "https://localhost:8080/"
+ },
+ "outputId": "1efab879-6fa5-47be-aa02-0ed7447af4a2"
+ },
+ "source": [
+ "system = make_system(lam, mu)\n",
+ "results3=run_simulation(system, update_func2)\n",
+ "results3"
+ ],
+ "execution_count": 26,
+ "outputs": [
+ {
+ "output_type": "execute_result",
+ "data": {
+ "text/plain": [
+ "Time\n",
+ "0 0\n",
+ "1 1\n",
+ "2 1\n",
+ "3 1\n",
+ "4 2\n",
+ " ..\n",
+ "597 1\n",
+ "598 1\n",
+ "599 1\n",
+ "600 1\n",
+ "601 1\n",
+ "Name: Quantity, Length: 602, dtype: int64"
+ ]
+ },
+ "metadata": {
+ "tags": []
+ },
+ "execution_count": 26
+ }
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {
+ "id": "xENEzuUBfb5x"
+ },
+ "source": [
+ "Sweep a range of values for `lam`, plot the results, and print the average wait time across all values of `lam`.\n",
+ "\n",
+ "How do the results compare to the scenario with two servers and one queue."
+ ]
+ },
+ {
+ "cell_type": "code",
+ "metadata": {
+ "id": "3WSkdGLafb5x",
+ "colab": {
+ "base_uri": "https://localhost:8080/"
+ },
+ "outputId": "2f475389-8c15-4043-c6e2-b2e982c5b5ca"
+ },
+ "source": [
+ "sweep3 = sweep_lam(lam_array, mu, update_func2)\n",
+ "sweep3.mean()"
+ ],
+ "execution_count": 27,
+ "outputs": [
+ {
+ "output_type": "execute_result",
+ "data": {
+ "text/plain": [
+ "19.888128788954937"
+ ]
+ },
+ "metadata": {
+ "tags": []
+ },
+ "execution_count": 27
+ }
+ ]
+ },
+ {
+ "cell_type": "code",
+ "metadata": {
+ "id": "QjF7RLbYfb5x",
+ "colab": {
+ "base_uri": "https://localhost:8080/",
+ "height": 297
+ },
+ "outputId": "2a26d2c3-6db9-490a-9dd7-169ce78f88c3"
+ },
+ "source": [
+ "plt.scatter(sweep3.index, sweep3)\n",
+ "decorate(xlabel='Lamda, the arrival rate',\n",
+ " ylabel='Average Time Customer Spend',\n",
+ " title='2 counters, 2 lines')"
+ ],
+ "execution_count": 33,
+ "outputs": [
+ {
+ "output_type": "display_data",
+ "data": {
+ "image/png": "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\n",
+ "text/plain": [
+ ""
+ ]
+ },
+ "metadata": {
+ "tags": [],
+ "needs_background": "light"
+ }
+ }
+ ]
+ },
+ {
+ "cell_type": "code",
+ "metadata": {
+ "id": "aOnEiH2efb5y"
+ },
+ "source": [
+ "# Solution goes here"
+ ],
+ "execution_count": 29,
+ "outputs": []
+ },
+ {
+ "cell_type": "code",
+ "metadata": {
+ "id": "19Km8lwGfb5y"
+ },
+ "source": [
+ ""
+ ],
+ "execution_count": 29,
+ "outputs": []
+ }
+ ]
+}
\ No newline at end of file