{ "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 of an Exothermic CSTR](http://nbviewer.jupyter.org/github/jckantor/CBE30338/blob/master/notebooks/07.04-Simulation-of-an-Exothermic-CSTR.ipynb) | [Contents](toc.ipynb) | [Path Planning for a Simple Car](http://nbviewer.jupyter.org/github/jckantor/CBE30338/blob/master/notebooks/07.06-Path-Planning-for-a-Simple-Car.ipynb) >

\"Open

\"Download\"" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "# First Order System in Pyomo" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## First-Order Differential Equation with Initial Condition\n", "\n", "The following cell implements a solution to a first-order linear model in the form\n", "\n", "\\begin{align}\n", "\\tau\\frac{dy}{dt} + y & = K u(t) \\\\\n", "\\end{align}\n", "\n", "where $\\tau$ and $K$ are model parameters, and $u(t)$ is an external process input." ] }, { "cell_type": "code", "execution_count": 5, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "# ==========================================================\n", "# = Solver Results =\n", "# ==========================================================\n", "# ----------------------------------------------------------\n", "# Problem Information\n", "# ----------------------------------------------------------\n", "Problem: \n", "- Lower bound: -inf\n", " Upper bound: inf\n", " Number of objectives: 1\n", " Number of constraints: 101\n", " Number of variables: 101\n", " Sense: unknown\n", "# ----------------------------------------------------------\n", "# Solver Information\n", "# ----------------------------------------------------------\n", "Solver: \n", "- Status: ok\n", " Message: Ipopt 3.12.8\\x3a Optimal Solution Found\n", " Termination condition: optimal\n", " Id: 0\n", " Error rc: 0\n", " Time: 0.024537086486816406\n", "# ----------------------------------------------------------\n", "# Solution Information\n", "# ----------------------------------------------------------\n", "Solution: \n", "- number of solutions: 0\n", " number of solutions displayed: 0\n" ] }, { "data": { "text/plain": [ "Text(0.5,1,'Response of a linear first-order ODE')" ] }, "execution_count": 5, "metadata": {}, "output_type": "execute_result" }, { "data": { "image/png": "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\n", "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "% matplotlib inline\n", "from pyomo.environ import *\n", "from pyomo.dae import *\n", "import matplotlib.pyplot as plt\n", "\n", "tf = 10\n", "tau = 1\n", "K = 5\n", "\n", "# define u(t)\n", "u = lambda t: 0 if t < 5 else 1\n", "\n", "# create a model object\n", "model = ConcreteModel()\n", "\n", "# define the independent variable\n", "model.t = ContinuousSet(bounds=(0, tf))\n", "\n", "# define the dependent variables\n", "model.y = Var(model.t)\n", "model.dydt = DerivativeVar(model.y)\n", "\n", "# fix the initial value of y\n", "model.y[0].fix(0)\n", "\n", "# define the differential equation as a constraint\n", "model.ode = Constraint(model.t, \n", " rule=lambda model, t: tau*model.dydt[t] + model.y[t] == K*u(t))\n", "\n", "# transform dae model to discrete optimization problem\n", "TransformationFactory('dae.finite_difference').apply_to(model, nfe=50, method='BACKWARD')\n", "\n", "# solve the model\n", "SolverFactory('ipopt').solve(model).write()\n", "\n", "# access elements of a ContinuousSet object\n", "t = [t for t in model.t]\n", "\n", "# access elements of a Var object\n", "y = [model.y[t]() for t in model.y]\n", "\n", "plt.plot(t,y)\n", "plt.xlabel('time / sec')\n", "plt.ylabel('response')\n", "plt.title('Response of a linear first-order ODE')" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [] }, { "cell_type": "markdown", "metadata": {}, "source": [ "\n", "< [Simulation of an Exothermic CSTR](http://nbviewer.jupyter.org/github/jckantor/CBE30338/blob/master/notebooks/07.04-Simulation-of-an-Exothermic-CSTR.ipynb) | [Contents](toc.ipynb) | [Path Planning for a Simple Car](http://nbviewer.jupyter.org/github/jckantor/CBE30338/blob/master/notebooks/07.06-Path-Planning-for-a-Simple-Car.ipynb) >

\"Open

\"Download\"" ] } ], "metadata": { "kernelspec": { "display_name": "Python 3", "language": "python", "name": "python3" }, "language_info": { "codemirror_mode": { "name": "ipython", "version": 3 }, "file_extension": ".py", "mimetype": "text/x-python", "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", "version": "3.6.8" } }, "nbformat": 4, "nbformat_minor": 2 }