{ "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) >
"
]
},
{
"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": {
"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
}