{ "cells": [ { "cell_type": "markdown", "metadata": { "id": "0LK2EfX4lq-4", "nbpages": { "level": 0, "link": "[](https://jckantor.github.io/cbe30338-2021/06.03-Predictive-Control.html)", "section": "" } }, "source": [ "\n", "*This notebook contains material from [cbe30338-2021](https://jckantor.github.io/cbe30338-2021);\n", "content is available [on Github](https://github.com/jckantor/cbe30338-2021.git).*\n" ] }, { "cell_type": "markdown", "metadata": { "id": "eCfL4gSqlq-_", "nbpages": { "level": 0, "link": "[](https://jckantor.github.io/cbe30338-2021/06.03-Predictive-Control.html)", "section": "" } }, "source": [ "\n", "< [6.2 Simulation and Open-Loop Optimal Control](https://jckantor.github.io/cbe30338-2021/06.02-Simulation-and-Open-Loop-Optimal-Control.html) | [Contents](toc.html) | [Tag Index](tag_index.html) | [6.4 Implementing Predictive Control](https://jckantor.github.io/cbe30338-2021/06.04-Implementing-Predictive-Control.html) >

\"Open

\"Download\"" ] }, { "cell_type": "markdown", "metadata": { "id": "MchKwOJOlq_A", "nbpages": { "level": 1, "link": "[6.3 Predictive Control](https://jckantor.github.io/cbe30338-2021/06.03-Predictive-Control.html#6.3-Predictive-Control)", "section": "6.3 Predictive Control" } }, "source": [ "# 6.3 Predictive Control\n" ] }, { "cell_type": "markdown", "metadata": { "id": "gsSqgmyilq_B", "nbpages": { "level": 3, "link": "[6.3.1 Model](https://jckantor.github.io/cbe30338-2021/06.03-Predictive-Control.html#6.3.1-Model)", "section": "6.3.1 Model" } }, "source": [ "### 6.3.1 Model\n", "\n", "We will use the two-state model for a single heater/sensor assembly for the calculations that follow.\n", "\n", "\\begin{align}\n", "C^H_p\\frac{dT_{H,1}}{dt} & = U_a(T_{amb} - T_{H,1}) + U_b(T_{S,1} - T_{H,1}) + \\alpha P_1 u_1\\\\\n", "C^S_p\\frac{dT_{S,1}}{dt} & = U_b(T_{H,1} - T_{S,1}) \n", "\\end{align}\n", "\n", "The model is recast into linear state space form as\n", "\n", "\\begin{align}\n", "\\frac{dx}{dt} & = A x + B_u u + B_d d \\\\\n", "y & = C x\n", "\\end{align}\n", "\n", "where\n", "\n", "$$x = \\begin{bmatrix} T_{H,1} \\\\ T_{S,1} \\end{bmatrix}\n", "\\qquad\n", "u = \\begin{bmatrix} u_1 \\end{bmatrix}\n", "\\qquad\n", "d = \\begin{bmatrix} T_{amb} \\end{bmatrix}\n", "\\qquad\n", "y = \\begin{bmatrix} T_{S,1} \\end{bmatrix}$$\n", "\n", "and\n", "\n", "$$A = \\begin{bmatrix} -\\frac{U_a+U_b}{C^H_p} & \\frac{U_b}{C^H_p} \\\\ \\frac{U_b}{C^S_p} & -\\frac{U_b}{C^S_p} \\end{bmatrix}\n", "\\qquad\n", "B_u = \\begin{bmatrix} \\frac{\\alpha P_1}{C^H_p} \\\\ 0 \\end{bmatrix}\n", "\\qquad\n", "B_d = \\begin{bmatrix} \\frac{U_a}{C_p^H} \\\\ 0 \\end{bmatrix}\n", "\\qquad\n", "C = \\begin{bmatrix} 0 & 1 \\end{bmatrix}$$\n" ] }, { "cell_type": "markdown", "metadata": { "id": "ztXe8jjMlq_H", "nbpages": { "level": 2, "link": "[6.3.1 Feedforward Optimal Control](https://jckantor.github.io/cbe30338-2021/06.03-Predictive-Control.html#6.3.1-Feedforward-Optimal-Control)", "section": "6.3.1 Feedforward Optimal Control" } }, "source": [ "## 6.3.1 Feedforward Optimal Control\n", "\n", "An optimal control policy minimizes the differences\n", "\n", "\\begin{align*}\n", "\\min_{u} \\int_{t_0}^{t_f} \\|T_H^{SP}(t) - T_H(t)\\|^2\\,dt \\\\\n", "\\end{align*}\n", "\n", "subject to constraints\n", "\n", "\\begin{align*}\n", "C_p^H \\frac{dT_H}{dt} & = U_a (T_{amb} - T_H) + U_c (T_S - T_H) + P u(t) + d(t)\\\\\n", "C_p^S \\frac{dT_S}{dt} & = - U_c (T_S - T_H) \n", "\\end{align*}\n", "\n", "initial conditions\n", "\n", "\\begin{align*}\n", "T_H(t_0) & = T_{amb} \\\\\n", "T_S(t_0) & = T_{amb}\n", "\\end{align*}\n", "\n", "and prior knowledge of $d(t)$." ] }, { "cell_type": "code", "execution_count": 24, "metadata": { "id": "BFMFRXBQmEMy", "nbpages": { "level": 2, "link": "[6.3.1 Feedforward Optimal Control](https://jckantor.github.io/cbe30338-2021/06.03-Predictive-Control.html#6.3.1-Feedforward-Optimal-Control)", "section": "6.3.1 Feedforward Optimal Control" } }, "outputs": [], "source": [ "%matplotlib inline\n", "import matplotlib.pyplot as plt\n", "import numpy as np\n", "import cvxpy as cp\n", "\n", "# parameter estimates.\n", "alpha = 0.00016 # watts / (units P * percent U1)\n", "P1 = 200 # P units\n", "P2 = 100 # P units\n", "Ua = 0.050 # heat transfer coefficient from heater to environment\n", "CpH = 2.2 # heat capacity of the heater (J/deg C)\n", "CpS = 1.9 # heat capacity of the sensor (J/deg C)\n", "Ub = 0.021 # heat transfer coefficient from heater to sensor\n", "\n", "# state space model\n", "A = np.array([[-(Ua + Ub)/CpH, Ub/CpH], [Ub/CpS, -Ub/CpS]])\n", "Bu = np.array([[alpha*P1/CpH], [0]]) # single column\n", "Bd = np.array([[Ua/CpH], [0]]) # single column\n", "C = np.array([[0, 1]]) # single row\n", "\n", "Tamb = 20" ] }, { "cell_type": "code", "execution_count": 18, "metadata": { "colab": { "base_uri": "https://localhost:8080/", "height": 227 }, "executionInfo": { "elapsed": 783, "status": "ok", "timestamp": 1618927830118, "user": { "displayName": "", "photoUrl": "", "userId": "" }, "user_tz": 240 }, "id": "L06xARtOmae_", "nbpages": { "level": 2, "link": "[6.3.1 Feedforward Optimal Control](https://jckantor.github.io/cbe30338-2021/06.03-Predictive-Control.html#6.3.1-Feedforward-Optimal-Control)", "section": "6.3.1 Feedforward Optimal Control" }, "outputId": "3a27c501-7452-4e78-b4fd-433b43c60598" }, "outputs": [ { "data": { "image/png": "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mDJlCnfeeSfXX389vXr14qWXCt/Z6tWrWblyJTfccANPP/003bp144c//CE333wz11xzzc59b81oyxGvlZL+ieQORklnAz5KZWZmZgA888wzjBkzhq5du9KzZ09OP/30beb37NmT8vJyvvnNb/LQQw/RtWvXnd7H6NGj6du379bpESNGcMABB1BWVsb555/P739fuOz8wQcfZNiwYQwdOpSXX355m1OZZ555JgDDhw/f+uDWp59+mosvvnjrMn369OFPf/oT8+bN48gjj6Sqqop77rmHN954Y6drbk5bWt6LKTzW4bOS3gIWARe0y97NzMysfbVyZArgvZQeJ7HdmbFtdOrUiVmzZjFz5kxqa2u5/fbbm/0dxk6dOm09Zbhhw4Zt5nXr1q3V/Uli0aJFTJkyheeff54+ffowbty4bbaz5557AlBWVrb1WrGI+Ni2IoLRo0dv/cHu9rTDI14R8XpEHAf0Az4bEUdFxOJ2r8TMzMx2S8cccwzTp0/nvffeY/369fz617/eZn5jYyNr167l5JNP5tZbb2X27NkA9OjRg/Xr129drrKykoaGBoCt14a1ZNasWSxatIjNmzczdepUjjrqKNatW0e3bt3o1asXy5cv5/HHH99h7ccffzy333771unVq1dz+OGH84c//IGFCxcC8Pe//52//OUvbfoudqTFI16Smv2Jny1dYUTc3C4VmJmZ2W5t2LBhnHvuuVRVVbHffvtx9NFHbzN//fr1nHHGGWzYsIGI4JZbbgHgvPPO41vf+ha33XYb06ZNY8KECXz5y1/mvvvu49hjj211n0cccQQTJ07kpZde4phjjmHMmDHsscceDB06lMGDB3PAAQdw5JFH7rD2H/zgB1x88cUccsghlJWVMWnSJM4880zuvvtuzj//fN5//30AbrjhBgYOHLiL39BHWvzJIElbbgU4GPhn4NFk+jTgdxHxzU+89zaqrq6OLXc5pKWjPcV4Z+U5f56zQ77zO3tNscsomo6Wf/78+Xzuc59r07J+cn375m/uu5e08z8ZFBHXJis/CQyLiPXJ9GTgl+1VsJmZmVletOWuxn8EPmgy/QFQmUo1ZmZmZh1YW+5qvA+YJWk6hUdKjAHuSbUqMzMzsw6oLb/VeKOkx4EtV8p9LSJeSLcsMzMz2xnNPRbB0tXSdfKtadOjayPiz8Cfd3rrZmZmlrry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\n", "text/plain": [ "

" ] }, "metadata": { "needs_background": "light" }, "output_type": "display_data" } ], "source": [ "# time grid\n", "tf = 800\n", "dt = 2\n", "n = round(tf/dt)\n", "t_grid = np.linspace(0, tf, n+1)\n", "\n", "# setpoint/reference\n", "def r(t):\n", " return np.interp(t, [0, 0, 0], [Tamb, Tamb, 60])\n", "\n", "def d(t):\n", " return np.interp(t, [0], [Tamb])\n", "\n", "# plot function\n", "fig, ax = plt.subplots(1, 1, figsize=(10, 3))\n", "ax.plot(t_grid, r(t_grid), label=\"setpoint\")\n", "ax.plot(t_grid, d(t_grid), label=\"disturbance\")\n", "ax.set_title('setpoint')\n", "ax.set_ylabel('deg C')\n", "ax.legend()\n", "ax.grid(True)" ] }, { "cell_type": "code", "execution_count": 19, "metadata": { "colab": { "base_uri": "https://localhost:8080/", "height": 441 }, "executionInfo": { "elapsed": 6186, "status": "ok", "timestamp": 1618928059293, "user": { "displayName": "", "photoUrl": "", "userId": "" }, "user_tz": 240 }, "id": "7c6IY7rolxul", "nbpages": { "level": 2, "link": "[6.3.1 Feedforward Optimal Control](https://jckantor.github.io/cbe30338-2021/06.03-Predictive-Control.html#6.3.1-Feedforward-Optimal-Control)", "section": "6.3.1 Feedforward Optimal Control" }, "outputId": "501e7233-58ea-4357-d2b7-ac4691463cf5" }, "outputs": [ { "data": { "image/png": "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nv1mz57N1q1be6RPFcgiIiIikva2bNnCM888w0knnQTsWyBfdtll/PznP++RvlQgi4iIiEhauemmm5g4cSKzZ89m2bJlANx7772cfvrpAPz4xz9m7dq1VFRUUFFRAcA555zD3Xff3SP9a5k3EREREenQNx96jdfXbu/Rc04ZPYhvnH3Eft+vqqpi/vz5vPjii7S0tHDMMccwY8YMnnzySc477zwArrnmGm655RYWLVpEUVERAEOHDqWxsZGamhqGDx+eVIwaQRYRERGRtPHEE0/wkY98hPz8fAYNGsQ555wDwLp16xgxYkSnx44cOZK1a9cmHYNGkEVERESkQ52N9PamjpZly8vLO+Baxg0NDeTl5SXdv0aQRURERCRtnHTSSdx///3s2rWLuro6HnroIQAmT57MihUr9uxXWFhIXV3dnm13Z/369ZSWliYdgwpkEREREUkbxxxzDBdeeCHTp0/nYx/7GCeeeCIAZ555JpWVlXv2mzNnDmecccaei/Sqqqo4/vjjycpKfoKEpliIiIiISFr56le/yle/+tV92m+44QZqa2sZMmQIc+fOZe7cuXveu+OOO7j66qt7pH+NIIuIiIhIRvjBD37AmjVrOnxv6tSpzJo1q0f60QiyiIiIiGSEmTNn7ve9T3/60z3WT8pHkM0s18yeM7OXzOw1M/tmvP38+HabmZWlOi4RERERiXH3sEPoUV39ecKYYtEInOLuRwHTgdPN7HjgVeCjwOMhxCQiIiIiQG5uLjU1NX2mSHZ3ampqyM3NDXxMyqdYeCzb9fHN7PjD3X0pdLzunYiIiIikRklJCdXV1WzatCllfTY0NHSpgO2q3NxcSkpKAu9vYfx1YGZRoAoYD/zM3a9LeK8S+LK7L97PsXOAOQDFxcUz5s+f3/sBt1NfX09BQUHK+81EylVwylVwylUwylNwylVwylVwylVwYeWqoqKiyt33mdobykV67t4KTDezIcD9ZjbV3V8NeOw8YB5AWVmZl5eX91qc+1NZWUkY/WYi5So45So45SoY5Sk45So45So45Sq4dMtVqMu8uXstUAmcHmYcIiIiIiK7hbGKxYj4yDFmlgfMBt5IdRwiIiIiIh0JYwR5FLDIzF4GngcedfcFZvYRM6sG3gf81cz+EUJsIiIiItLPhbGKxcvA0R203w/cn+p4REREREQS6VbTIiIiIiIJ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\n", "text/plain": [ "
" ] }, "metadata": { "needs_background": "light" }, "output_type": "display_data" } ], "source": [ "# add $u$ as a decision variable\n", "u = {t: cp.Variable(1, nonneg=True) for t in t_grid}\n", "x = {t: cp.Variable(2) for t in t_grid}\n", "y = {t: cp.Variable(1) for t in t_grid}\n", "\n", "# least-squares optimization objective\n", "objective = cp.Minimize(sum((y[t]-r(t))**2 for t in t_grid))\n", "\n", "model = [x[t] == x[t-dt] + dt*(A@x[t-dt] + Bu@u[t-dt] + Bd@[d(t-dt)]) for t in t_grid[1:]]\n", "output = [y[t] == C@x[t] for t in t_grid]\n", "inputs = [u[t] <= 100 for t in t_grid]\n", "IC = [x[0] == np.array([30, Tamb])]\n", "\n", "problem = cp.Problem(objective, model + IC + output + inputs)\n", "problem.solve()\n", "\n", "# display solution\n", "fix, ax = plt.subplots(3, 1, figsize=(10,6), sharex=True)\n", "ax[0].plot(t_grid, [x[t][0].value for t in t_grid], label=\"T_H\")\n", "ax[0].plot(t_grid, [x[t][1].value for t in t_grid], label=\"T_S\")\n", "ax[0].plot(t_grid, [r(t) for t in t_grid], label=\"SP\")\n", "ax[0].set_ylabel(\"deg C\")\n", "ax[0].legend()\n", "ax[1].plot(t_grid, [u[t].value for t in t_grid], label=\"u(t)\")\n", "ax[1].set_ylabel(\"% of max power\")\n", "ax[2].plot(t_grid, [d(t) for t in t_grid], label=\"d(t)\")\n", "ax[2].set_ylabel(\"deg C\")\n", "for a in ax:\n", " a.grid(True)\n", " a.legend()\n", "plt.tight_layout()" ] }, { "cell_type": "markdown", "metadata": { "nbpages": { "level": 2, "link": "[6.3.2 Assumptions for Predictive Control](https://jckantor.github.io/cbe30338-2021/06.03-Predictive-Control.html#6.3.2-Assumptions-for-Predictive-Control)", "section": "6.3.2 Assumptions for Predictive Control" } }, "source": [ "## 6.3.2 Assumptions for Predictive Control\n", "\n", "* Future values of the setpoint are equal to the current setpoint.\n", "* Future values of the disturbance are equal to the current setpoint.\n", "\n" ] }, { "cell_type": "markdown", "metadata": { "nbpages": { "level": 2, "link": "[6.3.3 TCLab Event Loop](https://jckantor.github.io/cbe30338-2021/06.03-Predictive-Control.html#6.3.3-TCLab-Event-Loop)", "section": "6.3.3 TCLab Event Loop" } }, "source": [ "## 6.3.3 TCLab Event Loop\n", "\n", "Borrowing from notebook 4.6." ] }, { "cell_type": "code", "execution_count": 61, "metadata": { "nbpages": { "level": 2, "link": "[6.3.3 TCLab Event Loop](https://jckantor.github.io/cbe30338-2021/06.03-Predictive-Control.html#6.3.3-TCLab-Event-Loop)", "section": "6.3.3 TCLab Event Loop" } }, "outputs": [], "source": [ "%matplotlib inline\n", "\n", "import numpy as np\n", "from tclab import setup, clock, Historian, Plotter\n", "\n", "Tamb = 21\n", "SP = 45" ] }, { "cell_type": "code", "execution_count": 62, "metadata": { "nbpages": { "level": 2, "link": "[6.3.3 TCLab Event Loop](https://jckantor.github.io/cbe30338-2021/06.03-Predictive-Control.html#6.3.3-TCLab-Event-Loop)", "section": "6.3.3 TCLab Event Loop" } }, "outputs": [], "source": [ "# Relay Control\n", "def relay(MV_min, MV_max):\n", " MV = MV_min\n", " while True:\n", " SP, PV = yield MV\n", " MV = MV_max if PV < SP else MV_min" ] }, { "cell_type": "code", "execution_count": 63, "metadata": { "nbpages": { "level": 2, "link": "[6.3.3 TCLab Event Loop](https://jckantor.github.io/cbe30338-2021/06.03-Predictive-Control.html#6.3.3-TCLab-Event-Loop)", "section": "6.3.3 TCLab Event Loop" } }, "outputs": [], "source": [ "def tclab_observer(L, t_now=0, x_hat=[Tamb, Tamb], d_hat=[Tamb]):\n", " \n", " while True:\n", " # yield current state, get MV for next period\n", " t_next, Q, T_measured = yield x_hat\n", " \n", " # model prediction\n", " x_predict = x_hat + (t_next - t_now)*(A@x_hat + Bu@[Q] + Bd@d_hat)\n", " \n", " # measurement correction\n", " y = np.array([T_measured])\n", " x_hat = x_predict - (t_next - t_now)*np.dot(L, np.dot(C, x_predict) - y)\n", " t_now = t_next" ] }, { "cell_type": "code", "execution_count": 68, "metadata": { "nbpages": { "level": 2, "link": "[6.3.3 TCLab Event Loop](https://jckantor.github.io/cbe30338-2021/06.03-Predictive-Control.html#6.3.3-TCLab-Event-Loop)", "section": "6.3.3 TCLab Event Loop" } }, "outputs": [ { "data": { "image/png": "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\n", "text/plain": [ "
" ] }, "metadata": {}, "output_type": "display_data" }, { "name": "stdout", "output_type": "stream", "text": [ "TCLab Model disconnected successfully.\n" ] }, { "data": { "image/png": "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\n", "text/plain": [ "
" ] }, "metadata": { "needs_background": "light" }, "output_type": "display_data" } ], "source": [ "t_final = 300\n", "t_step = 2\n", "\n", "# create a controller instance\n", "controller = relay(0, 80)\n", "U1 = next(controller)\n", "\n", "# create estimator instance\n", "L = np.array([[0.4], [0.2]])\n", "observer = tclab_observer(L)\n", "Th, Ts = next(observer)\n", "\n", "# execute the event loop\n", "TCLab = setup(connected=False, speedup=20)\n", "with TCLab() as lab:\n", " h = Historian([('SP', lambda: SP), \n", " ('T1', lambda: lab.T1), \n", " ('Q1', lab.Q1), \n", " ('Th', lambda: Th), \n", " ('Ts', lambda: Ts)])\n", " p = Plotter(h, t_final, layout=[['T1','Ts','Th', 'SP'], ['Q1']])\n", " for t in clock(t_final, t_step):\n", " T1 = lab.T1 \n", " Th, Ts = observer.send([t, U1, T1])\n", " U1 = controller.send([SP, Ts])\n", " lab.Q1(U1)\n", " p.update(t)" ] }, { "cell_type": "markdown", "metadata": { "nbpages": { "level": 2, "link": "[6.3.4 What we need our predictive controller to do ...](https://jckantor.github.io/cbe30338-2021/06.03-Predictive-Control.html#6.3.4-What-we-need-our-predictive-controller-to-do-...)", "section": "6.3.4 What we need our predictive controller to do ..." } }, "source": [ "## 6.3.4 What we need our predictive controller to do ...\n", "\n", "* Compute given current values of Th, Ts, d, and SP\n", "* Compute control policy" ] }, { "cell_type": "code", "execution_count": 110, "metadata": { "nbpages": { "level": 2, "link": "[6.3.4 What we need our predictive controller to do ...](https://jckantor.github.io/cbe30338-2021/06.03-Predictive-Control.html#6.3.4-What-we-need-our-predictive-controller-to-do-...)", "section": "6.3.4 What we need our predictive controller to do ..." } }, "outputs": [], "source": [ "\n", "def predictive_control(t_horizon=600, dt=2):\n", " n = round(t_horizon/dt)\n", " t_grid = np.linspace(0, t_horizon, n+1)\n", " \n", " u = {t: cp.Variable(1, nonneg=True) for t in t_grid}\n", " x = {t: cp.Variable(2) for t in t_grid}\n", " y = {t: cp.Variable(1) for t in t_grid}\n", " output = [y[t] == C@x[t] for t in t_grid]\n", " inputs = [u[t] <= 100 for t in t_grid]\n", " model = [x[t] == x[t-dt] + dt*(A@x[t-dt] + Bu@u[t-dt] + Bd@[Tamb]) for t in t_grid[1:]]\n", " MV = 0\n", " \n", " while True:\n", " print(MV)\n", " SP, Th, Ts = yield MV\n", " objective = cp.Minimize(sum((y[t]-SP)**2 for t in t_grid))\n", " IC = [x[0] == np.array([Th, Ts])]\n", " problem = cp.Problem(objective, model + IC + output + inputs)\n", " problem.solve()\n", " MV = u[0].value[0]" ] }, { "cell_type": "code", "execution_count": 111, "metadata": { "nbpages": { "level": 2, "link": "[6.3.4 What we need our predictive controller to do ...](https://jckantor.github.io/cbe30338-2021/06.03-Predictive-Control.html#6.3.4-What-we-need-our-predictive-controller-to-do-...)", "section": "6.3.4 What we need our predictive controller to do ..." } }, "outputs": [ { "data": { "image/png": "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\n", "text/plain": [ "
" ] }, "metadata": {}, "output_type": "display_data" }, { "name": "stdout", "output_type": "stream", "text": [ "TCLab Model disconnected successfully.\n" ] }, { "data": { "image/png": "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\n", "text/plain": [ "
" ] }, "metadata": { "needs_background": "light" }, "output_type": "display_data" } ], "source": [ "t_final = 300\n", "t_step = 2\n", "\n", "# create a controller instance\n", "controller = predictive_control()\n", "U1 = next(controller)\n", "\n", "# create estimator instance\n", "L = np.array([[0.4], [0.2]])\n", "observer = tclab_observer(L)\n", "Th, Ts = next(observer)\n", "\n", "# execute the event loop\n", "TCLab = setup(connected=False, speedup=20)\n", "with TCLab() as lab:\n", " h = Historian([('SP', lambda: SP), \n", " ('T1', lambda: lab.T1), \n", " ('Q1', lab.Q1), \n", " ('Th', lambda: Th), \n", " ('Ts', lambda: Ts)])\n", " p = Plotter(h, t_final, layout=[['T1','Ts','Th', 'SP'], ['Q1']])\n", " for t in clock(t_final, t_step):\n", " T1 = lab.T1 \n", " Th, Ts = observer.send([t, U1, T1])\n", " U1 = controller.send([SP, Th, Ts])\n", " lab.Q1(U1)\n", " p.update(t)" ] }, { "cell_type": "markdown", "metadata": { "id": "D_2whAmBnT3z", "nbpages": { "level": 2, "link": "[6.3.4 What we need our predictive controller to do ...](https://jckantor.github.io/cbe30338-2021/06.03-Predictive-Control.html#6.3.4-What-we-need-our-predictive-controller-to-do-...)", "section": "6.3.4 What we need our predictive controller to do ..." } }, "source": [ "What information do you need to compute the control policy $u(t)$?\n", "\n", "* Modify model for constant d\n", "* Demonstrate effect of lack of future information about setpoint\n", "* Demonstrate effect of initial condition\n", "\n", "Now write a function that computes a control policy given tstep, d, x, and SP\n", "\n" ] }, { "cell_type": "markdown", "metadata": { "id": "flr5i2IQqlIH", "nbpages": { "level": 2, "link": "[6.3.4 What we need our predictive controller to do ...](https://jckantor.github.io/cbe30338-2021/06.03-Predictive-Control.html#6.3.4-What-we-need-our-predictive-controller-to-do-...)", "section": "6.3.4 What we need our predictive controller to do ..." } }, "source": [ "* Encapsulate code as a generator\n" ] }, { "cell_type": "markdown", "metadata": { "id": "iqcgQFZ2qvpu", "nbpages": { "level": 2, "link": "[6.3.4 What we need our predictive controller to do ...](https://jckantor.github.io/cbe30338-2021/06.03-Predictive-Control.html#6.3.4-What-we-need-our-predictive-controller-to-do-...)", "section": "6.3.4 What we need our predictive controller to do ..." } }, "source": [ "* Set up event loop for tclab" ] }, { "cell_type": "markdown", "metadata": { "id": "xCyRLchqq2il", "nbpages": { "level": 2, "link": "[6.3.4 What we need our predictive controller to do ...](https://jckantor.github.io/cbe30338-2021/06.03-Predictive-Control.html#6.3.4-What-we-need-our-predictive-controller-to-do-...)", "section": "6.3.4 What we need our predictive controller to do ..." } }, "source": [ "* add observer" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "\n", "< [6.2 Simulation and Open-Loop Optimal Control](https://jckantor.github.io/cbe30338-2021/06.02-Simulation-and-Open-Loop-Optimal-Control.html) | [Contents](toc.html) | [Tag Index](tag_index.html) | [6.4 Implementing Predictive Control](https://jckantor.github.io/cbe30338-2021/06.04-Implementing-Predictive-Control.html) >

\"Open

\"Download\"" ] } ], "metadata": { "colab": { "collapsed_sections": [], "name": "Predictive-Control.ipynb", "provenance": [ { "file_id": "https://github.com/jckantor/cbe30338-2021/blob/master/docs/06.02-Simulation-and-Open-Loop-Optimal-Control.ipynb", "timestamp": 1618928532300 } ] }, "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.5" } }, "nbformat": 4, "nbformat_minor": 4 }