{ "cells": [ { "cell_type": "markdown", "id": "4ab419fc", "metadata": {}, "source": [ "\n", "*This notebook contains material from [CBE60499](https://ndcbe.github.io/CBE60499);\n", "content is available [on Github](git@github.com:ndcbe/CBE60499.git).*\n" ] }, { "cell_type": "markdown", "id": "a72d2a74", "metadata": {}, "source": [ "\n", "< [2.4 Dynamic Optimization: Differential Algebraic Equations (DAEs)](https://ndcbe.github.io/CBE60499/02.04-DAE-modeling.html) | [Contents](toc.html) | [Tag Index](tag_index.html) | [2.6 Dynamic Optimization with Pyomo.DAE](https://ndcbe.github.io/CBE60499/02.06-Pyomo-DAE.html) >
"
]
},
{
"cell_type": "markdown",
"metadata": {
"nbpages": {
"level": 1,
"link": "[2.5 Numeric Integration for DAEs](https://ndcbe.github.io/CBE60499/02.05-Numeric-Integration.html#2.5-Numeric-Integration-for-DAEs)",
"section": "2.5 Numeric Integration for DAEs"
}
},
"source": [
"# 2.5 Numeric Integration for DAEs\n",
"\n",
"The purpose of this notebook/class session is to provide the requisite background on numeric integration of DAEs. This helps appreciate the \"direct transcription\" approach for dynamic optimization used in `Pyomo.dae`."
]
},
{
"cell_type": "code",
"execution_count": 1,
"metadata": {
"nbpages": {
"level": 1,
"link": "[2.5 Numeric Integration for DAEs](https://ndcbe.github.io/CBE60499/02.05-Numeric-Integration.html#2.5-Numeric-Integration-for-DAEs)",
"section": "2.5 Numeric Integration for DAEs"
}
},
"outputs": [],
"source": [
"import numpy as np\n",
"import scipy.optimize as opt\n",
"import matplotlib.pyplot as plt"
]
},
{
"cell_type": "markdown",
"metadata": {
"nbpages": {
"level": 2,
"link": "[2.5.1 Single-Step Runge-Kutta Methods](https://ndcbe.github.io/CBE60499/02.05-Numeric-Integration.html#2.5.1-Single-Step-Runge-Kutta-Methods)",
"section": "2.5.1 Single-Step Runge-Kutta Methods"
}
},
"source": [
"## 2.5.1 Single-Step Runge-Kutta Methods\n",
"* ADD REFERENCE HERE\n",
"* Chapter 9 in [Biegler (2010)](https://epubs.siam.org/doi/book/10.1137/1.9780898719383)\n",
"* Chapter 17 in [McClarren (2018)](https://www.sciencedirect.com/book/9780128122532/computational-nuclear-engineering-and-radiological-science-using-python)"
]
},
{
"cell_type": "markdown",
"metadata": {
"nbpages": {
"level": 3,
"link": "[2.5.1.1 General Form: Index 0 DAE](https://ndcbe.github.io/CBE60499/02.05-Numeric-Integration.html#2.5.1.1-General-Form:-Index-0-DAE)",
"section": "2.5.1.1 General Form: Index 0 DAE"
}
},
"source": [
"### 2.5.1.1 General Form: Index 0 DAE\n",
"\n",
"Consider the ODE system:\n",
"$$\\begin{equation*}\n",
"\\dot{z} = f(t,z), \\quad z(t_0) = z_0\n",
"\\end{equation*}$$\n",
"\n",
"where $z(t)$ are the differentail variables and $f(t,z)$ is a (nonlinear) continous function.\n",
"\n",
"The general Runge-Kutta formula is:\n",
"$$\\begin{align*}\n",
"z_{i+1} &= z_{i} + h_i \\sum_{k=1}^{n_s} b_k f(t_i + c_k h_i, \\hat{z}_k) \\\\\n",
" \\hat{z}_k &= z_i + h_i \\sum_{j=1}^{n_{rk}} a_{k,j} f(t_i + c_j h_i, \\hat{z}_j), \\quad k=1,...,n_s \n",
"\\end{align*}$$\n",
"\n",
"where\n",
"* $z_i$ are the differential variables at the **start** of **step** $i$ (time $t_i$)\n",
"* $z_{i+1}$ are the differential variables at the **end** of **step** $i$ (time $t_{i+1}$)\n",
"* $\\hat{z}_k$ are differential variables for **intermediate stage** $k$\n",
"* $h_i$ is the size for step $i$ such that $t_{i+1} = t_i + h_i$\n",
"* $n_s$ is the number of stages\n",
"* $n_{rk}$ is the number of $f(\\cdot)$ evaluations to calculate intermediate $k$\n",
"* $a_{k,j}$ are coefficients, together known as the *Runge-Kutta matrix*\n",
"* $b_k$ are cofficients, known as the *weights*\n",
"* $c_k$ are coefficients, know as the *nodes*\n",
"\n",
"$h_i$ is selected based on error tolerances\n",
"\n",
"The choice for $A$, $b$ and $c$ selects the specific method in the *Runge-Kutta family*. These coefficients are often specific in a [Butcher block](https://en.wikipedia.org/wiki/Runge%E2%80%93Kutta_methods#Explicit_Runge) (or Butcher tableau).\n",
"\n",
"A Runge-Kutta method is called [**consistent**](https://en.wikiversity.org/wiki/Numerical_Analysis/stability_of_RK_methods) if:\n",
"$$\\begin{equation*}\n",
"\\sum_{k=1}^{n_s} b_k = 1 \\quad \\mathrm{and} \\quad \\sum_{j=1}^{n_s} a_{k,j} = c_k\n",
"\\end{equation*}$$"
]
},
{
"cell_type": "markdown",
"metadata": {
"nbpages": {
"level": 3,
"link": "[2.5.1.2 Explicit (Forward) Euler](https://ndcbe.github.io/CBE60499/02.05-Numeric-Integration.html#2.5.1.2-Explicit-(Forward)-Euler)",
"section": "2.5.1.2 Explicit (Forward) Euler"
}
},
"source": [
"### 2.5.1.2 Explicit (Forward) Euler\n",
"\n",
"Consider one of the simplest Runge-Kutta methods:\n",
"\n",
"$$z_{i+1} = z_{i} + h_i~f(t_i, z_i)$$\n",
"\n",
"What are $A$, $b$ and $c$ in the general formula?\n",
"\n",
"$n_s = 1$. This is only a single stage. Thus we only need to determine $c_1$, $b_1$, and $n_{r1}$\n",
"\n",
"Moreover, $\\hat{z}_1 = z_i$ because $f(\\cdot)$ is only evaluated at $t_i$ and $z_i$. This implies:\n",
"* $n_{r1} = 0$\n",
"* $c_1 = 0$\n",
"* $b_1 = 1$\n",
"* $A$ is empty because $n_{r1} = 0$\n",
"\n",
"The implementation is very straightword (see below). We can calculate $z_{i+1}$ with a single line!"
]
},
{
"cell_type": "code",
"execution_count": 2,
"metadata": {
"nbpages": {
"level": 3,
"link": "[2.5.1.2 Explicit (Forward) Euler](https://ndcbe.github.io/CBE60499/02.05-Numeric-Integration.html#2.5.1.2-Explicit-(Forward)-Euler)",
"section": "2.5.1.2 Explicit (Forward) Euler"
}
},
"outputs": [],
"source": [
"def create_steps(tstart,tend,dt):\n",
" n = int(np.ceil((tend-tstart)/dt))\n",
" return dt*np.ones(n)\n",
"\n",
"def explicit_euler(f,h,z0):\n",
" '''\n",
" Arguments:\n",
" f: function that returns rhs of ODE\n",
" h: list of step sizes\n",
" z0: initial conditions\n",
" \n",
" Returns:\n",
" t: list of time steps. t[0] is 0.0 by default\n",
" z: list of differential variable values\n",
" '''\n",
" \n",
" # Number of timesteps\n",
" nT = len(h) + 1\n",
" \n",
" t = np.zeros(nT)\n",
" \n",
" # Number of states\n",
" nZ = len(z0)\n",
" Z = np.zeros((nT,nZ))\n",
" \n",
" # Copy initial states\n",
" Z[0,:] = z0\n",
" \n",
" for i in range(1,nT):\n",
" \n",
" i_ = i-1\n",
" \n",
" # Advance time\n",
" t[i] = t[i_] + h[i_]\n",
" \n",
" # Implicit Euler formula\n",
" Z[i,:] = Z[i_,:] + h[i_]*f(t[i_],Z[i_,:])\n",
" \n",
" return t, Z"
]
},
{
"cell_type": "markdown",
"metadata": {
"nbpages": {
"level": 3,
"link": "[2.5.1.3 Implicit (Backward) Euler](https://ndcbe.github.io/CBE60499/02.05-Numeric-Integration.html#2.5.1.3-Implicit-(Backward)-Euler)",
"section": "2.5.1.3 Implicit (Backward) Euler"
}
},
"source": [
"### 2.5.1.3 Implicit (Backward) Euler\n",
"\n",
"Consider another simple Runge-Kutta method:\n",
"\n",
"$$z_{i+1} = z_{i} + h_i~f(t_{i+1}, z_{i+1})$$\n",
"\n",
"What are $A$, $b$ and $c$ to express using the general formula?\n",
"\n",
"$n_s = 1$. Thus is only a single stage. Moreover, $\\hat{z}_1 = z_{i+1}$ because $f(\\cdot)$ is evaluated at $t_{i+1}$ and $z_{i+1}$. This implies:\n",
"* $b_1 = 1$\n",
"* $c_1 = 1$\n",
"\n",
"Moreover, $z_{i+1} = z_{i} + h_i~f(t_{i+1}, z_{i+1})$ implies $\\hat{z}_1 = z_i + h_i f(t_{i+1}, \\hat{z}_1)$. Thus:\n",
"* $a_{1,1} = 1$\n",
"\n",
"Notice that the formula for $z_{i+1}$ is implicit. We need to solve a (nonlinear) system of equations to calculate the step."
]
},
{
"cell_type": "code",
"execution_count": 3,
"metadata": {
"nbpages": {
"level": 3,
"link": "[2.5.1.3 Implicit (Backward) Euler](https://ndcbe.github.io/CBE60499/02.05-Numeric-Integration.html#2.5.1.3-Implicit-(Backward)-Euler)",
"section": "2.5.1.3 Implicit (Backward) Euler"
}
},
"outputs": [],
"source": [
"def implicit_euler(f,h,z0):\n",
" '''\n",
" Arguments:\n",
" f: function that returns rhs of ODE\n",
" h: list of step sizes\n",
" z0: initial conditions\n",
" \n",
" Returns:\n",
" t: list of time steps. t[0] is 0.0 by default\n",
" z: list of differential variable values\n",
" '''\n",
" \n",
" # Number of timesteps\n",
" nT = len(h) + 1\n",
" \n",
" t = np.zeros(nT)\n",
" \n",
" # Number of states\n",
" nZ = len(z0)\n",
" Z = np.zeros((nT,nZ))\n",
" \n",
" # Copy initial states\n",
" Z[0,:] = z0\n",
" \n",
" for i in range(1,nT):\n",
" \n",
" i_ = i-1\n",
" \n",
" # Advance time\n",
" t[i] = t[i_] + h[i_]\n",
" \n",
" ## Implicit Runge-Kutta formula.\n",
" ## Need to solve nonlinear system of equations.\n",
" \n",
" # Use Explicit Euler to calculate initial guess\n",
" Z[i,:] = Z[i_,:] + h[i_]*f(t[i_],Z[i_,:])\n",
" \n",
" # Solve nonlinear equation\n",
" implicit = lambda z : Z[i_,:] + h[i_]*f(t[i_],z) - z\n",
" Z[i,:] = opt.fsolve(implicit, Z[i,:])\n",
" \n",
" \n",
" return t, Z"
]
},
{
"cell_type": "markdown",
"metadata": {
"nbpages": {
"level": 3,
"link": "[2.5.1.4 Comparison](https://ndcbe.github.io/CBE60499/02.05-Numeric-Integration.html#2.5.1.4-Comparison)",
"section": "2.5.1.4 Comparison"
}
},
"source": [
"### 2.5.1.4 Comparison\n",
"\n",
"Let's test this on a simple problem:\n",
"$$\\dot{z}(t) = -\\lambda z(t), \\qquad z_0 = 1.$$ The solution to this problem is \n",
"$$z(t) = e^{-\\lambda t}.$$\n",
"\n",
"For simplicity, let's numerically analyze $\\lambda = 1$."
]
},
{
"cell_type": "code",
"execution_count": 4,
"metadata": {
"nbpages": {
"level": 3,
"link": "[2.5.1.4 Comparison](https://ndcbe.github.io/CBE60499/02.05-Numeric-Integration.html#2.5.1.4-Comparison)",
"section": "2.5.1.4 Comparison"
}
},
"outputs": [
{
"data": {
"image/png": "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\n",
"text/plain": [
"
\n",
"
"
]
},
{
"cell_type": "markdown",
"metadata": {
"nbpages": {
"level": 3,
"link": "[2.5.2.4 Code](https://ndcbe.github.io/CBE60499/02.05-Numeric-Integration.html#2.5.2.4-Code)",
"section": "2.5.2.4 Code"
}
},
"source": [
"### 2.5.2.4 Code"
]
},
{
"cell_type": "code",
"execution_count": 2,
"metadata": {
"nbpages": {
"level": 3,
"link": "[2.5.2.4 Code](https://ndcbe.github.io/CBE60499/02.05-Numeric-Integration.html#2.5.2.4-Code)",
"section": "2.5.2.4 Code"
}
},
"outputs": [],
"source": [
"import numpy as np\n",
"import matplotlib.pyplot as plt\n",
"def GLQuad(f, L=8,dataReturn = False):\n",
" \"\"\"Compute the Gauss-Legendre Quadrature estimate \n",
" of the integral of f(x) from -1 to 1\n",
" Inputs:\n",
" f: name of function to integrate\n",
" L: Order of integration rule (8 or less)\n",
" \n",
" Returns:\n",
" G-L Quadrature estimate\"\"\"\n",
" assert(L>=1)\n",
" if (L==1):\n",
" weights = np.ones(1)*2\n",
" xs = np.array([0])\n",
" elif (L==2):\n",
" weights = np.ones(2)\n",
" xs = np.array([-np.sqrt(1.0/3.0),np.sqrt(1.0/3.0)])\n",
" elif (L==3):\n",
" weights = np.array([0.8888888888888888888888889,\n",
" 0.5555555555555555555555556,\n",
" 0.5555555555555555555555556])\n",
" xs = np.array([0.0,-0.7745966692414833770358531,\n",
" 0.7745966692414833770358531])\n",
" elif (L==4):\n",
" weights = np.array([0.6521451548625461426269361,0.6521451548625461426269361,\n",
" 0.3478548451374538573730639,0.3478548451374538573730639])\n",
" xs = np.array([-0.3399810435848562648026658, 0.3399810435848562648026658,\n",
" -0.8611363115940525752239465, 0.8611363115940525752239465])\n",
" elif (L==5):\n",
" weights = np.array([0.5688888888888888888888889,\n",
" 0.4786286704993664680412915,0.4786286704993664680412915,\n",
" 0.2369268850561890875142640,0.2369268850561890875142640])\n",
" xs = np.array([0.0,-0.5384693101056830910363144,0.5384693101056830910363144,\n",
" -0.9061798459386639927976269,0.9061798459386639927976269])\n",
" elif (L==6):\n",
" weights = np.array([0.4679139345726910473898703,0.4679139345726910473898703,\n",
" 0.3607615730481386075698335,0.3607615730481386075698335,\n",
" 0.1713244923791703450402961,0.1713244923791703450402961])\n",
" xs = np.array([-0.2386191860831969086305017, 0.2386191860831969086305017,\n",
" -0.6612093864662645136613996, 0.6612093864662645136613996,\n",
" -0.9324695142031520278123016, 0.9324695142031520278123016])\n",
" elif (L==7):\n",
" weights = np.array([0.4179591836734693877551020,\n",
" 0.3818300505051189449503698,0.3818300505051189449503698,\n",
" 0.2797053914892766679014678,0.2797053914892766679014678,\n",
" 0.1294849661688696932706114,0.1294849661688696932706114])\n",
" xs = np.array([0.0,-0.4058451513773971669066064,0.4058451513773971669066064,\n",
" -0.7415311855993944398638648,0.7415311855993944398638648,\n",
" -0.9491079123427585245261897,0.9491079123427585245261897])\n",
" elif (L==8):\n",
" weights = np.array([0.3626837833783619829651504,0.3626837833783619829651504,\n",
" 0.3137066458778872873379622,0.3137066458778872873379622,\n",
" 0.2223810344533744705443560,0.2223810344533744705443560,\n",
" 0.1012285362903762591525314,0.1012285362903762591525314])\n",
" xs = np.array([-0.1834346424956498049394761, 0.1834346424956498049394761,\n",
" -0.5255324099163289858177390, 0.5255324099163289858177390,\n",
" -0.7966664774136267395915539, 0.7966664774136267395915539,\n",
" -0.9602898564975362316835609, 0.9602898564975362316835609])\n",
" else: #use numpy's function\n",
" xs, weights = np.polynomial.legendre.leggauss(L)\n",
" \n",
" quad_estimate = np.sum(weights*f(xs))\n",
" if (dataReturn):\n",
" return quad_estimate, weights, xs\n",
" else:\n",
" return quad_estimate"
]
},
{
"cell_type": "markdown",
"metadata": {
"nbpages": {
"level": 3,
"link": "[2.5.2.5 Visualize Weights](https://ndcbe.github.io/CBE60499/02.05-Numeric-Integration.html#2.5.2.5-Visualize-Weights)",
"section": "2.5.2.5 Visualize Weights"
}
},
"source": [
"### 2.5.2.5 Visualize Weights"
]
},
{
"cell_type": "code",
"execution_count": 3,
"metadata": {
"nbpages": {
"level": 3,
"link": "[2.5.2.5 Visualize Weights](https://ndcbe.github.io/CBE60499/02.05-Numeric-Integration.html#2.5.2.5-Visualize-Weights)",
"section": "2.5.2.5 Visualize Weights"
}
},
"outputs": [
{
"data": {
"image/png": "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\n",
"text/plain": [
" \n",
"$L$ $x_l$ $w_l$ \n",
"1 0 2.0000000000000000000000000 2 ±0.5773502691896257645091488 1.0000000000000000000000000 3 0 0.8888888888888888888888889 ±0.7745966692414833770358531 0.5555555555555555555555556 4 ±0.3399810435848562648026658 0.6521451548625461426269361 ±0.8611363115940525752239465 0.3478548451374538573730639 5 0 0.5688888888888888888888889 ±0.5384693101056830910363144 0.4786286704993664680412915 ±0.9061798459386639927976269 0.2369268850561890875142640 6 ±0.2386191860831969086305017 0.4679139345726910473898703 ±0.6612093864662645136613996 0.3607615730481386075698335 ±0.9324695142031520278123016 0.1713244923791703450402961 7 0 0.4179591836734693877551020 ±0.4058451513773971669066064 0.3818300505051189449503698 ±0.7415311855993944398638648 0.2797053914892766679014678 ±0.9491079123427585245261897 0.1294849661688696932706114 8 ±0.1834346424956498049394761 0.3626837833783619829651504 ±0.5255324099163289858177390 0.3137066458778872873379622 ±0.7966664774136267395915539 0.2223810344533744705443560 \n",
"±0.9602898564975362316835609 0.1012285362903762591525314 "
]
}
],
"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.8.6"
}
},
"nbformat": 4,
"nbformat_minor": 2
}