{ "cells": [ { "cell_type": "markdown", "metadata": { "colab_type": "text", "id": "LzDhuJ4aSfhl" }, "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": { "colab_type": "text", "id": "5j3CdtFbSfhn" }, "source": [ "\n", "< [Simulation and Optimal Control in Pharmacokinetics](http://nbviewer.jupyter.org/github/jckantor/CBE30338/blob/master/notebooks/07.01-Simulation-and-Optimal-Control-in-Pharmacokinetics.ipynb) | [Contents](toc.ipynb) | [Simulation in Pyomo](http://nbviewer.jupyter.org/github/jckantor/CBE30338/blob/master/notebooks/07.03-Simulation-in-Pyomo.ipynb) >

\"Open

\"Download\"" ] }, { "cell_type": "markdown", "metadata": { "colab_type": "text", "id": "8C_vr6C0Jf8I" }, "source": [ "# Soft Landing a Rocket" ] }, { "cell_type": "markdown", "metadata": { "colab_type": "text", "id": "IJIPVYupiSrk" }, "source": [ "Landing a rocket on the surface of a planet was once a staple of science fiction, and then realized in the 1960's through multiple manned and unmanned landings on the moon. It's hard to overestimate the degree to which these missions inspired a new generation \n", " \n", "![Eagle In Lunar Orbit - GPN-2000-001210](https://upload.wikimedia.org/wikipedia/commons/thumb/c/cf/Eagle_In_Lunar_Orbit_-_GPN-2000-001210.jpg/256px-Eagle_In_Lunar_Orbit_-_GPN-2000-001210.jpg)\n", "\n", "[NASA Michael Collins [Public domain] via Wikimedia Commons](https://commons.wikimedia.org/wiki/File:Eagle_In_Lunar_Orbit_-_GPN-2000-001210.jpg)\n", "\n", "**Rocket Landing Videos** (these never get old):\n", "\n", "* [Apollo 11 Landing on the Moon, July 20, 1969](https://youtu.be/k_OD2V6fMLQ)\n", "* [SpaceX Falcon Heavy Side Boosters Landing at Kennedy Space Center, February 6, 2018 ](https://youtu.be/u0-pfzKbh2k)\n", "* [Blue Origin, November 24, 2014](https://youtu.be/9pillaOxGCo?t=103)\n", "\n", "Inspired by these examples, this notebook uses Pyomo and a simple model of a rocket to compute a control policy for a soft landing. The parameters used correspond to the descent of the Apollo 11 Lunar Module to the moon on July 20, 1969." ] }, { "cell_type": "markdown", "metadata": { "colab_type": "text", "id": "r1DkXPM5wif0" }, "source": [ "## Required Installations\n", "\n" ] }, { "cell_type": "markdown", "metadata": { "colab_type": "text", "id": "WEEvIuiuqYXd" }, "source": [ "### Google Colab\n", "\n", "The following cell installs the necessary packages and solvers on Google Colab. This installation must be done for each Google Colab session." ] }, { "cell_type": "code", "execution_count": 0, "metadata": { "colab": {}, "colab_type": "code", "id": "p00rSCoTwTd5" }, "outputs": [], "source": [ "!pip install -q pyomo==5.6.1\n", "!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": "markdown", "metadata": { "colab_type": "text", "id": "-o3F-AGzL8Xi" }, "source": [ " ### MacOS\n", " \n", " On MacOS, replace the above cell with the following text to perform a one-time installation.\n", " \n", " !pip install -q pyomo\n", " !curl https://ampl.com/dl/open/ipopt/ipopt-osx.zip --output ipopt-osx.zip --silent\n", " !unzip -o -q ipopt-osx\n", " ipopt_executable = './ipopt'" ] }, { "cell_type": "markdown", "metadata": { "colab_type": "text", "id": "2r-wdJM9qszE" }, "source": [ "### Windows PC\n", "\n", "Pyomo can be installed by executing\n", "\n", " !pip install -q pyomo\n", " \n", "into a Jupyter notebook cell. An ipopt binary executable is available from [ampl.com](https://ampl.com/products/solvers/open-source/). More specific instructions for a one-tme installation on Windows PC will be forthcoming. " ] }, { "cell_type": "markdown", "metadata": { "colab_type": "text", "id": "se0qY6Xfrlv5" }, "source": [ "## Python Initializations" ] }, { "cell_type": "code", "execution_count": 0, "metadata": { "colab": {}, "colab_type": "code", "id": "ISnPZ93d5Zvr" }, "outputs": [], "source": [ "import matplotlib.pyplot as plt\n", "from pyomo.environ import *\n", "from pyomo.dae import *\n", "import numpy as np" ] }, { "cell_type": "markdown", "metadata": { "colab_type": "text", "id": "6VFVBpH9pt0M" }, "source": [ "## Version 1: Vertical Dynamics of a Rocket with Constant Mass\n", "\n", "For a rocket with a mass $m$ in vertical flight at altitude $h$, a momentum balance yields the model\n", "\n", "\\begin{align*}\n", "m\\frac{d^2h}{dt^2} & = - m g + v_eu \\\\\n", "\\end{align*}\n", "\n", "where $u$ is the mass flow of propellant and $v_e$ is the velocity of the exhaust relative to the rocket. In this first attempt at modeling and control we will neglect the change in rocket mass due to fuel burn.\n", "\n", "![LM illustration 02-IT](https://upload.wikimedia.org/wikipedia/commons/thumb/1/13/LM_illustration_02-IT.png/256px-LM_illustration_02-IT.png)\n", "\n", "[NASA Marshall Space Flight Center (NASA-MSFC)derivative work: Adert [Public domain]](https://commons.wikimedia.org/wiki/File:LM_illustration_02-IT.png)\n", "\n", "The complete Apollo lunar module was composed of descent and ascent stages, each containing a rocket engine and associated fuel tanks. The descent stage carried the entire assembly to the lunar surface. The total mass $m$ in the above model therefore consists of the dry and fuel masses of both stages. For the purpose of analyzing the descent of the lunar module to the lunar surface, the 'dry' mass consists of the total mass of the ascent stage plus the dry mass of the descent stage. \n", "\n", "The following data is for the [Apollo 11 Lunar Module](https://nssdc.gsfc.nasa.gov/nmc/spacecraft/display.action?id=1969-059C)." ] }, { "cell_type": "code", "execution_count": 0, "metadata": { "colab": {}, "colab_type": "code", "id": "r-GXDIYS4bao" }, "outputs": [], "source": [ "# lunar module\n", "m_ascent_dry = 2445.0 # kg mass of ascent stage without fuel\n", "m_ascent_fuel = 2376.0 # kg mass of ascent stage fuel\n", "m_descent_dry = 2034.0 # kg mass of descent stage without fuel\n", "m_descent_fuel = 8248.0 # kg mass of descent stage fuel\n", "\n", "m_fuel = m_descent_fuel\n", "m_dry = m_ascent_dry + m_ascent_fuel + m_descent_dry\n", "m_total = m_dry + m_fuel\n", "\n", "# descent engine characteristics\n", "v_exhaust = 3050.0 # m/s\n", "u_max = 45050.0/v_exhaust # 45050 newtons / exhaust velocity\n", "\n", "# landing mission specifications\n", "h_initial = 100000.0 # meters\n", "v_initial = 1520 # orbital velocity m/s\n", "g = 1.62 # m/s**2" ] }, { "cell_type": "markdown", "metadata": { "colab_type": "text", "id": "xCL3kAIJ0hDU" }, "source": [ "### First attempt at a solution\n", "\n", "For this first attempt at a solution, we will choose an arbitrary value for the length of the landing mission. The integration will start with the initial conditions, and we'll see what happens." ] }, { "cell_type": "code", "execution_count": 4, "metadata": { "colab": { "base_uri": "https://localhost:8080/", "height": 226 }, "colab_type": "code", "executionInfo": { "elapsed": 6600, "status": "ok", "timestamp": 1556833347770, "user": { "displayName": "Jeffrey Kantor", "photoUrl": "https://lh5.googleusercontent.com/-8zK5aAW5RMQ/AAAAAAAAAAI/AAAAAAAAKB0/kssUQyz8DTQ/s64/photo.jpg", "userId": "09038942003589296665" }, "user_tz": 240 }, "id": "O10AnUPfr9GY", "outputId": "254fa7a5-87b7-45d7-b60c-f74d21d30888" }, "outputs": [ { "data": { "image/png": "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\n", "text/plain": [ "

" ] }, "metadata": { "tags": [] }, "output_type": "display_data" } ], "source": [ "t_f = 100\n", "\n", "m = ConcreteModel()\n", "m.t = ContinuousSet(bounds=(0, t_f))\n", "m.h = Var(m.t)\n", "m.u = Var(m.t, domain=NonNegativeReals)\n", "\n", "m.v = DerivativeVar(m.h, wrt=m.t)\n", "m.a = DerivativeVar(m.v, wrt=m.t)\n", "\n", "m.ode1 = Constraint(m.t, rule = lambda m, t: m_total*m.a[t] == -m_total*g + v_exhaust*m.u[t])\n", "\n", "m.h[0].fix(h_initial)\n", "m.v[0].fix(-v_initial)\n", "\n", "def solve(m):\n", " \n", " TransformationFactory('dae.finite_difference').apply_to(m, nfe=50, method='forward')\n", " SolverFactory('ipopt', executable=ipopt_executable).solve(m)\n", " \n", " tsim = [t for t in m.t]\n", " hsim = [m.h[t]() for t in m.t]\n", " usim = [m.u[t]() for t in m.t]\n", "\n", " plt.subplot(3,1,1)\n", " plt.plot(tsim, hsim)\n", " plt.title('altitude')\n", " plt.xlabel('time / seconds')\n", " plt.ylabel('meters')\n", "\n", " plt.subplot(3,1,2)\n", " plt.plot(tsim, usim)\n", " plt.title('engine mass flow')\n", " plt.xlabel('time / seconds')\n", " plt.ylabel('kg/sec')\n", "\n", " plt.tight_layout()\n", "\n", "solve(m)" ] }, { "cell_type": "markdown", "metadata": { "colab_type": "text", "id": "oKNqzok9f6U8" }, "source": [ "This first attempt at a solution included no specification related to landing on the lunar surface. The solver reported a solution where the engine doesn't fire, and the lunar module crashes into the lunar surface at full speed about 66 seconds after the start of the descent mission." ] }, { "cell_type": "markdown", "metadata": { "colab_type": "text", "id": "rRPLHyG16Qfo" }, "source": [ "### Land on the surface, not above or below the surface." ] }, { "cell_type": "markdown", "metadata": { "colab_type": "text", "id": "1LlcohOc1IqZ" }, "source": [ "The mission crashed! It's clear now that we haven't fully specified the desired outcome of the mission. Let's start by specifying the final condition as being on the surface\n", "\n", "$$h(t_f) = 0$$\n", "\n", "This condition is implemented in Pyomo by fixing the terminal value of $h$." ] }, { "cell_type": "code", "execution_count": 5, "metadata": { "colab": { "base_uri": "https://localhost:8080/", "height": 226 }, "colab_type": "code", "executionInfo": { "elapsed": 6955, "status": "ok", "timestamp": 1556833348134, "user": { "displayName": "Jeffrey Kantor", "photoUrl": "https://lh5.googleusercontent.com/-8zK5aAW5RMQ/AAAAAAAAAAI/AAAAAAAAKB0/kssUQyz8DTQ/s64/photo.jpg", "userId": "09038942003589296665" }, "user_tz": 240 }, "id": "WJzcGDHm1H2p", "outputId": "c1bb489e-026e-4d69-e7e9-7cfc26c00558" }, "outputs": [ { "data": { "image/png": "iVBORw0KGgoAAAANSUhEUgAAAagAAADRCAYAAACZ6CZ9AAAABHNCSVQICAgIfAhkiAAAAAlwSFlz\nAAALEgAACxIB0t1+/AAAADl0RVh0U29mdHdhcmUAbWF0cGxvdGxpYiB2ZXJzaW9uIDMuMC4zLCBo\ndHRwOi8vbWF0cGxvdGxpYi5vcmcvnQurowAAIABJREFUeJzt3XmcXWWd5/HP997a96yVPSEQCAHD\nFoTW1kakW1BH7BnFtrFBmmm01RZcXo7ba2ztdsYee1ob7WEEVMC2UQRU3GFoBLQlmLAlBDCQELNX\nttr3qt/88Ty36lSltqTq1r259Xu/Xvd1z3nOuec+p05S3zrnPOd5ZGY455xz+SaV6wo455xzI/GA\ncs45l5c8oJxzzuUlDyjnnHN5yQPKOedcXvKAcs45l5c8oJzLMUnvlvSrMZa/RtILU/h9F0naNVXb\ncy5bPKCcyzOSTNIpmXkze9TMTkssf1nSJbmpnXPTxwPKOedcXvKAcm6aSPq4pJcktUjaIulPR1jn\nkTj5tKRWSe9IXpKT9C1gGfCjuPxjI12yS55lSSqXdJukI5K2AOcPW3eRpHskHZC0XdIHs7H/zh0r\nDyjnps9LwGuAWuCzwL9KWphcwcxeGyfPMrMqM/vusOV/Afwe+E9x+f+awPd+Bjg5vt4AXJ1ZICkF\n/Ah4GlgMvB64QdIbjmP/nJtSHlDOTRMz+56Z7TGz/hg8W4FXTsNXXwF83swOm9lO4MbEsvOBeWb2\nOTPrNrNtwC3An01DvZwbU1GuK+DcTCHpKuDDwIpYVAXMBfqy/NWLgJ2J+R2J6eXAIkmNibI08GiW\n6+TcuDygnJsGkpYTzkxeD/zGzPokPQXoODY3fAiCNqAi8V1pYF5i+V5gKfBsnF+WWLYT2G5mq46j\nHs5llV/ic256VBKC5QCApGuAM0dZdz+wcoxtDV/+O6BM0pskFQOfBkoTy+8CPiFplqQlwN8klj0O\ntEj6b7ExRVrSmZKGNKRwLhc8oJybBma2BfjfwG8IAfMK4NejrP63wO2SGiVdMcLy/wl8Oi7/qJk1\nAe8DbgV2E86okq36Pku4rLcduB/4VqJefcCbgbPj8oNxO7XHt6fOTR35gIXOOefykZ9BOeecy0se\nUM455/KSB5Rzzrm8lLWAkvQNSQ2SNifKZkt6QNLW+D4rlkvSjZJelPSMpHMTn7k6rr9VUvIJ+PMk\n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\n", "text/plain": [ "
" ] }, "metadata": { "tags": [] }, "output_type": "display_data" } ], "source": [ "t_f = 100\n", "\n", "m = ConcreteModel()\n", "m.t = ContinuousSet(bounds=(0, t_f))\n", "m.h = Var(m.t)\n", "m.u = Var(m.t, domain=NonNegativeReals)\n", "\n", "m.v = DerivativeVar(m.h, wrt=m.t)\n", "m.a = DerivativeVar(m.v, wrt=m.t)\n", "\n", "m.ode1 = Constraint(m.t, rule = lambda m, t: m_total*m.a[t] == -m_total*g + v_exhaust*m.u[t])\n", "\n", "m.h[0].fix(h_initial)\n", "m.v[0].fix(-v_initial)\n", "\n", "m.h[t_f].fix(0) # land on surface\n", "\n", "solve(m)" ] }, { "cell_type": "markdown", "metadata": { "colab_type": "text", "id": "PoYrTis6hdhF" }, "source": [ "The descent mission now finishes the descent at the lunar surface, but unfortunately arrives with sufficient velocity to still be considered a crash." ] }, { "cell_type": "markdown", "metadata": { "colab_type": "text", "id": "3S3MHmIt6ZTD" }, "source": [ "### Make that a soft landing.\n", "\n", "To ensure a soft landing, we also need to specify a terminal velocity. The terminal conditions are now\n", "\n", "\\begin{align*}\n", "h(t_f) & = 0 \\\\\n", "v(t_f) & = 0\n", "\\end{align*}\n", "\n", "These conditions are implement by fixing terminal values of the associated Pyomo variables." ] }, { "cell_type": "code", "execution_count": 6, "metadata": { "colab": { "base_uri": "https://localhost:8080/", "height": 226 }, "colab_type": "code", "executionInfo": { "elapsed": 7403, "status": "ok", "timestamp": 1556833348588, "user": { "displayName": "Jeffrey Kantor", "photoUrl": "https://lh5.googleusercontent.com/-8zK5aAW5RMQ/AAAAAAAAAAI/AAAAAAAAKB0/kssUQyz8DTQ/s64/photo.jpg", "userId": "09038942003589296665" }, "user_tz": 240 }, "id": "aukLNi483BJp", "outputId": "774b14b7-3464-4f6d-e52e-0dd2d4578846" }, "outputs": [ { "data": { "image/png": "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\n", "text/plain": [ "
" ] }, "metadata": { "tags": [] }, "output_type": "display_data" } ], "source": [ "t_f = 100\n", "\n", "m = ConcreteModel()\n", "m.t = ContinuousSet(bounds=(0, t_f))\n", "m.h = Var(m.t)\n", "m.u = Var(m.t, domain=NonNegativeReals)\n", "\n", "m.v = DerivativeVar(m.h, wrt=m.t)\n", "m.a = DerivativeVar(m.v, wrt=m.t)\n", "\n", "m.ode1 = Constraint(m.t, rule = lambda m, t: m_total*m.a[t] == -m_total*g + v_exhaust*m.u[t])\n", "\n", "m.h[0].fix(h_initial)\n", "m.v[0].fix(-v_initial)\n", "\n", "m.h[t_f].fix(0) # land on surface\n", "m.v[t_f].fix(0) # soft landing\n", "\n", "solve(m)" ] }, { "cell_type": "markdown", "metadata": { "colab_type": "text", "id": "_HGVey32iyk0" }, "source": [ "The lunar module now is now successfully landing on the lunar surface, but the fuel flow requirement exceeds the maximum capacity of the descent engine." ] }, { "cell_type": "markdown", "metadata": { "colab_type": "text", "id": "Yto7Dr_M78yh" }, "source": [ "### Restrict fuel flow to engine capacity.\n", "\n", "The next step is establish constraints on the control action by limiting fuel flow to the mass flow limits of the descent engine.\n", "\n", "$$ 0 \\leq u(t) \\leq u_{max}$$\n", "\n", "Since less thrust is available, we may need to extend the length of the landing mission to find a feasible solution to the optimization problem." ] }, { "cell_type": "code", "execution_count": 7, "metadata": { "colab": { "base_uri": "https://localhost:8080/", "height": 226 }, "colab_type": "code", "executionInfo": { "elapsed": 7825, "status": "ok", "timestamp": 1556833349021, "user": { "displayName": "Jeffrey Kantor", "photoUrl": "https://lh5.googleusercontent.com/-8zK5aAW5RMQ/AAAAAAAAAAI/AAAAAAAAKB0/kssUQyz8DTQ/s64/photo.jpg", "userId": "09038942003589296665" }, "user_tz": 240 }, "id": "8tKc70HL68e5", "outputId": "a8e881d4-f8d7-4b57-a277-bd8a187ac745" }, "outputs": [ { "data": { "image/png": "iVBORw0KGgoAAAANSUhEUgAAAagAAADRCAYAAACZ6CZ9AAAABHNCSVQICAgIfAhkiAAAAAlwSFlz\nAAALEgAACxIB0t1+/AAAADl0RVh0U29mdHdhcmUAbWF0cGxvdGxpYiB2ZXJzaW9uIDMuMC4zLCBo\ndHRwOi8vbWF0cGxvdGxpYi5vcmcvnQurowAAIABJREFUeJzt3Xd8HOWd+PHPd1e997UtW5LlijA2\n2MamGrADGFIIOUIgEEgul0ZIvbwScsnlSHL3Sy65XO6SSzsSLpDc0RJIgBR6D9jY4F5lucq2eu/S\nfn9/zCOxVtSstrvS9/16zWtnnpmd/T6alb6amWeeR1QVY4wxJtL4wh2AMcYYMxBLUMYYYyKSJShj\njDERyRKUMcaYiGQJyhhjTESyBGWMMSYiWYIyJsKIyAdF5OUh1l8sInvH8fMuFZFj47U/Y8aLJShj\nIpyIqIjM711W1ZdUdVHI+kMi8rbwRGfMxLEEZYwxJiJZgjImTETkDhE5ICJNIrJLRK4dYJsX3exW\nEWkWkfeFXpITkV8BBcBjbv0XB7pkF3qWJSKJIvJLEakTkV3Auf22nSUivxWRKhE5KCKfnoj6GzMc\nS1DGhM8B4GIgHfg68GsRmRm6gaqucbPLVDVFVR/ot/4DwBHgnW79d0bwuf8EzHPTlcCtvStExAc8\nBmwF8oF1wGdF5MpR1M+YMbEEZUyYqOpDqnpcVYMu8ewHVk3CR18P/Iuq1qrqUeAHIevOBXJV9Ruq\n2qmqZcBdwA2TEJcxp4gJdwDGTFcicgvweaDIFaUAOUDPBH/0LOBoyPLhkPlCYJaI1IeU+YGXJjgm\nY/6KJShjwkBECvHOTNYBr6pqj4hsAWQUu+s/JEELkBTyWX4gN2T9CWAOsNMtF4SsOwocVNUFo4jD\nmHFll/iMCY9kvMRSBSAiHwKWDLJtBVA8xL76r98HJIjI20UkFvgqEB+y/kHgyyKSKSKzgU+FrNsI\nNInIl1xjCr+ILBGRUxpSGDMZLEEZEwaqugv4HvAqXoI5C3hlkM3vBO4RkXoRuX6A9d8CvurWf0FV\nG4DbgJ8D5XhnVKGt+r6Od1nvIPAk8KuQuHqAdwBnu/XVbj/po6upMaMnNmChMcaYSGRnUMYYYyKS\nJShjjDERyRKUMcaYiGQJyhhjTESyBGWMMSYi2YO6I5STk6NFRUXhDsMYY6Le5s2bq1U1d7jtLEGN\nUFFREZs2bTrt93X3BLnj4e387YVzKZmVNgGRGWNMdBGRw8NvZZf4Jtzh2lae31vFNT96mR8+s5+u\nnmC4QzLGmKgwrROUiKwXkb0iUioid0zEZ8zLTeGpz61h/ZKZfO+pfbznx39hX0XTRHyUMcZMKdM2\nQbkONH8EXAWUADeKSMlEfFZmchw/vPEcfnzTcsrr23jHD17mJ88foCdovXgYY8xgpm2Cwht3p1RV\ny1S1E7gfuGYiP/Dqs2by5OfWsHZxHv/65z1c99O/UFrZPJEfaYwxUWs6N5LI59QxcY4Bqyf6Q3NS\n4vnJzct5bNsJvvb7HVz9ny/xycvm84lL5xEXM53/XzDGTKS2zh6qmzuob+2ivq2TutYuGlo7qW/t\norG9i/auIG1dPbR39dDeFaSju4eOrsHvmX9kTTGXlwQmNOYRJSgRuRDYoqotInIzsBz4T1UdUUuM\naCUiHwU+ClBQUDDM1qe1X961bBbnF2fzjcd38f2n9/H4tuN8+2/OYkVh1rh9jjFmeujuCXKioZ3D\nNa0crm3heH0bFY0dVDS2c7KhnZON7TS1dw/6/oRYH4mxfhJOmXzEx/iQQYYo841m5LLTNKLezEVk\nG7AMWAr8Eq/7/etV9ZIJjW4Cicj5wJ2qeqVb/jKAqn5roO1Xrlypo2lmPhLP7qngq4/s4ERjOzev\nLuSL6xeRmhA7IZ9ljIle9a2d7KtoZl9FE6WVzRysbuFIbStHa1vpDrmn7fcJeanxBNISCKTFMyMt\ngUB6Ajkp8WQmxZGRFEtGYizpSbGkJ8YSH+Of1HqIyGZVXTnsdiNMUG+o6nIR+RpQrqq/6C0bj2DD\nQURi8AZ2W4c3Zs7rwPtVdedA209kggJo7ujm357Yyz2vHiKQmsDXrzmTK0oCiEzCvynGmIjS3ROk\ntKqZ7cca2Hm8kX0VTeyvbKaqqaNvm5T4GIpykijMSqYwO4nC7CQK3HwgLQH/ZJzijNJIE9RI70E1\nuTOMm4E1IuIDovpffFXtFpHbgScAP3D3YMlpMqTEx3Dnu87k3efkc8dvt/GxX23m0kW53PnOMynK\nSQ5XWMaYCdYTVPZVNLHlaD07yhvYcbyRPSca6ej27v8kxflZEEjl0oW5LAyksiCQwsJAKjPTE6b8\nP7AjPYOaAbwfeF1VXxKRAuBSVb13ogOMFBN9BhWqqyfIva8e5vtP7aOzO8jHLinmtkvnkxg3uafh\nxpjxV9/ayZtH6nnjSB1vHKlj69EGmju8+0OpCTEsmZXOkvw0luSnsyQ/nbnZyfgi+GxoNMbtEp97\nXuhpVb1svIKLRpOZoHpVNrbzrT/t4ZE3y8nPSORr7yyxy37GRJnKpnY2lNWy4WANG8pq2e8eLfH7\nhMUzUllekMnywgzOmZNJYXbStPj9Hu97UM8A71HVhvEILhqFI0H12lBWw9d+v5O9FU2sWZjLP779\nDBYEUsMSizFmaNXNHbxSWs1rZV5CKqtuASA5zs/KoixWzc1ieUEmS2enkxw/PZ/0Ge8E9XvgHOAp\noKW3XFU/PZYgo0k4ExS8ddnvP57eR2tnDzeumsPn3raQ7JT4sMVkjPGeL9p4qJaX91fxcmkNu080\nAt7lulVFWawuzmL13GzOnJVGjN+edYTxT1C3DlSuqveMIraoFO4E1au2pZP/fHofv95whKRYP59c\nO58PXlBEQqzdnzJmMqgq+yqaeX5vJS/sq2LToTo6e4LE+X2sLMrkwvk5XDQ/hyX56RHdki6cxjVB\nuR0mAgWquneswUWjSElQvUorm/nWH3fzzJ5KZmcm8qX1i3nH0pnT4vq1MZOtqb2LV0qreWFfFc/v\nreJEQzsAi2eksmZhLhfNz+HcoixryDRC430G9U7g34A4VZ0rImcD31DVd4091OgQaQmq18v7q/nn\nP+xiz8kmzspP5wtXLmLNghxLVMaM0aHqFp7ZU8mzeyrYUFZLd1BJjY/hogU5XLoolzULc5mZnhju\nMKPSeCeozcBa4HlVPceV7VDVJWOONEpEaoIC7zmKR94s5/tP7aO8vo1Vc7P40vpF1m2SMaehuyfI\npsN1PLunkqd3V1BW5d1uXxhIYe3iAJctymV5YSaxdh9pzMb7Qd0uVW3o91+5jbwXIfw+4boVs3nn\nspncv/EoP3y2lL/5yausXZzHF65YZCP5GjOI5o5uXtxXxdO7Knh2byX1rV3E+oXzirO55bxC1i4O\nUJCdFO4wp62RJqidIvJ+wC8iC4BPA3+ZuLDMaMTH+Ln1giLeu3I2//PKIX72wgGu/sFLrD9zBp9a\nN58zZ6WHO0Rjwq6ysZ2ndlfw1K4K/lJaQ2dPkIykWNYuyuNtJQHWLMwlZZo2/440I73ElwR8BbjC\nFT0BfFNVOwZ/19QSyZf4BtPQ2sXPXy7jl68coqmjm7edkcen1i5g2ZyMcIdmzKQqrWzmyV0neXJn\nBVuO1gNQkJXE5SUBLi8JsLIw05qAT6Lxvgf1XlV9aLiyqSwaE1SvhrYufvnKIe5+5SANbV2sWZjL\np9fOZ2WR3aMyU1MwqGw5Vs+TOyt4ctfJvvtJS2enc0VJgMtLZrAwkGKNicJkQnozH65sKovmBNWr\nqb2LX792hJ+/VEZNSyerirL4yJpi1i3Om3J9fZnpp6O7h1cP1PDkLu/yXVVTBzE+4fx52VxREuBt\nJQFrdRchxiVBichVwNXA9cADIavSgBJVXTXWQKPFVEhQvVo7u7lv41Hufvkg5fVtFOck83cXF/Oe\n5fn2wK+JKg1tXTy/t5KndlXw/N4qmju6SY7zc+miPK44M8Cli/JIT4zqgRempPFKUMuAs4FvAF8L\nWdUEPKeqdWMNNFpMpQTVq7snyB93nOSuF8vYXt5AdnIcHzi/kJvPKyTHulAyEep4fRtPubOk18pq\n6A4qOSlxXF4S4IqSGZw/L9v+0Ypw432JLxavxZ/1JDEFqSobDtZy14tlPLOnkji/j6vPmsEHzi9k\neUGmXac3YaWq7DzeyDO7K3lq90l2lHt93RXnJrukFODsOZnWrVAUieieJETkTuAjQJUr+gdV/aNb\n92Xgw0AP8GlVfcKVrwf+E29wwZ+r6rdd+VzgfiAb2Ax8QFU7RSQeuBdYAdQA71PVQ0N9xlCmcoIK\nVVrZzK9fO8xvNx+jqaObkplpfOD8Qq45exZJcdb01kyO9q4eXi2r4ZndFTyzu5ITDe2IwPKCzL6W\nd/NyU8IdphmlyehJYruqnjXK4O4EmlX13/qVlwD3AauAWcDTwEK3eh9wOXAMb3j2G1V1l4g8CDys\nqveLyE+Brar6ExG5DViqqh8XkRuAa1X1fYN9hqr2DBXzdElQvVo6uvndlnJ+9eph9pxsIjUhhvec\nk897V85hSb49T2XGX0VjO8/tqeTZPZW8XFpNa2cPSXF+Ll6Qw7ozAqxdnGeXnqeIyehJYmS9zJ6e\na4D73fNVB0WkFC+RAJSqahmAiNwPXCMiu/ES5/vdNvcAdwI/cfu605X/Bvgv8Sow2Ge8OgH1iVrJ\n8THctLqQ968qYPPhOu599TD3bTzKPa8e5oyZabx3xWzefU4+Wclx4Q7VRKmeoLLlaB3P7ani2T2V\n7HLDVMxMT+A9y/NZd0aA84vtftJ0Fs6eJG4XkVuATcDfuwYX+cBrIdscc2UAR/uVr8a7rFevqt0D\nbJ/f+x5V7RaRBrf9UJ9h+hERVhZlsbIoi/rWTh7depyHNh3jG4/v4lt/2s3bzghw3YrZXLwgl7gY\ne9DRDK2ysZ0X93u9gr+8v4q61i58AisKM/ni+kWsXZzHokCq3fc0wMgT1KfwepLoAP4P15PEUG8Q\nkaeBGQOs+greGc438c7Cvgl8D/jbEcYyaUTko8BHAQoKCsIcTfhlJMVxy/lF3HJ+EXtONvLQpmP8\n7s1y/rTjJOmJsVy1ZAbvXDaL1XOz7Kl8A3jPJm0+XMcL+6p4cV9132B+OSnxXLYoj0sX53HJglzS\nk6wpuPlrI01QJW6KcdM1wLuApYO9QVXfNpIdi8hdwONusRyYE7J6titjkPIaIENEYtxZVOj2vfs6\nJiIxQLrbfqjP6F+H/wb+G7x7UCOpz3SxeEYa//iOEr60fjEv7a/i8W0neGzrce5//Sg5KXFcfdZM\n3rF0FisKrXXVdBIMKrtONPJKaTWvHKhh48Ea2ruCxPql7yxpzYJcSmam2cPhZlgjTVD/C3wB2ME4\n9GIuIjNV9YRbvNbtF+BR4P9E5N/xGjAsADYCAixwLfbKgRuA96uqishzwHV4LfluBX4fsq9b8e4t\nXQc867Yf7DPMKMTF+Fh3RoB1ZwRo7+rhuT2VPL7tBA9uOsq9rx4mOzmOtYvzuLwkwMULcm1AtylG\nVSmtbOa1g7W8eqCaVw/UUNfaBcCCvBRuOLeAC+fncP68bOuA1Zy2kX5jqlT1sXH83O+4puoKHAI+\nBqCqO12rvF1AN/DJ3tZ1InI73qVFP3C3qu50+/oScL+I/DPwJvALV/4L4FeuEUQtXlIb8jPM2CTE\n+rnqrJlcddZMWjq6eXaP94T/n3ee5KHNx4iP8XHxghwuLwlwycI8ZqQnhDtkc5qCQWVvRRMbymrY\ncLCWjQdrqWnpBLzGDevOCHDh/GwumJdDIM2OrxmbkTYzXwfcCDyDdx8KAFV9eOJCiyzTrZn5eOrq\nCbLxYG3f0//l9W2A9x/2xQtyuXhhDqvnZtlzVhGopaObrUfr2Xy4js1H6njjcB2N7V6bpPyMRFYX\nZ3He3GxWF2dRkJVkjRvMiIz3c1C/BhYDO3nrEp+qasQ1bJgolqDGh6qy52QTL+2v4qX91Ww8WEtH\nd5A4v48VhZmcPy+blUWZnDMn0y4HTrKeoHKgqpmtR+vZdqyBN47UsftEI0H3J2JhIIUVhZmsLMxi\ndXEWszNtID8zOuOdoPaq6qJxiSxKWYKaGO1dPbx+qJaX91fz4v5q9pxsRBVi/cKS/HTOLcri3KIs\nlhdkkG0PaY6bnqBysLqFXSca2Xa0nm3lDewsb6Cl07vanRznZ9mcDFYUZrKi0PuHwVramfEy3gnq\nf4Dvququ8QguGlmCmhwNrV1sPlLL64fqeP1gLduONdDZ452052ckclZ+OmfNTvde89PJtAeFh1Xf\n2sm+imZ2n2jsm/ZWNNHe5f1c42J8nDkrjaX56SydncHS2ekU56ZY60szYcY7Qe0G5gEH8e5BCd4l\nvkGbmU81lqDCo72rh23HGrzLTuUNbD9Wz6Ga1r71+RmJLAyksDCQyoJAKgsDKczPS5l297O6e4Kc\naGjnYHULpZXNlFY1U1rZTFlVM9XNnX3bZSTFUjIzjTP6plQWBlKJtefWzCQa766O1o8xHmNGJSHW\nz6q5Waya+9bovw1tXewsb2BbeQO7jjeyr6KJV0pr+s60RLzEVZidREFWEgVZye41iTlZiaQnxkbd\nzfzuniBVzR2cbGjnZEM7x+raOFzbwpHaNo7UtHCsro3u4Fv/bKYlxDA/L4W1i/OYn+cl7TNmpjEj\nLSHq6m6mrxGdQRk7g4p03T1BDte2sr+imf0VTZRWNXOktpUjNa19zaB7JcT6CKQlEEhNIC8t3ptP\niyczKY6MpDgykmJJT4wlIzGW9KRY4mPGt7GGqtLeFaS5o5uWjm6a2rupa+2ktqWTmpZOals6vPnm\nTiqbvKRU2dROsN+vanpiLIXZSczJSqLQJeDC7GTm56WQkxJnichErHG9xGcsQUWz5o5ujtS0cqS2\nlaO1rVQ0tlPR1EFFYzuVje2cbGzvux8zkFi/kBDjJyHOT2Ksn4RYH4mxfmL9PnwiIOATEASfD1Sh\nu0fp7AnS1TcpHV09XlLq7KGnf7YJ4fcJmUlxZCXHEkhLYEZaAjPTEwike68z0hLJz0i0Rgsmao33\nJT5jolZKfAwls9IomZU24HpVpamjm/qWLurbOmlo66K+tYv6ti4aWjtp6eyhvat3CtLW2UN7dw+d\n3UFUIahKUEE1iPZ4T5/H+X2kxcUS5xdi/b6+KSXeT0pCDMnxMaTGx3jzcTFkJceRmRxHdnIcaQmx\n1g2QMViCMgYRIS0hlrSEWAqwZ3uMiRR2iW+ERKQKODyGXeQA1eMUTrhNpbrA1KrPVKoLTK36TKW6\nwNjqU6iqucNtZAlqkojIppFcc40GU6kuMLXqM5XqAlOrPlOpLjA59bGHH4wxxkQkS1DGGGMikiWo\nyfPf4Q5gHE2lusDUqs9UqgtMrfpMpbrAJNTH7kEZY4yJSHYGZYwxJiJZgppgIrJeRPaKSKmI3BHu\neEZKRA6JyHYR2SIim1xZlog8JSL73WumKxcR+YGr4zYRWR7m2O8WkUoR2RFSdtqxi8itbvv9InJr\nOOri4hioPneKSLk7PltE5OqQdV929dkrIleGlIf9uygic0TkORHZJSI7ReQzrjzqjs8QdYnWY5Mg\nIhtFZKurz9dd+VwR2eBie0BE4lx5vFsudeuLQvY1YD1Pm6raNEET3vD0B4BiIA7YCpSEO64Rxn4I\nyOlX9h3gDjd/B/Cvbv5q4E94vdyfB2wIc+xrgOXAjtHGDmQBZe41081nRlB97gS+MMC2Je57Fg/M\ndd8/f6R8F4GZwHI3nwrsczFH3fEZoi7RemwESHHzscAG9zN/ELjBlf8U+ISbvw34qZu/AXhgqHqO\nJiY7g5pYq4BSVS1T1U7gfuCaMMc0FtcA97j5e4B3h5Tfq57XgAwRmRmOAAFU9UWgtl/x6cZ+JfCU\nqtaqah3wFGHq1X+Q+gzmGuB+Ve1Q1YNAKd73MCK+i6p6QlXfcPNNwG4gnyg8PkPUZTCRfmxUVZvd\nYqybFFgL/MaV9z82vcfsN8A6EREGr+dpswQ1sfKBoyHLxxj6CxxJFHhSRDaLyEddWUBVT7j5k0DA\nzUdDPU839mio0+3ustfdvZfEiKL6uEtC5+D9px7Vx6dfXSBKj42I+EVkC1CJl/QPAPWq2j1AbH1x\nu/UNQDbjWB9LUGYwF6nqcuAq4JMisiZ0pXrn8lHZBDSaYw/xE7xBRM8GTgDfC284p0dEUoDfAp9V\n1cbQddF2fAaoS9QeG1XtUdWzgdl4Zz2LwxmPJaiJVQ7MCVme7coinqqWu9dK4BG8L2tF76U791rp\nNo+Gep5u7BFdJ1WtcH9MgsBdvHUJJeLrIyKxeH/Q/1dVH3bFUXl8BqpLNB+bXqpaDzwHnI93WbW3\nY/HQ2PriduvTgRrGsT6WoCbW68AC1womDu9G4qNhjmlYIpIsIqm988AVwA682HtbS90K/N7NPwrc\n4lpcnQc0hFyuiRSnG/sTwBUikuku0VzhyiJCv3t81+IdH/Dqc4NrYTUXWABsJEK+i+4exS+A3ar6\n7yGrou74DFaXKD42uSKS4eYTgcvx7qs9B1znNut/bHqP2XXAs+7sd7B6nr7Jbiky3Sa8Vkj78K7l\nfiXc8Yww5mK8VjhbgZ29ceNdX34G2A88DWS5cgF+5Oq4HVgZ5vjvw7u00oV3/fvDo4kd+Fu8G7yl\nwIcirD6/cvFuc38QZoZs/xVXn73AVZH0XQQuwrt8tw3Y4qaro/H4DFGXaD02S4E3Xdw7gK+58mK8\nBFMKPATEu/IEt1zq1hcPV8/TnawnCWOMMRHJLvEZY4yJSJagjDHGRCRLUMYYYyKSJShjjDERyRKU\nMcaYiGQJypgxEJEMEbktZHmWiPxmqPeM4bNiReSNidj3WIhIkYT0tG7MeLEEZczYZOD16gyAqh5X\n1euG2H4sLgJemaB9GxNxLEEZMzbfBua5cX++G3o2ISIfFJHfiTe+0SERuV1EPi8ib4rIayKS5bab\nJyJ/dh3zviQig/V/th5v6Ik+rnPPX4rIDvHG7/rcUPsUkYCIPCLemD9bReQCV/55t48dIvJZV1Yk\nIrtF5C7xxgd60vUwgIis6N0H8MmQeM4Ub0yhLa6z1AXj+cM200w4nli2yaapMgFFnDpOU98y8EG8\np+xTgVy83p4/7tZ9H69zUfB6UFjg5lfjdRkz0GdtBJL6la3AG3aidzljqH0CD4R8rh+v/7QVeD0f\nJAMpeL2HnOPq0g2c7bZ/ELjZzW8D1rj574bU+YfATW4+DkgM9zGyKXqn3g4AjTET4zn1xgpqEpEG\n4DFXvh1Y6nrCvgB4yOvaDfAGejuFiOQDtara2m9VGVAsIj8E/oA3RMpQ+1wL3AJez9VAg4hcBDyi\nqi3usx4GLsbrpuegqm5x790MFLn+2jLUG6cKvK59rnLzrwJfEZHZwMOqun+kPyhj+rMEZczE6giZ\nD4YsB/F+/3x44+2cPcx+1jNAZ6iqWiciy/AG8Ps4cD3w2RHucyRC4+8BEofaWFX/T0Q2AG8H/igi\nH1PVZ8chDjMN2T0oY8amCe8S3qioN37QQRF5L3g9ZLuE099f3X9y2+cAPlX9LfBVvCHIh9rnM8An\nXLlfRNKBl4B3i0iSeL3XX+vKBou5Hqh3Z14AN4XEUwyUqeoP8Hq9XjrSn4Ux/VmCMmYMVLUGeMU1\nLvjuKHdzE/Bh1+BgJ/2G+xYRPzBfVfcM8N584HnxRkH9NfDlYfb5GeAyEdmOd8muRL1hy3+Jd49r\nA/BzVX1zmJg/BPzIfa6ElF8P7HDlS4B7h6u8MYOx3syNiXDuTOVmVf14uGMxZjJZgjLGGBOR7BKf\nMcaYiGQJyhhjTESyBGWMMSYiWYIyxhgTkSxBGWOMiUiWoIwxxkQkS1DGGGMikiUoY4wxEckSlDHG\nmIhkCcoYY0xEsgRljDEmIlmCMmYCiMjFIrI33HFMBhG5VkSOikiziJzjhrd/W7jjMtHPEpQxE0BV\nX1LVReGOY5L8G3C7qqaMYJgOY0bMEpQxZqwK8cacMmZcWYIy05qIzBKR34pIlYgcFJFPh6y7U0Qe\nFJF7RaRJRHaKyMqQ9ctF5E237iEReUBE/tmtu1REjoVse0hEviAi20SkwW2bELL+HSKyRUTqReQv\nIjLoSLQioiJym4jsd5/9TRGZ597X6GKOc9tmisjjrn51bn52yL4+KCJlbj8HReQmVz5fRF5wsVaL\nyAMDxBEvIs2AH9gqIgcG2eY/ROS4m/5DROLduhdE5G/c/IWuXm93y+vcoIdmGrMEZaYtEfEBjwFb\n8UamXQd8VkSuDNnsXcD9QAbwKPBf7r1xwCN4I9FmAffhDZU+lOvxhm6fizcU+gfdvs4B7gY+BmQD\nPwMe7f1DPogrgRXAecAXgf8Gbgbm4I1ke6Pbzgf8D95ZTgHQFlKHZOAHwFWqmgpcAPQmhW8CTwKZ\nwGzgh/0DUNUOVU1xi8tUdd4AcX7FxXg2sAxYhTc0PcALwKVu/hKgDFgTsvzCEPU304AlKDOdnQvk\nquo3VLVTVcuAu4AbQrZ5WVX/qKo9wK/w/siC90c3BviBqnap6sN4Q6YP5QeqelxVa/ES49mu/KPA\nz1R1g6r2qOo9QIf7jMF8R1UbVXUnsAN4UlXLVLUB+BNwDnhD0qvqb1W1VVWbgH/B++PfKwgsEZFE\nVT3h9gfQhZfUZqlqu6q+PEzdBnMT8A1VrVTVKuDrwAfcuhdCYlkDfCtk2RKUsQRlprVCYJa7rFYv\nIvXAPwCBkG1Ohsy3AgkiEgPMAsr11CGpjw7zef331Xv2UQj8fb845rjPGExFyHzbAMspACKSJCI/\nE5HDItIIvAhkiIhfVVuA9wEfB06IyB9EZLHbxxcBATa6S5t/O0zdBjMLOByyfDikXq8CC0UkgJes\n7wXmiEgO3pnWi6P8TDNFWIIy09lR4KCqZoRMqap69QjeewLIFxEJKZszhjj+pV8cSap63yj3F+rv\ngUXAalVN461LaAKgqk+o6uXATGAP3hkkqnpSVT+iqrPwLj3+WETmj+Lzj+Ml4F4FrgxVbQU2A58B\ndqhqJ/AX4PPAAVWtHsXnmSnEEpSZzjYCTSLyJRFJFBG/iCwRkXNH8N5XgR7gdhGJEZFr8P7rH427\ngI+LyGrxJIvI20UkdZT7C5XlaBXFAAAZM0lEQVSKd0ZVLyJZwD/1rhCRgIhc4+5FdQDNeJf8EJH3\nhjSmqAO0d91pug/4qojkujOjrwG/Dln/AnA7b13Oe77fspnGLEGZacvdV3oH3uWlg0A18HMgfQTv\n7QTeA3wYqMdroPA43h/6041jE/ARvMYLdUAprgHFOPgPIBGvbq8Bfw5Z58M7WzkO1OLd9/mEW3cu\nsMG10nsU+Iy7R3e6/hnYBGwDtgNvuLJeL+Al0RcHWTbTmJx6Cd0YM1oisgH4qar+T7hjMWYqsDMo\nY0ZJRC4RkRnuEt+teE3H/zzc+4wxIxMT7gCMiWKLgAeBZLxneK5T1RPhDcmYqWPKX+ITkbvx7jNU\nquoSV3Yn3jX/KrfZP6jqH8MToTHGmIFMh0t8v8R7er+/76vq2W6y5GSMMRFmyicoVX0Rr4WSMcaY\nKDKd70HdLiK34DWB/XtVrRtq45ycHC0qKpqUwIwxZirbvHlztarmDrfdlL8HBSAiRcDjIfegAnjP\nhShep5gzVfWvunIRkY/i9ZNGQUHBisOHD/ffZEy+/PB23jxShyoo6l49IzkuvZ0Y9HZl4BNBxCsX\nwOcDQfD5BJ946996Ffw+b51fwO+TkMlHjJs/9dVHrF+I8QsxffM+Yv0+4vxCrJuPjTl1OT7GR5yb\n4mN8xPn9xMd68/ExfuJifPh9Mmg9jTFTi4hsVtWVw203Lc+gVLWv3zIRuQvvAcuBtvtvvF6iWbly\n5bhm8vauHu5//QgL81IpyklC6E0uXlLxghtiB9r7oi5WbwqqV6KqfcvB3nKFnqASVKU7GKSzB7qD\nSjCoIeXecrcr6w4G3avS3aN09QT71o2nWL8QH+MnPsZHQqyfhNjeV28+0c0nxvpJjPP3LSfFeVNi\nXAzJcd66pLgYkuL8JMfHkBzvJ9ktn9orkTEm0k3LBCUiM0OaA1+L1xv0pCqrakEVPrVuPu9YOlSf\noJGpN4l1B4N0dStdwSBdPd58Z48339n91muHe+3sDtLR99pDR3eQji5vvt29tnX10NEVpL2rh3ZX\nXt/aRVtXD22dPX2vHd0j73lHBJJi/STFx5AaH0NKQgzJcd5rSrybEmJITYghNSGW1Pi35tMSY0hL\niCUtMZZkS3TGTJopn6BE5D68MWdy3ABy/wRcKiJn452HHMLrDHNS7a9sAmB+XsowW0Ymn0+I8wlx\n+CAuPDEEg0pbVw+tnT20dna7V2++paOHtq5umjt6aO3opqWz99Ura27vormjm2N1bTR3dNHc3k1z\nRzddPUOfGfoE0hJjXcKKIT0x1k1xffMZSbFkJnllmcmxZCTGkZEUS0Ksf5J+MsZMDVM+QanqjQMU\n/2LSA+nnQGUzPoG5OcnhDiVq+XziLuPFAEON7TcyqkpHd5DG9i6a2rvd5M03tnXR2N5FY5tX1tje\nTUNbFw1tXZxsaKKhrZuGts4hE1xirJ+sZC9pZSbFefPuNSs5jpyUOLKS48lOiSM7OY60hFh8dm/O\nTGNTPkFFqv2VzRRmJxMfY/9VRwoR6bvvlTeKfsRVvTO6+tYuN3VS39ZFXWsn9a1d1LV0UtfqLde2\ndHKktpXalk6a2rsH3F+MT1ziiic3NZ6clHhyUuPIdct5qQnkpcWTlxpPSnyMXXo0U44lqDAprWxm\nXm50Xt4zAxMR10AjhlkZiSN+X2d3kLrWTqqbO6ht6aSmuZOaFm+5prmD6mZvfn9FE1XNHQOepSXG\n+slLiyfgktaMtARmpCcQcK+9y7H+Kf/oo5lCLEGFQVdPkEM1LbytJDD8xmbKi4vxEUjzkslwVJXG\ntm6qmtupbOygsqmDyiZvvqKpg4rGdnaUN/D07grau05tRCICuSnxzMpIZFZGAjPTE5mVkUh+RiKz\nMxOZk5lEWqKdiZnIETUJSkT+H/AdVa13y5l4D9h+NbyRnb7DNa109Sjz7QzKnCYRIT0plvSkWOYP\ncR2yN5GdbGz3poY2jte3c6KhjRMN7ew52cRze6po6+o55X2p8THkZyYyOzOJgqwkCrOTKMhOojAr\nidmZScTF2BmYmTxRk6CAq1T1H3oXVLVORK4Goi5BlVY2A9Hbgs9EvtBEtmjGwIlMValv7aK8vo1j\nda0cq2tzUytHa1t5pbT6lATmE5iZnsjcnGSKc5MpzkmmODeF4txkZqUnWoMOM+6iKUH5RSReVTsA\nRCSR8Wi6FQYHqrwENc8SlAkjESEzOY7M5DiW5P/1IMKqSlVTB4drWzlc08qRmhYO17ZysLqFh98o\np7njrcYd8TE+5uYkszCQyqIZqSzIS2FhIJU5WUnWS4gZtWhKUP8LPCMivaOVfgi4Z7g3DTLcRhbw\nAFCE9xzU9cP1xTee9lc0MSs9gZT4aPrxm+lGRMhLSyAvLYFzi7JOWaeqVDV3UFbV4qZmSqua2Xy4\njke3Hu/bLj7Gx4JACiUz0zhzVjols9I4Y2aafffNiETNt0RV/1VEtgJvc0XfVNUnRvDWXwL/Bdwb\nUnYH8IyqfltE7nDLXxrPeIdSWtXM/MAo2jEbEyFExGvmnprAecXZp6xr7uhmf0UT+yua2VfRxJ6T\nTTy9u5IHNx3r26YoO4kzZ6WzbE46y2ZncNbsdJLioubPkZkk0faN2A10q+rTIpIkIqmq2jTUG1T1\nRddZbKhr8HqXAO8s7HkmKUEFg8qByhZWrcoefmNjolBKfAznFGRyTkFmX5mqUtHYwa4TDewsb2TX\niUa2HqvnD9u9Hsf8PmFhIJWz56Rz9pwMzi3KYm5OsrUonOaiJkGJyEfwehbPAuYB+cBPgXWj2F0g\npC++k8Cktfcur2+jravHGkiYaUVEvOex0hNYu/itX7fq5g62Hatny5F63jxazx+2neC+jUcByEmJ\nZ/XcLFbNzWJ1cRYL81KtIcY0EzUJCvgksArYAKCq+0Ukb6w7VVUVkQH7p+k33MZYPwrwLu8BLAhY\ngjImJyWetYsDfUkrGFTKqlt4/VAtGw/WsqGspu8sKz0xlgvmZbNmYS5rFuaSfxoPQ5voFE0JqkNV\nO/vGQBKJ4a3hk05XRW+P5iIyE6gcaKOJGG6jtMI1MbdnoIz5Kz6fMD8vhfl5Kdy4qgBV5VhdGxsP\n1vJaWQ0vl1bzpx0nAZiXm8wlC/NYszCH84qzrTPeKSiaEtQLIvIPQKKIXA7cBjw2yn09CtwKfNu9\n/n58QhxeaWUz2a5przFmaCLCnKwk5mQl8TcrZqOqlFY288K+Kl7YV8WvNxzm7lcOkhjr59JFuaxf\nMoPLFueRlhAb7tDNOIimBHUH8GFgO97wGH8Efj7cmwYZbuPbwIMi8mHgMHD9BMX8V0qrmu3+kzGj\nJCIsCKSyIJDK311cTHtXD6+V1fD07gqe2FnBn3acJNYvXDAvhyvPnMEVZwbISYnKxyUNUTrku3uO\nabaqbpusz1y5cqVu2rRpTPtQVZZ9/UneuWwW/3LtWeMUmTEGvPtXbx6t58mdJ/nzzpMcrmnF7xMu\nXpDDtefkc3lJwJqyR4gpN+S7iDwPvAsv5s1ApYj8RVU/F9bATkNVcweN7d12BmXMBPD5hBWFmawo\nzOSOqxaz52QTj287zu/ePM5n7t9CUpyf9WfO4N3n5HPBvGxirGf3iBc1CQpIV9VGEfk74F5V/ScR\nmbQzqPHQ2wffgtEMNmSMGTER4YyZXq8Vf3/5Il4/VMvvtpTz+LYTPPxmOXmp8Vy3YjbvO3cOhdk2\naGikiqYEFeNa3F0PfCXcwYyGdRJrzOTz+YTVxdmsLs7mn955Js/vreShTcf46QsH+PHzB7hwfjY3\nnFvAFWcGbADRCBNNCeobwBPAy6r6uogUA/vDHNNpKa1sJiU+hkCa3bQ1JhwSYv2sXzKT9UtmcqKh\njYc2HeOB14/yqfveJCs5jveck8/7VxdQbI+BRISIbyQhIjcCT6pqTTjjGI9GEu+/6zVaO3v43Scv\nHKeojDFj1RNUXi6t5v6NR3hqVwXdQeWCedncfF4hl5cEbBTiCTCVGkkUAA+JSCzwDPAnYKNGemYd\nwP7KZi5ZmBvuMIwxIfw+4ZKFuVyyMJfKpnYefP0o9208ym3/+wZ5qfHccO4cblhVwCzruWLSRfwZ\nVC8RScXryXw9XpdHu4E/A0+oasVEf/5Yz6AaWrtY9o0n+fJVi/nYJfPGMTJjzHjrCSrP763k168d\n5vl9VQhw2aI83nfuHNYuzrMWgGM0lc6gAHC9lj/iJkSkBLgKbxiNK0ezTxE5BDQBPXi9pA/7Axut\n0iqv03VrIGFM5PP7hHVnBFh3RoCjta3ct/EID20+xjN7Kq0F4CSKmgQlIssHKP4d8J9j3PVlqlo9\nxn0My1rwGROd5mQl8cX1i/n85Qt5bm8V92880tcC8IJ52bx35WwuL5lhgzBOgGj6if4YWA5sAwRY\nAuwE0kXkE6r6ZDiDG05pZTPxMT5mZyaFOxRjzCjE+H1cXhLg8pIAJxva+c3mozyw6Sife2ArCbHb\nWXdGgGuWzeKSRbnWXH2cRFOCOg58WFV3Qt8lvm8AXwQeBkaToBR40g238TPXe/mE2F/ZTHFuCn4b\nz8aYqDcjPYHb1y7gtkvn88YRb5j7x7ed4A/bTpCWEMPVZ83k7UtnsnpuNnExdr9qtKIpQS3sTU4A\nqrpLRBaratkYRt28SFXL3bhST4nIHlV9sXfleI4HVVrZfMoIo8aY6OfzCSuLslhZlMU/vqOEV0qr\neXTLcR7bepz7Xz9KanwMlyzK5fKSAJcuyiM90XpZPx3RlKB2ishPgPvd8vuAXSISD3SNZoeqWu5e\nK0XkEbzWgS+GrB+X8aBaO7spr2/j+pVzRrsLY0yEi/X7uHRRHpcuyqOts4eXS6t5elcFz+yp4PFt\nJ4jxCavmZrF2cR4XL8hlYSDFhrQfRjQlqB8B5wKfdcuv4D0T1Qlcdro7E5FkwKeqTW7+CrxLhuOu\nrKoFVWsgYcx0kRjn77tfFQwqW47V8/SuCp7eXcE//2E3sJvc1HgunJfNhfNzuHB+jj1nNYBoSlD/\nAdyqqt+Dvh4mvqqqjwHNo9hfAHjE/QcTA/yfqv55vIINZS34jJm+fD5heUEmywsy+eL6xZTXt/FK\naTWvlFbzcmk1v9tyHIDinGRWFmV6lwwLM5mbkzztz7CiKUFdh9ejxPuBNcAteGc9o6KqZcCycYpt\nSKWVzfh9QpE9M2HMtJefkcj1K+dw/co5qCp7K5p4eX81rx6o4cldFTy46RgA2clxLC/MZGVhJsvm\nZLAkP33aNWWPmtq6xhA34j37dAS4QlXbwhzWiOyvbKIwO8la8xhjTiEiLJ6RxuIZafzdxcUEg8qB\nqmY2Ha5j06E6Nh+u5aldFW5b7yxr6WwvWS2dnc7iGamkTuHh7SM+QYnIdrzm4L2yAD+wQURQ1aXh\niWzkSiubWWCX94wxw/D53hrS/sZVXsvh6uYOtpc3sP1YA9uONfDqgRoeebO87z35GYksnpHKIjct\nnpHG3JzkKfEPccQnKOAd4Q5gLDq7gxyqaWX9khnhDsUYE4VyUuK5bFEely3K6yurbGxne3kDe042\nsedkE3tPNvLCviq6g97/8n6fUJCVRHFOMsW5yRTnplCck8zc3GRyU+Kj5t5WxCcoVT0c7hjGoqKx\nnZT4GGsgYYwZN3lpCaxLS2DdGYG+so7uHsqqWth7sonSymbKqpspq2rh5dJqOrqDfdslxPqYk5lE\nQVYSc7Leep2ZnsCsjEQyk2IjJoFFTW/m4TaW3sxVlaBivUgYYyZdMKiU17dRVt3CoeoWjta2csRN\nR2tbaensOWX7hFgfs9ITmZmRwMz0RGakJRBIiyc31XsNpCWQmxo/pnGyplxv5tFMRPBbbjLGhIHP\nJ8xxZ0n9x6NTVepauzha28qJhjaO17dzvL6NEw3tlNe38dL+KqqbO+kJ/vWJzL9cu4SbVhdOaOyW\noIwxZpoSEbKS48hKjmPZnIwBt+kJKjUtHVQ2dlDZ1E5FYwcVje0szR94+/FkCcoYY8yg/D4hLzWB\nvNQEIH1SP9vuQY2QiFQBY2mwkQNM+LhTk2Qq1QWmVn2mUl1gatVnKtUFxlafQlXNHW4jS1CTREQ2\nTeSIvZNpKtUFplZ9plJdYGrVZyrVBSanPtH/JJcxxpgpyRKUMcaYiGQJavJM2Gi9YTCV6gJTqz5T\nqS4wteozleoCk1AfuwdljDEmItkZlDHGmIhkCWqCich6EdkrIqUicke44xkpETkkIttFZIuIbHJl\nWSLylIjsd6+ZrlxE5AeujttEZHmYY79bRCpFZEdI2WnHLiK3uu33i8it4aiLi2Og+twpIuXu+GwR\nkatD1n3Z1WeviFwZUh7276KIzBGR50Rkl4jsFJHPuPKoOz5D1CVaj02CiGwUka2uPl935XNFZIOL\n7QERiXPl8W651K0vCtnXgPU8bapq0wRNeMOCHACKgThgK1AS7rhGGPshIKdf2XeAO9z8HcC/uvmr\ngT8BApwHbAhz7GuA5cCO0caON6xLmXvNdPOZEVSfO4EvDLBtifuexQNz3ffPHynfRWAmsNzNpwL7\nXMxRd3yGqEu0HhsBUtx8LLDB/cwfBG5w5T8FPuHmbwN+6uZvAB4Yqp6jicnOoCbWKqBUVctUtRO4\nH7gmzDGNxTXAPW7+HuDdIeX3quc1IENEZoYjQABVfRGo7Vd8urFfCTylqrWqWgc8Bayf+Oj/2iD1\nGcw1wP2q2qGqB4FSvO9hRHwXVfWEqr7h5puA3UA+UXh8hqjLYCL92KiqNrvFWDcpsBb4jSvvf2x6\nj9lvgHUiIgxez9NmCWpi5QNHQ5aPMfQXOJIo8KSIbBaRj7qygKqecPMngd6+/qOhnqcbezTU6XZ3\n2evu3ktiRFF93CWhc/D+U4/q49OvLhClx0ZE/CKyBajES/oHgHpV7R4gtr643foGIJtxrI8lKDOY\ni1R1OXAV8EkRWRO6Ur1z+ahsAhrNsYf4CTAPOBs4AXwvvOGcHhFJAX4LfFZVG0PXRdvxGaAuUXts\nVLVHVc8GZuOd9SwOZzyWoCZWOTAnZHm2K4t4qlruXiuBR/C+rBW9l+7ca6XbPBrqebqxR3SdVLXC\n/TEJAnfx1iWUiK+PiMTi/UH/X1V92BVH5fEZqC7RfGx6qWo98BxwPt5l1d6OxUNj64vbrU8HahjH\n+liCmlivAwtcK5g4vBuJj4Y5pmGJSLKIpPbOA1cAO/Bi720tdSvwezf/KHCLa3F1HtAQcrkmUpxu\n7E8AV4hIprtEc4Uriwj97vFdi3d8wKvPDa6F1VxgAbCRCPkuunsUvwB2q+q/h6yKuuMzWF2i+Njk\nikiGm08ELse7r/YccJ3brP+x6T1m1wHPurPfwep5+ia7pch0m/BaIe3Du5b7lXDHM8KYi/Fa4WwF\ndvbGjXd9+RlgP/A0kOXKBfiRq+N2YGWY478P79JKF9717w+PJnbgb/Fu8JYCH4qw+vzKxbvN/UGY\nGbL9V1x99gJXRdJ3EbgI7/LdNmCLm66OxuMzRF2i9dgsBd50ce8AvubKi/ESTCnwEBDvyhPccqlb\nXzxcPU93sp4kjDHGRCS7xGeMMSYiWYIyxhgTkSxBGWOMiUiWoIwxxkQkS1DGGGMikiUoY8ZARDJE\n5LaQ5Vki8puh3jOGz4oVkTcmYt9jISJFEtLTujHjxRKUMWOTgderMwCqelxVrxti+7G4CHhlgvZt\nTMSxBGXM2HwbmOfG/flu6NmEiHxQRH4n3vhGh0TkdhH5vIi8KSKviUiW226eiPzZdcz7kogM1v/Z\neryhJ/q4zj1/KSI7xBu/63ND7VNEAiLyiHhj/mwVkQtc+efdPnaIyGddWZGI7BaRu8QbH+hJ18MA\nIrKidx/AJ0PiOVO8MYW2uM5SF4znD9tMM+F4Ytkmm6bKBBRx6jhNfcvAB/Gesk8FcvF6e/64W/d9\nvM5FwetBYYGbX43XZcxAn7URSOpXtgJv2Ine5Yyh9gk8EPK5frz+01bg9XyQDKTg9R5yjqtLN3C2\n2/5B4GY3vw1Y4+a/G1LnHwI3ufk4IDHcx8im6J16OwA0xkyM59QbK6hJRBqAx1z5dmCp6wn7AuAh\nr2s3wBvo7RQikg/Uqmprv1VlQLGI/BD4A94QKUPtcy1wC3g9VwMNInIR8IiqtrjPehi4GK+bnoOq\nusW9dzNQ5Ppry1BvnCrwuva5ys2/CnxFRGYDD6vq/pH+oIzpzxKUMROrI2Q+GLIcxPv98+GNt3P2\nMPtZzwCdoapqnYgswxvA7+PA9cBnR7jPkQiNvwdIHGpjVf0/EdkAvB34o4h8TFWfHYc4zDRk96CM\nGZsmvEt4o6Le+EEHReS94PWQ7RJOf391/8ltnwP4VPW3wFfxhiAfap/PAJ9w5X4RSQdeAt4tIkni\n9V5/rSsbLOZ6oN6deQHcFBJPMVCmqj/A6/V66Uh/Fsb0ZwnKmDFQ1RrgFde44Luj3M1NwIddg4Od\n9BvuW0T8wHxV3TPAe/OB58UbBfXXwJeH2edngMtEZDveJbsS9YYt/yXePa4NwM9V9c1hYv4Q8CP3\nuRJSfj2ww5UvAe4drvLGDMZ6MzcmwrkzlZtV9ePhjsWYyWQJyhhjTESyS3zGGGMikiUoY4wxEckS\nlDHGmIhkCcoYY0xEsgRljDEmIlmCMsYYE5EsQRljjIlI/x+F/eNsgDolUQAAAABJRU5ErkJggg==\n", "text/plain": [ "
" ] }, "metadata": { "tags": [] }, "output_type": "display_data" } ], "source": [ "t_f = 3000\n", "\n", "m = ConcreteModel()\n", "m.t = ContinuousSet(bounds=(0, t_f))\n", "m.h = Var(m.t)\n", "m.u = Var(m.t, bounds=(0, u_max))\n", "\n", "m.v = DerivativeVar(m.h, wrt=m.t)\n", "m.a = DerivativeVar(m.v, wrt=m.t)\n", "\n", "m.ode1 = Constraint(m.t, rule = lambda m, t: m_total*m.a[t] == -m_total*g + v_exhaust*m.u[t])\n", "\n", "m.h[0].fix(h_initial)\n", "m.v[0].fix(-v_initial)\n", "\n", "m.h[t_f].fix(0) # land on surface\n", "m.v[t_f].fix(0) # soft landing\n", "\n", "solve(m)" ] }, { "cell_type": "markdown", "metadata": { "colab_type": "text", "id": "rLx0_brhUzl9" }, "source": [ "## Version 2: Rescaled Model\n", "\n", "At this point, it's now clear the first version of this model has run into some serious problems:\n", "\n", "* The calculated trajectory takes us through a crash landing and trip through the interior of the moon. \n", "* The engine thrust never goes to zero, even when the lander is at zero velocity and on the surface. The reason is that the model doesn't account for the reaction force of the surface on the lander. So the lander is really just hoovering rather than landing.\n", "* There is no obvious means of estimating the time required for the mission. \n", "\n", "Let's begin with the last issue. We will introduce an additional decision variable $T$ denoting the length of the mission. Time is then rescaled as\n", "\n", "$$\\tau = \\frac{t}{T}\\quad\\implies\\quad t =\\tau T$$\n", "\n", "The differential equation model then becomes\n", "\n", "\\begin{align*}\n", "\\frac{m}{T^2}\\frac{d^2h}{d\\tau^2} & = - m g + v_eu \\\\\n", "\\end{align*}\n", "\n", "The net result is that an additional variable, $T$, denoting the duration of the descent mission has been introduced into the optimization problem." ] }, { "cell_type": "code", "execution_count": 8, "metadata": { "colab": { "base_uri": "https://localhost:8080/", "height": 297 }, "colab_type": "code", "executionInfo": { "elapsed": 8524, "status": "ok", "timestamp": 1556833349726, "user": { "displayName": "Jeffrey Kantor", "photoUrl": "https://lh5.googleusercontent.com/-8zK5aAW5RMQ/AAAAAAAAAAI/AAAAAAAAKB0/kssUQyz8DTQ/s64/photo.jpg", "userId": "09038942003589296665" }, "user_tz": 240 }, "id": "6KLIZeb8UzKG", "outputId": "f381c6ee-d373-4d97-9c39-9794c3e1eee9" }, "outputs": [ { "data": { "image/png": "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\nY5PDGZMUzpjkcCJDAnq6Kv2ChZMxJzrT/xc2mrkrOztb+/t9UA1NzeSXHmHbgcNsPVDFpsIqNhVW\ncrCqrnWbwZHBjE+JYHxKJBOGRDBucARhQZ1rPx4otmzZwllnndXbxTDGK7X1/0NEVqlq9qnea0Md\nDSD+vj4Mjw/j0vFJfH/OKJ65MYflP7mA3J9ewPM3T+H+i0eTlRrJxsJKHn93K9/403LG/2Ixs//7\nE763cC1//TyPTYWVNDadunei8T6LFi3iscceO+33nX322V1y/BtvvJFXXnmlS/bl6dFHH219npeX\nR2bmyeaB7Li1a9cyffp0xo4dy/jx41m4cGHrunPPPZesrCyysrJITk5m/vz5x7x35cqV+Pn5tdY1\nPz+fSZMmkZWVxdixY3nqqafaPOa6deuYPn0648aN4/LLL6eqquqM69Ednn32We68884eOZZdPTfE\nhgYyc2QcM0d+OfJI2ZF61hdUsL6gkvUFFSzdUcyra5x+KCEBvmQNiWRSahST06KYlBpFRIidZXm7\nefPmMW/evNN+37///e9uKE3XefTRR/nJT37SpfsMCQnh+eefZ8SIERQWFjJ58mQuuugiIiMj+fTT\nT1u3++pXv8oVV1zR+rqpqYn77ruPOXPmtC5LSkri888/JzAwkMOHD5OZmcm8efNITk4+5pi33HIL\nv/rVr5g1axbPPPMMTzzxBA899FCX1quvsTMo06boQQGcNyqeu2eP4M835LDygQv49Efn85vrsrh6\ncgpVtQ3875Jd3PTsSrIeWszcXy/lv/61kTfXF3Koyrpb96S8vDxGjx7NjTfeyMiRI1mwYAEffPAB\nM2bMYMSIEaxYsQI49i/fl19+mczMTCZMmMDMmc5tEps2bWLKlClkZWUxfvx4duzYAUBoqHOdU1X5\n4Q9/SGZmJuPGjWs9q/jkk08477zzuPrqqxk9ejQLFizgVJcOVq1axaxZs1p/8RcVObcunnfeedx3\n331MmTKFkSNHtoZBTU0N11xzDWPGjOHKK69k6tSp5Obmcv/993P06FGysrJYsGAB4ITErbfeytix\nY5kzZw5Hjx497X/TkSNHMmLECACSk5OJj48/4WJ/VVUVH3300TFnUL/73e/46le/Snx8fOuygIAA\nAgMDAairq6O5ue0WiO3bt7d+FhdeeCH//Oc/T9imqKiImTNnkpWVRWZmZuu/z+LFi5k+fTqTJk3i\na1/7GocPHwacs7mzzz6bCRMmMGXKFKqrq6mtreWmm25i3LhxTJw4kY8//hhwvh9XXXUVc+fOZcSI\nEfzoRz9qPe5f/vIXRo4cyZQpU/jssy8ngm7re9SV7AzKdIiIMCTaue/qiiznnuia+kbW7qtgVV45\nK/LKeGVVAc9/7gyxlR4TwpSh0UwfFsP0jFgSI4J6s/g95hdvbGJzYdc2zYxJDudnl49td5udO3fy\n8ssv88wzz5CTk8MLL7zAsmXLWLRoEY8++iivv/76Mds/+OCDvPfeewwePJiKigoAnnrqKe655x4W\nLFhAfX09TU1Nx7zn1VdfZe3ataxbt46SkhJycnJafymtWbOGTZs2kZyczIwZM/jss88455xz2ixr\nQ0MDd911F//617+Ii4tj4cKFPPDAAzzzzDMANDY2smLFCt5++21+8Ytf8MEHH/Dkk08SFRXF5s2b\n2bhxI1lZWQA89thj/P73v2ft2rWAE9Y7duzgxRdf5E9/+hPXXHMN//znP7n++uuPKcPf//53nnji\niRPKNnz48BOaIVesWEF9fT3Dhg07Zvnrr7/O7NmzCQ937iHZv38/r732Gh9//DErV648Ztt9+/Zx\n6aWXsnPnTp544okTzp4Axo4dy7/+9S/mz5/Pyy+/zL59+07Y5oUXXuCiiy7igQceoKmpiZqaGkpK\nSnj44Yf54IMPGDRoEI8//jj/8z//w/3338+1117LwoULycnJoaqqiuDgYH7zm98gImzYsIGtW7cy\nZ84ctm/fDjhNm2vWrCEwMJBRo0Zx11134efnx89+9jNWrVpFREQE559/PhMnTgTa/h51JQso02kh\nAX6cPSyWs4fFAk4njM2FVazYU8aKvDLe23SQl3KdAT8yYgcxbVgM0zNimJYRQ1xYYG8Wvd8ZOnQo\n48aNA5xfdLNnz0ZEGDduHHl5eSdsP2PGDG688UauueYarrrqKgCmT5/OI488QkFBAVdddVXrGUSL\nZcuW8fWvfx1fX18SEhKYNWsWK1euJDw8nClTppCS4tyamJWVRV5e3kkDatu2bWzcuJELL7wQcM54\nkpKSWte3lGfy5MmtZV+2bBn33HMPAJmZmYwfP77df4uWAPPch6cFCxa0nnG1p6ioiP/4j//gueee\nw8fn2AanF198kVtuuaX19b333svjjz9+wnYAQ4YMYf369RQWFjJ//nyuvvpqEhKOHeTmmWee4e67\n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\n", "text/plain": [ "
" ] }, "metadata": { "tags": [] }, "output_type": "display_data" } ], "source": [ "m = ConcreteModel()\n", "m.t = ContinuousSet(bounds=(0, 1))\n", "m.h = Var(m.t)\n", "m.u = Var(m.t, bounds=(0, u_max))\n", "m.T = Var(domain=NonNegativeReals)\n", "\n", "m.v = DerivativeVar(m.h, wrt=m.t)\n", "m.a = DerivativeVar(m.v, wrt=m.t)\n", "\n", "m.ode1 = Constraint(m.t, rule = lambda m, t: \n", " m_total*m.a[t]/m.T**2 == -m_total*g + v_exhaust*m.u[t])\n", "\n", "m.h[0].fix(h_initial)\n", "m.v[0].fix(-v_initial)\n", "\n", "m.h[1].fix(0) # land on surface\n", "m.v[1].fix(0) # soft landing\n", "\n", "def solve(m):\n", " \n", " TransformationFactory('dae.finite_difference').apply_to(m, nfe=50, method='forward')\n", " SolverFactory('ipopt', executable=ipopt_executable).solve(m)\n", " \n", " tsim = [t*m.T() for t in m.t]\n", " hsim = [m.h[t]() for t in m.t]\n", " usim = [m.u[t]() for t in m.t]\n", "\n", " plt.subplot(2,1,1)\n", " plt.plot(tsim, hsim)\n", " plt.title('altitude')\n", " plt.xlabel('time / seconds')\n", " plt.ylabel('meters')\n", " plt.legend(['mission length =' + str(round(m.T(),1)) + ' seconds'])\n", "\n", " plt.subplot(2,1,2)\n", " plt.plot(tsim, usim)\n", " plt.title('engine mass flow')\n", " plt.xlabel('time / seconds')\n", " plt.ylabel('kg/sec')\n", "\n", " plt.tight_layout()\n", "\n", "solve(m)" ] }, { "cell_type": "markdown", "metadata": { "colab_type": "text", "id": "UA9lSKK8dgch" }, "source": [ "### How much fuel is burned?\n", "\n", "Fuel consumption can be calculated as\n", "\n", "\\begin{align*}\n", "\\mbox{fuel consumed} & = \\int_0^T u(t)\\,dt = T \\int_0^1u(\\tau)\\,d\\tau\n", "\\end{align*}" ] }, { "cell_type": "code", "execution_count": 9, "metadata": { "colab": { "base_uri": "https://localhost:8080/", "height": 297 }, "colab_type": "code", "executionInfo": { "elapsed": 9295, "status": "ok", "timestamp": 1556833350502, "user": { "displayName": "Jeffrey Kantor", "photoUrl": "https://lh5.googleusercontent.com/-8zK5aAW5RMQ/AAAAAAAAAAI/AAAAAAAAKB0/kssUQyz8DTQ/s64/photo.jpg", "userId": "09038942003589296665" }, "user_tz": 240 }, "id": "3-y5SLyWdkyJ", "outputId": "b9580a5f-96d8-4ed9-f03c-21a2be281f73" }, "outputs": [ { "data": { "image/png": "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\nn7pbkyNGjKCwsLCB73T9rAVlauXlJfTrFkK/biFcO9p1E3NOUSlf7stjrfP43Udfowr+Pl6Mjgvn\ngr4RjOsXydCYzh3qJuNH/rOdHYeON+kxE6JDeehbifXm2bNnD6+//jovvvgio0eP5p///CcrV67k\n3Xff5bHHHuPtt98+Jf+CBQtYtmwZMTEx5OfnA/D8889z1113MWfOHMrKyqisPPU/G2+++SabNm1i\n8+bN5OTkMHr0aHdw27hxI9u3byc6Oppx48bxxRdfcNFFF9Va1vLycu644w7eeecdunbtyqJFi3jw\nwQd58cUXAaioqGDdunUsWbKERx55hI8++ojnnnuOLl26sGPHDrZt2+buSnviiSd45pln2LRpE+AK\n1rt37+Zf//oXL7zwArNnz+aNN97ghhtuOKUM//jHP/jNb35zRtn69etXbzdkeno6GzduJCUl5ZT0\nzz//nO7du9O/f38AioqKePLJJ/nwww/d3XvVKisrSU5OZs+ePfz4xz8+41gASUlJvPnmm9x11128\n9dZbFBYWkpubS0TENz0dS5cuJTo6mvfffx+AgoKCet/bOXPmMH/+fGbNmkVJSQlVVVUN/kxHjRrF\nD37wAz755BP69evHtdde6y7P008/zbPPPsu4ceMoKioiICCgzvexMSxAmXMWGezPtKFRTBsaBbi6\nBb9MP8bqvbms2pvDb5bt4jfLdhES4MPYPhFc1C+S8f0jiY8MshFvzSA+Pp6hQ4cCkJiYyOTJkxER\nhg4dSnp6+hn5x40bx0033cTs2bO56qqrALjgggt49NFHycjI4KqrrnL/2FZbuXIl119/Pd7e3nTv\n3p2LL76YL7/8ktDQUMaMGUNsrOt2xOHDh5Oenl5ngNq1axfbtm1jypQpgOsHOyoqyr29ujzJycnu\nsq9cuZK77roLgCFDhjBs2LB634vqAFbzGDXNmTPH3eI6V0VFRVx99dX8/ve/JzQ09JRt//rXv05p\nPT388MPcc8897tZSTd7e3mzatIn8/HxmzZrFtm3bzrhu9vTTT3P77bfz0ksvMWHCBGJiYvD29j4l\nz9ChQ/nJT37C/fffz5VXXsn48ePZtm1bre9tYWEhmZmZzJo1C8AdPBr6mQYHBxMfH+/+btxwww0s\nXLgQcH2n7r33XubMmcNVV13l3repWIAyjRYW6MeUhO5MSXDNJpVdWMrqtFxW7cnhi705fLjjCACx\n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\n", "text/plain": [ "
" ] }, "metadata": { "tags": [] }, "output_type": "display_data" } ], "source": [ "m = ConcreteModel()\n", "m.t = ContinuousSet(bounds=(0, 1))\n", "m.h = Var(m.t)\n", "m.u = Var(m.t, bounds=(0, u_max))\n", "m.T = Var(domain=NonNegativeReals)\n", "\n", "m.v = DerivativeVar(m.h, wrt=m.t)\n", "m.a = DerivativeVar(m.v, wrt=m.t)\n", "\n", "m.fuel = Integral(m.t, wrt=m.t, rule = lambda m, t: m.u[t]*m.T)\n", "\n", "m.ode1 = Constraint(m.t, rule = lambda m, t: \n", " m_total*m.a[t]/m.T**2 == -m_total*g + v_exhaust*m.u[t])\n", "\n", "m.h[0].fix(h_initial)\n", "m.v[0].fix(-v_initial)\n", "\n", "m.h[1].fix(0) # land on surface\n", "m.v[1].fix(0) # soft landing\n", "\n", "def solve(m):\n", " TransformationFactory('dae.finite_difference').apply_to(m, nfe=50, method='forward')\n", " SolverFactory('ipopt', executable=ipopt_executable).solve(m)\n", " \n", " tsim = [t*m.T() for t in m.t]\n", " hsim = [m.h[t]() for t in m.t]\n", " usim = [m.u[t]() for t in m.t]\n", "\n", " plt.subplot(2,1,1)\n", " plt.plot(tsim, hsim)\n", " plt.title('altitude')\n", " plt.ylabel('meters')\n", " plt.legend(['mission length = ' + str(round(m.T(),1)) + ' seconds'])\n", "\n", " plt.subplot(2,1,2)\n", " plt.plot(tsim, usim)\n", " plt.title('engine mass flow')\n", " plt.xlabel('time / seconds')\n", " plt.ylabel('kg/sec')\n", " plt.legend(['fuel burned = ' + str(round(m.fuel(),1)) + ' kg'])\n", "\n", " plt.tight_layout()\n", "\n", "solve(m)" ] }, { "cell_type": "markdown", "metadata": { "colab_type": "text", "id": "S7sI82VUcSii" }, "source": [ "### Minimize fuel consumption.\n", "\n", "$$\\min_{u(\\tau), T} T\\int_0^1 u(\\tau)\\, d\\tau$$" ] }, { "cell_type": "code", "execution_count": 10, "metadata": { "colab": { "base_uri": "https://localhost:8080/", "height": 297 }, "colab_type": "code", "executionInfo": { "elapsed": 10032, "status": "ok", "timestamp": 1556833351245, "user": { "displayName": "Jeffrey Kantor", "photoUrl": "https://lh5.googleusercontent.com/-8zK5aAW5RMQ/AAAAAAAAAAI/AAAAAAAAKB0/kssUQyz8DTQ/s64/photo.jpg", "userId": "09038942003589296665" }, "user_tz": 240 }, "id": "Aefhp6mubQ5e", "outputId": "b80c2550-3eaa-4022-fd05-2d7a65f9f32c" }, "outputs": [ { "data": { "image/png": "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\n", "text/plain": [ "
" ] }, "metadata": { "tags": [] }, "output_type": "display_data" } ], "source": [ "m = ConcreteModel()\n", "m.t = ContinuousSet(bounds=(0, 1))\n", "m.h = Var(m.t)\n", "m.u = Var(m.t, bounds=(0, u_max))\n", "m.T = Var(domain=NonNegativeReals)\n", "\n", "m.v = DerivativeVar(m.h, wrt=m.t)\n", "m.a = DerivativeVar(m.v, wrt=m.t)\n", "\n", "m.fuel = Integral(m.t, wrt=m.t, rule = lambda m, t: m.u[t]*m.T)\n", "m.obj = Objective(expr=m.fuel, sense=minimize)\n", "\n", "m.ode1 = Constraint(m.t, rule = lambda m, t: m_total*m.a[t]/m.T**2 == -m_total*g + v_exhaust*m.u[t])\n", "\n", "m.h[0].fix(h_initial)\n", "m.v[0].fix(-v_initial)\n", "\n", "m.h[1].fix(0) # land on surface\n", "m.v[1].fix(0) # soft landing\n", "\n", "solve(m)" ] }, { "cell_type": "markdown", "metadata": { "colab_type": "text", "id": "GsfF_3Do-oHb" }, "source": [ "## Version 3: Rocket Model\n", "\n", "The first version of the rocket model has run into a serious problem because it appears not to provide enough mass flow to the engine to prevent a crash landing. But that may be an artifact of the assumption of constant mass. For Apollo 11 Lunar Module, for example, the fuel in the descent engine comprises more than 50% of the total mass of the lander.\n", "\n", "For the second version of the rocket model, we augment the model with a mass balance for fuel. This yields \n", "\n", "\\begin{align*}\n", "\\frac{m(t)}{T^2}\\frac{d^2h}{d\\tau^2} & = - m(t)g + v_eu \\\\\n", "\\\\\n", "\\frac{1}{T}\\frac{dm}{d\\tau} & = -u\n", "\\end{align*}" ] }, { "cell_type": "markdown", "metadata": { "colab_type": "text", "id": "U-3yVHHsJJO4" }, "source": [ "At this point we need to worry about nonsensical answers to the optimization for minimum fuel. For this purpose we add upper and lower bounds on $T$ that should restrict the solver to meaningful solutions." ] }, { "cell_type": "code", "execution_count": 11, "metadata": { "colab": { "base_uri": "https://localhost:8080/", "height": 297 }, "colab_type": "code", "executionInfo": { "elapsed": 11017, "status": "ok", "timestamp": 1556833352237, "user": { "displayName": "Jeffrey Kantor", "photoUrl": "https://lh5.googleusercontent.com/-8zK5aAW5RMQ/AAAAAAAAAAI/AAAAAAAAKB0/kssUQyz8DTQ/s64/photo.jpg", "userId": "09038942003589296665" }, "user_tz": 240 }, "id": "rE5Az9d-DWn9", "outputId": "e7cde1a1-74f2-4917-e3a6-cf436e0cae28" }, "outputs": [ { "data": { "image/png": "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\nf//93H777fztb3/z7E9LS2P79u0APPvss0yYMIGMjAyuvvpqampqjnDWA/73f/+XESNGMGXKFLKz\ns4GD/+efk5ND3fiETz31FGeeeSannnoqU6ZM4cMPP2Ty5Mmce+65DB06lFmzZlE3Mv7KlSs5+eST\nGTt2LKeffjp79uzxpI8aNYpRo0bx4IMPtkodxcTEeNZLSko83+Ecf/zxdOvm/OiPPfZYMjMzAdi4\ncSMTJ04kIiKCoKAgTj75ZF5++eWD6uS+++5r0ndBixYtYtq0aURERBwxT21tLZdddhl/+tOfAHji\niScYPHgwEyZM4Je//CXXXntt82+6BbZkFXNMfARhwYHtcj1jWoPfdDNX1b+KyGrgR27Snar6diOH\nPYUzbfYzXmm3AO+r6r0icou7ffPRlu+O19azYXfh0Z7mIMOTY7jtJyOOuP+RRx7hrbfeYunSpSQm\nJnL77bfXm2/jxo0sXLiQ5cuXExwczDXXXMP8+fO55JJLjnjukpISxo0bx/3338/s2bO54447mDdv\nXoPl/frrr1mzZg3x8fF8+OGHfPPNN6xfv57k5GQmTZrE8uXLmThxIr/5zW949dVXSUpKYuHChdx6\n6608+eST/OIXv2DevHmcdNJJ3HjjjfVeo6ioiBNPPLHefc899xzDhw8/LP3WW2/lmWeeITY2lqVL\nlx62/4knnmDatGmAE9RvvfVWcnNzCQ8PZ8mSJYwbNw6AV199ld69ezNq1KgG66HOggUL+O1vf3vE\n/dXV1cyaNctzzd27d3PnnXfy9ddfEx0dzamnntrkax2tTVlF1kHCdDh+E6BcG4FqVX1PRCJEJFpV\ni46UWVU/FpHUQ5LPAia7608DH9IKAcqfvf/++6xcuZLx48cDUFZWRvfu3Rs8JiAggPPPPx+Aiy66\niHPOOafR65x22mnEx8d7tidMmEBKSgoAGRkZbN++nbi4ONatW8dpp50GQE1NDb169SI/P5/8/HxO\nOukkAC6++GLefPPNw64RHR3NqlWrmnDXB8yZM4c5c+Zwzz33MG/ePO644w7PvqVLl/LEE0+wbNky\nAIYNG8bNN9/M1KlTiYyMJCMjg8DAQEpLS7n77rt55513mnTNPXv2sHbtWk4//fQj5rn66qs577zz\nuPXWWwFYsWIFJ598sqcOf/azn/H99983615borqmlm05JZwytOHfCWP8jd8EKBH5JXAVEA8MAHoD\n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\ngU2tWAAAAABJRU5ErkJggg==\n", "text/plain": [ "
" ] }, "metadata": { "tags": [] }, "output_type": "display_data" } ], "source": [ "m = ConcreteModel()\n", "m.t = ContinuousSet(bounds=(0, 1))\n", "m.h = Var(m.t, domain=NonNegativeReals)\n", "m.m = Var(m.t)\n", "m.u = Var(m.t, bounds=(0, u_max))\n", "m.T = Var(bounds=(50,3000))\n", "\n", "m.v = DerivativeVar(m.h, wrt=m.t)\n", "m.a = DerivativeVar(m.v, wrt=m.t)\n", "m.mdot = DerivativeVar(m.m, wrt=m.t)\n", "\n", "m.fuel = Integral(m.t, wrt=m.t, rule = lambda m, t: m.u[t]*m.T)\n", "m.obj = Objective(expr=m.fuel, sense=minimize)\n", "\n", "m.ode1 = Constraint(m.t, rule = lambda m, t: m.m[t]*m.a[t]/m.T**2 == -m.m[t]*g + v_exhaust*m.u[t])\n", "m.ode2 = Constraint(m.t, rule = lambda m, t: m.mdot[t]/m.T == -m.u[t])\n", "\n", "m.h[0].fix(h_initial)\n", "m.v[0].fix(-v_initial)\n", "m.m[0].fix(m_total)\n", "\n", "m.h[1].fix(0) # land on surface\n", "m.v[1].fix(0) # soft landing\n", "\n", "def solve(m):\n", " TransformationFactory('dae.finite_difference').apply_to(m, nfe=50, method='forward')\n", " SolverFactory('ipopt', executable=ipopt_executable).solve(m)\n", " \n", " m_nonfuel = m_ascent_dry + m_ascent_fuel + m_descent_dry\n", " \n", " tsim = [t*m.T() for t in m.t]\n", " hsim = [m.h[t]() for t in m.t]\n", " usim = [m.u[t]() for t in m.t]\n", " fsim = [m.m[t]() - m_nonfuel for t in m.t]\n", "\n", " plt.subplot(3,1,1)\n", " plt.plot(tsim, hsim)\n", " plt.title('altitude')\n", " plt.ylabel('meters')\n", " plt.legend(['mission length = ' + str(round(m.T(),1)) + ' seconds'])\n", "\n", " plt.subplot(3,1,2)\n", " plt.plot(tsim, usim)\n", " plt.title('engine mass flow')\n", " plt.ylabel('kg/sec')\n", " plt.legend(['fuel burned = ' + str(round(m.fuel(),1)) + ' kg'])\n", "\n", " plt.subplot(3,1,3)\n", " plt.plot(tsim, fsim)\n", " plt.title('fuel remaining')\n", " plt.xlabel('time / seconds')\n", " plt.ylabel('kg')\n", " plt.legend(['fuel remaining = ' + str(round(fsim[-1],2)) + ' kg'])\n", "\n", " plt.tight_layout()\n", "\n", "solve(m)" ] }, { "cell_type": "code", "execution_count": 0, "metadata": { "colab": {}, "colab_type": "code", "id": "dT6TAUd0PJCV" }, "outputs": [], "source": [] }, { "cell_type": "markdown", "metadata": { "colab_type": "text", "id": "NFg82boWSfig" }, "source": [ "\n", "< [Simulation and Optimal Control in Pharmacokinetics](http://nbviewer.jupyter.org/github/jckantor/CBE30338/blob/master/notebooks/07.01-Simulation-and-Optimal-Control-in-Pharmacokinetics.ipynb) | [Contents](toc.ipynb) | [Simulation in Pyomo](http://nbviewer.jupyter.org/github/jckantor/CBE30338/blob/master/notebooks/07.03-Simulation-in-Pyomo.ipynb) >

\"Open

\"Download\"" ] } ], "metadata": { "colab": { "collapsed_sections": [], "name": "07.02-Soft-Landing-a-Rocket.ipynb", "provenance": [ { "file_id": "1dZEqItjD20N1qGb0kQbEFA4Ylc1k0QWq", "timestamp": 1554216470815 } ], "toc_visible": true, "version": "0.3.2" }, "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.4" } }, "nbformat": 4, "nbformat_minor": 1 }