{ "cells": [ { "cell_type": "markdown", "metadata": {}, "source": [ "\n", "*This notebook contains course material from [CBE30338](https://jckantor.github.io/CBE30338)\n", "by Jeffrey Kantor (jeff at nd.edu); the content is available [on Github](https://github.com/jckantor/CBE30338.git).\n", "The text is released under the [CC-BY-NC-ND-4.0 license](https://creativecommons.org/licenses/by-nc-nd/4.0/legalcode),\n", "and code is released under the [MIT license](https://opensource.org/licenses/MIT).*" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "\n", "< [Simulation and Optimal Control](http://nbviewer.jupyter.org/github/jckantor/CBE30338/blob/master/notebooks/07.00-Simulation-and-Optimal-Control.ipynb) | [Contents](toc.ipynb) | [Soft Landing a Rocket](http://nbviewer.jupyter.org/github/jckantor/CBE30338/blob/master/notebooks/07.02-Soft-Landing-a-Rocket.ipynb) >
" ] }, { "cell_type": "markdown", "metadata": { "colab_type": "text", "id": "8C_vr6C0Jf8I" }, "source": [ "# Simulation and Optimal Control in Pharmacokinetics" ] }, { "cell_type": "markdown", "metadata": { "colab_type": "text", "id": "r1DkXPM5wif0" }, "source": [ "## Installations and Initialization\n", "\n", "Pyomo and ipopt are now preinstalled on [Google Colaboratory](https://colab.research.google.com/). On MacOS and Windows PC, a one-time installation of pyomo and ipopt is required. The following commands will perform the needed installation when using the Anaconda distribution of Python." ] }, { "cell_type": "code", "execution_count": 0, "metadata": { "colab": {}, "colab_type": "code", "id": "fP3nFqWlidrB" }, "outputs": [], "source": [ "!wget -N -q \"https://ampl.com/dl/open/ipopt/ipopt-linux64.zip\"\n", "!unzip -o -q ipopt-linux64\n", "ipopt_executable = '/content/ipopt'" ] }, { "cell_type": "code", "execution_count": 0, "metadata": { "colab": {}, "colab_type": "code", "id": "ISnPZ93d5Zvr" }, "outputs": [], "source": [ "%matplotlib inline\n", "import matplotlib.pyplot as plt\n", "from pyomo.environ import *\n", "from pyomo.dae import *" ] }, { "cell_type": "markdown", "metadata": { "colab_type": "text", "id": "GAe_MZ1QKG6j" }, "source": [ "On MacOS and Windows PC, a one-time installation of pyomo and ipopt is required. The following commands will perform the needed installation when using the Anaconda distribution of Python.\n", "\n", " !conda install -c conda-forge pyomo\n", " !conda install -c conda-forge pyomo.extras\n", " !conda install -c conda-forge ipopt" ] }, { "cell_type": "markdown", "metadata": { "colab_type": "text", "id": "29eeNeG5HiH2" }, "source": [ "## A Pharmacokinetics Example\n", "\n", "Pharmacokinetics -- the study of the drugs and other substances administered to a living organism -- is a rich source of examples for simulation and optimization. Here we discuss a solution to a very simple problem.\n", "\n", "A patient is admitted to a clinic with a dangerous blood borne infection that needs to be treated with a specific antibiotic. The treatment requires a minimum therapeutic concentration of 20 mg/liter of blood, but, for safety reasons, should not exceed 40 mg/liter. The attending physician has established a target value of 25 mg/liter. The antibiotic will be administered to the patient by continuous infusion over a 72 hour period using a pump capable of delivering up to 50 mg/hour.\n", "\n", "![Infusionspumpe](https://upload.wikimedia.org/wikipedia/commons/thumb/e/ed/Infusionspumpe.JPG/256px-Infusionspumpe.JPG)\n", "\n", "(photo from [Pflegewiki-User Würfel](https://commons.wikimedia.org/wiki/File:Infusionspumpe.JPG), [CC BY-SA 3.0](http://creativecommons.org/licenses/by-sa/3.0/))\n", "\n", "The research literature shows dynamics of antibiotic concentration in the body behaves according to a one-compartment pharmacokinetic model\n", "\n", "\\begin{align*}\n", "V\\frac{dC}{dt} & = u(t) - k C\n", "\\end{align*}\n", "\n", "where $V$ is compartment volume (e.g., blood is about 5 liters in an adult), and $kC$ is the rate of elimination due to all sources, including metabolism and excretion. Based on an observed half-life in the blood of 8 hours, $k$ has an estimated value of 0.625 liters/hour. Given this information, what administration policy would you recommend?" ] }, { "cell_type": "markdown", "metadata": { "colab_type": "text", "id": "gPvUJdEuYqPr" }, "source": [ "## Simulation of Fixed Infusion Rate Strategy\n", "\n", "The first strategy we will investigate is constant infusion. At steady-state, the pharmacokinetic model becomes\n", "\n", "\\begin{align*}\n", "\\bar{u} & = k \\bar{C} \\\\\n", "& = 0.625 \\times 25 \\\\\n", "& = 15.625 \\mbox{ mg/hr}\n", "\\end{align*}\n", "\n", "The following cell simulates the patient response." ] }, { "cell_type": "code", "execution_count": 7, "metadata": { "colab": { "base_uri": "https://localhost:8080/", "height": 294 }, "colab_type": "code", "executionInfo": { "elapsed": 1061, "status": "ok", "timestamp": 1554231652418, "user": { "displayName": "Jeffrey Kantor", "photoUrl": "https://lh5.googleusercontent.com/-8zK5aAW5RMQ/AAAAAAAAAAI/AAAAAAAAKB0/kssUQyz8DTQ/s64/photo.jpg", "userId": "09038942003589296665" }, "user_tz": 240 }, "id": "QG8LbaTVJnkm", "outputId": "76b19a5c-76d3-4180-ef56-50e8d78fa7ef" }, "outputs": [ { "data": { "image/png": "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\n", "text/plain": [ "