{ "cells": [ { "cell_type": "markdown", "metadata": {}, "source": [ "# Quadratically optimal control on a fixed and finite time horizon for a linear discrete-time system - direct formulations" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Here we consider a standard discrete-time LTI system modelled by state equations" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "$$\\mathbf x_{k+1} = \\mathbf A \\mathbf x_k + \\mathbf B \\mathbf u_k,\\qquad \\mathbf x_0 = \\mathrm{given},$$" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "where $\\mathbf x\\in\\mathbb{R}^n$, $\\mathbf u\\in\\mathbb{R}^m$, $\\mathbf A\\in\\mathbb{R}^{n\\times n}$ and $\\mathbf B\\in\\mathbb{R}^{n\\times m}$." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "We want to minimize the popular quadratic criterion " ] }, { "cell_type": "markdown", "metadata": {}, "source": [ " \n", "$$\\underset{\\mathbf u_0,\\ldots, \\mathbf u_{N-1}, (\\mathbf x_{0}),\\ldots, \\mathbf x_N}{\\mathrm{minimize}} \\quad \\frac{1}{2} \\mathbf x_N^T \\mathbf S \\mathbf x_N + \\frac{1}{2} \\sum_{k=0}^{N-1} \\left(\\mathbf x_k^T \\mathbf Q \\mathbf x_k + \\mathbf u_k^T \\mathbf R \\mathbf u_k \\right)$$" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "for a given initial value vector $\\mathbf x_0\\in\\mathbb{R}^n$ and weighting matrices $\\mathbf S\\geq 0$, $\\mathbf Q\\geq 0$ and $\\mathbf R>0$. " ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Below we reformulate the optimal control problem as a numerical optimization problem. We offer two formulations: simultaneous and sequential." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Simultaneous (sparse) formulation" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "The adjective comes from the fact that we solve the optimization over the states $x$ and controls $u$ simultaneously. It is also refered to as sparse because the corresponding matrices are sparse, which can be exploited by numerical solvers." ] }, { "cell_type": "code", "execution_count": 1, "metadata": {}, "outputs": [], "source": [ "using LinearAlgebra" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Building the linear discrete-time dynamical system to be controlled" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Discrete-time model of a double integrator" ] }, { "cell_type": "code", "execution_count": 2, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "2×2 Array{Float64,2}:\n", " 1.0 1.0\n", " 0.0 1.0" ] }, "execution_count": 2, "metadata": {}, "output_type": "execute_result" } ], "source": [ "A = [1.0 1.0;0.0 1.0]" ] }, { "cell_type": "code", "execution_count": 3, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "2-element Array{Float64,1}:\n", " 0.0\n", " 1.0" ] }, "execution_count": 3, "metadata": {}, "output_type": "execute_result" } ], "source": [ "B = [0.0, 1.0]" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Number of states" ] }, { "cell_type": "code", "execution_count": 4, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "2" ] }, "execution_count": 4, "metadata": {}, "output_type": "execute_result" } ], "source": [ "n = 2" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Number of inputs" ] }, { "cell_type": "code", "execution_count": 5, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "1" ] }, "execution_count": 5, "metadata": {}, "output_type": "execute_result" } ], "source": [ "m = 1" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "An initial state" ] }, { "cell_type": "code", "execution_count": 6, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "2-element Array{Int64,1}:\n", " 1\n", " 3" ] }, "execution_count": 6, "metadata": {}, "output_type": "execute_result" } ], "source": [ "x0 = [1, 3] " ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Setting the discrete-time LQ optimal control problem" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "First, we set the time horizon on which the control problem is solved. You are invited to experiment with this value." ] }, { "cell_type": "code", "execution_count": 7, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "10" ] }, "execution_count": 7, "metadata": {}, "output_type": "execute_result" } ], "source": [ "N = 10" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Within the quadratic cost function we restrict ourselves to diagonal matrices $S$, $Q$ and $R$. Practically speaking, this is not a serious restriction because we are not able to explot the fullness of those matrices anyway. The diagonals of the three matrices are" ] }, { "cell_type": "code", "execution_count": 8, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "2-element Array{Int64,1}:\n", " 1\n", " 2" ] }, "execution_count": 8, "metadata": {}, "output_type": "execute_result" } ], "source": [ "s = [1, 2]" ] }, { "cell_type": "code", "execution_count": 9, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "2-element Array{Int64,1}:\n", " 1\n", " 2" ] }, "execution_count": 9, "metadata": {}, "output_type": "execute_result" } ], "source": [ "q = [1, 2]" ] }, { "cell_type": "code", "execution_count": 10, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "1-element Array{Int64,1}:\n", " 1" ] }, "execution_count": 10, "metadata": {}, "output_type": "execute_result" } ], "source": [ "r = [1]" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Feel free to experiment with these numbers (and rerun the code)." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "We assemble the matrices from the diagonals here." ] }, { "cell_type": "code", "execution_count": 11, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "2×2 Array{Int64,2}:\n", " 1 0\n", " 0 2" ] }, "execution_count": 11, "metadata": {}, "output_type": "execute_result" } ], "source": [ "S = diagm(0=>s)" ] }, { "cell_type": "code", "execution_count": 12, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "2×2 Array{Int64,2}:\n", " 1 0\n", " 0 2" ] }, "execution_count": 12, "metadata": {}, "output_type": "execute_result" } ], "source": [ "Q = diagm(0=>q)" ] }, { "cell_type": "code", "execution_count": 13, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "1×1 Array{Int64,2}:\n", " 1" ] }, "execution_count": 13, "metadata": {}, "output_type": "execute_result" } ], "source": [ "R = diagm(0=>r)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Formulating the quadratic optimization problem" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "We will use some functionality for building block and sparse matrices" ] }, { "cell_type": "code", "execution_count": 14, "metadata": {}, "outputs": [], "source": [ "using BlockArrays, SparseArrays" ] }, { "cell_type": "code", "execution_count": 15, "metadata": {}, "outputs": [], "source": [ "Qbar = BlockArray(spzeros(N*n,N*n),repeat([n],N),repeat([n],N));" ] }, { "cell_type": "code", "execution_count": 16, "metadata": {}, "outputs": [], "source": [ "for i=1:(N-1)\n", " Qbar[Block(i,i)] = Q\n", "end" ] }, { "cell_type": "code", "execution_count": 17, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "2×2 Array{Int64,2}:\n", " 1 0\n", " 0 2" ] }, "execution_count": 17, "metadata": {}, "output_type": "execute_result" } ], "source": [ "Qbar[Block(N,N)] = S" ] }, { "cell_type": "code", "execution_count": 18, "metadata": {}, "outputs": [], "source": [ "Rbar = BlockArray(spzeros(N*m,N*m),repeat([m],N),repeat([m],N));" ] }, { "cell_type": "code", "execution_count": 19, "metadata": {}, "outputs": [], "source": [ "for i=1:N\n", " Rbar[Block(i,i)] = R\n", "end" ] }, { "cell_type": "code", "execution_count": 20, "metadata": {}, "outputs": [], "source": [ "Qtilde = blockdiag(sparse(Qbar),sparse(Rbar));" ] }, { "cell_type": "code", "execution_count": 21, "metadata": {}, "outputs": [], "source": [ "Bbar = BlockArray(spzeros(N*n,N*m),repeat([n],N),repeat([m],N));" ] }, { "cell_type": "code", "execution_count": 22, "metadata": {}, "outputs": [], "source": [ "for i=1:N\n", " Bbar[Block(i,i)] = sparse(B)\n", "end" ] }, { "cell_type": "code", "execution_count": 23, "metadata": {}, "outputs": [], "source": [ "Abar = BlockArray(sparse(-1.0*I,n*N,n*N),repeat([n],N),repeat([n],N));" ] }, { "cell_type": "code", "execution_count": 24, "metadata": {}, "outputs": [], "source": [ "for i=2:N\n", " Abar[Block(i,(i-1))] = sparse(A)\n", "end" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Note that here `Abar` is actually `Abar-I` from the lecture notes. I combined them into a single variable. " ] }, { "cell_type": "code", "execution_count": 25, "metadata": {}, "outputs": [], "source": [ "Atilde = sparse([Abar Bbar]); " ] }, { "cell_type": "code", "execution_count": 26, "metadata": {}, "outputs": [], "source": [ "A0bar = spzeros(n*N,n); A0bar[1:n,1:n] = A;" ] }, { "cell_type": "code", "execution_count": 27, "metadata": {}, "outputs": [], "source": [ "btilde = A0bar*sparse(x0);" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Solving the optimization problem" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "We are about to solve the problem \n", "\\begin{align}\n", " \\underset{\\tilde{\\mathbf{x}}\\in\\mathbb{R}^{2N}}{\\text{minimize}} &\\qquad\\qquad \\frac{1}{2}\\tilde{\\mathbf{x}}^T \\tilde{\\mathbf{Q}} \\tilde{\\mathbf{x}}\\\\\n", " \\text {subject to} &\\qquad\\qquad \\tilde{\\mathbf{A}} \\tilde{\\mathbf{x}} + \\tilde{\\mathbf{b}} = \\mathbf 0.\n", " \\end{align}" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Here we can either proceed on our own and formulate the KKT linear system and solve it using a specialized solver for symmetric but possibly indefinite systems (relying on LDL factorization), or we can resort to calling some QP solver. We opt for the latter since we would be forced to do it as soon as we want to add some additional inequality-type constraints. We choose [Convex.jl](https://github.com/JuliaOpt/Convex.jl) package." ] }, { "cell_type": "code", "execution_count": 28, "metadata": {}, "outputs": [], "source": [ "using Convex, SCS" ] }, { "cell_type": "code", "execution_count": 29, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "Variable\n", "size: (30, 1)\n", "sign: real\n", "vexity: affine\n", "id: 151…642" ] }, "execution_count": 29, "metadata": {}, "output_type": "execute_result" } ], "source": [ "xtilde = Variable((n+m)*N)" ] }, { "cell_type": "code", "execution_count": 30, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "minimize\n", "└─ * (convex; positive)\n", " ├─ 0.5\n", " └─ * (convex; positive)\n", " ├─ 1\n", " └─ qol_elem (convex; positive)\n", " ├─ …\n", " └─ …\n", "subject to\n", "└─ == constraint (affine)\n", " ├─ + (affine; real)\n", " │ ├─ * (affine; real)\n", " │ │ ├─ …\n", " │ │ └─ …\n", " │ └─ 20-element SparseVector{Float64,Int64}\n", " └─ 0\n", "\n", "status: `solve!` not called yet" ] }, "execution_count": 30, "metadata": {}, "output_type": "execute_result" } ], "source": [ "problem = minimize(1/2*quadform(xtilde,Qtilde),[Atilde*xtilde + btilde == 0])" ] }, { "cell_type": "code", "execution_count": 31, "metadata": {}, "outputs": [], "source": [ "solve!(problem, () -> SCS.Optimizer(verbose=false))" ] }, { "cell_type": "code", "execution_count": 32, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "OPTIMAL::TerminationStatusCode = 1" ] }, "execution_count": 32, "metadata": {}, "output_type": "execute_result" } ], "source": [ "problem.status" ] }, { "cell_type": "code", "execution_count": 33, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "2×10 Array{Float64,2}:\n", " 4.0 2.90983 1.63933 0.827815 … 0.0161349 0.00855227\n", " -1.09017 -1.2705 -0.811515 -0.434556 -0.00758277 -0.00252759" ] }, "execution_count": 33, "metadata": {}, "output_type": "execute_result" } ], "source": [ "xopt = reshape(xtilde.value[1:(n*N)],(2,:))" ] }, { "cell_type": "code", "execution_count": 34, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "1×10 Array{Float64,2}:\n", " -4.09017 -0.180336 0.458988 0.376959 … 0.0254833 0.0116684 0.00505516" ] }, "execution_count": 34, "metadata": {}, "output_type": "execute_result" } ], "source": [ "uopt = reshape(xtilde.value[(n*N+1):end],(m,:))" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Plotting the responses" ] }, { "cell_type": "code", "execution_count": 35, "metadata": {}, "outputs": [], "source": [ "using Plots" ] }, { "cell_type": "code", "execution_count": 36, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "Plots.PyPlotBackend()" ] }, "execution_count": 36, "metadata": {}, "output_type": "execute_result" } ], "source": [ "pyplot()" ] }, { "cell_type": "code", "execution_count": 37, "metadata": {}, "outputs": [ { "data": { "image/png": "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" }, "execution_count": 37, "metadata": {}, "output_type": "execute_result" } ], "source": [ "plot(0:N,hcat(x0,xopt)',marker=:diamond,label=[\"x1\" \"x2\"],linetype=:steppost)\n", "xlabel!(\"k\")\n", "ylabel!(\"x\") # beware the conflict in notation: x_1 vs x_k. I could have used x(k) for dependence on the discrete time." ] }, { "cell_type": "code", "execution_count": 38, "metadata": {}, "outputs": [ { "data": { "image/png": "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VT0Gh+H666/PxRdfnBNOOKHqUSjg8ccfz7Rp0/L5z38+f/iHf5h3v/vdue+++6oeiyFqNBq544478uEPfzjHH398/vRP/zQrV67MUUcdVfVoY0YtAyvJG/6L2NUo6mPJkiVZt25dvvCFL1Q9CkP0wAMP5KGHHsonP/nJqkehkFdeeSVPPPFE3va2t+WnP/1pVqxYkQsvvDDPP/981aMxBLt27coXv/jF/OM//mOeeuqp3Hfffbn00kuzadOmqkcbM2oZWDNnzszGjRuza9euJHviasOGDc7zqIGbb745d955Z773ve8NXsyNsWf16tV57LHHcsIJJ6SzszMbN27MmWeeme9973tVj8YQHX/88Wlra8vHP/7xJMkf/MEf5IQTTsi///u/VzwZQ/HII4/kmWeeybve9a4kyR/90R9l+vTp+dnPflbxZGNHLQPruOOOy6mnnppvfvObSZJvf/vb6ezsTGdnZ7WDcViWLVuW22+/Pf/yL/+SqVOnVj0Oh+Gaa67JM888k/Xr12f9+vWZMWNG7r777px11llVj8YQHXvssfmzP/uz3H333UmSp556Kk8++WROPvnkiidjKPZuVKxduzZJ8stf/jKPP/54Zs+eXfFkY0dtr+S+du3azJ8/Py+++GImT56clStX5u1vf3vVYzFEGzduzMyZM3PiiScOfoOlvb09Dz74YMWTUUJnZ2fuuuuunHLKKVWPwmF44oknctlll+XFF1/MEUcckc997nP5i7/4i6rHYohuv/32LFmyJG1tbWk2m7nuuuty4YUXVj3WmFHbwAIAqEotPyIEAKiSwAIAKExgAQAUJrAAAAoTWAAAhQksAIDCBBbQEubPn+86W8CIEVgAAIUJLACAwgQW0JJ2796dK6+8Mh0dHfnJT35S9ThAzYyregCAkbZr165ceumlue+++7J69eq84x3vqHokoGYEFtBSdu7cmY9+9KNZs2ZN/u3f/i0nnXRS1SMBNSSwgJaxffv2nH322Vm/fn1+9KMfZdasWVWPBNSUwAJaxvPPP58NGzaku7tbXAHDyknuQMuYNWtW/v7v/z633HJLvvCFL1Q9DlBjdrCAlnL++edn5cqV6erqytFHH51Pf/rTVY8E1JDAAlrOxz/+8ezYsSOf+MQnMn78+Hzyk5+seiSgZgQW0JIuv/zybN++PT09PTn66KOzYMGCqkcCaqTRbDabVQ8BAFAnTnIHAChMYAEAFCawAAAKE1gAAIUJLACAwgQWAEBh/x8OTAFaae9zewAAAABJRU5ErkJggg==" }, "execution_count": 38, "metadata": {}, "output_type": "execute_result" } ], "source": [ "plot(0:(N-1),uopt',marker=:diamond,label=\"u\",linetype=:steppost)\n", "xlabel!(\"k\")\n", "ylabel!(\"u\")" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Sequential (condensed) formulation" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "In the alternative formulation of the optimization problem, we eliminate the states altogether by expressing them as functions of the inputs. The resulting optimization is then conducted only over the controls $u$ and (and the initial state $x_0$ should it be left free). " ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "\\begin{equation}\n", " \\tilde J(\\mathbf u,\\mathbf x_0) = \\frac{1}{2}\\mathbf u^T\\mathbf H\\mathbf u + \\mathbf x_0^T\\mathbf F^T \\mathbf u.\n", "\\end{equation} " ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "If no additional constraints are imposed (in particular, the bound constraints on the controls), the problem boils down to solving linear equations." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "$$ \\mathbf H\\mathbf u=-\\mathbf F\\mathbf x_0,$$" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "which can be formally written as" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "$$\\mathbf u = -\\mathbf H^{-1} \\mathbf F \\mathbf x_0$$" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "but it goes without saying that we are certainly not going to compute the invers of the matrix $\\mathbf H$," ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Building the linear system (set of linear equations)" ] }, { "cell_type": "code", "execution_count": 39, "metadata": {}, "outputs": [], "source": [ "Chat = BlockArray(spzeros(N*n,N*m),repeat([n],N),repeat([m],N));\n", "Ahat = BlockArray(spzeros(N*n,n),repeat([n],N),[n]);" ] }, { "cell_type": "code", "execution_count": 40, "metadata": {}, "outputs": [], "source": [ "for i=1:N\n", " for j = 1:i\n", " Chat[Block(i,j)] = sparse(A^(i-j)*B)\n", " Ahat[Block(i,1)] = sparse(A^i)\n", " end\n", "end" ] }, { "cell_type": "code", "execution_count": 41, "metadata": {}, "outputs": [], "source": [ "H = Chat'*Qbar*Chat + Rbar;\n", "H = Array(H); " ] }, { "cell_type": "code", "execution_count": 42, "metadata": {}, "outputs": [], "source": [ "F = Chat'*Qbar*Ahat;\n", "F = Array(F);" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Solving the linear system" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "The crucial computation step - solving a set of linear equations - comes now" ] }, { "cell_type": "code", "execution_count": 43, "metadata": {}, "outputs": [], "source": [ "uopts = -H\\(F*x0);" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "It is worth noting that the size of the problem is $n\\times n$ and the data (the matrix) is not sparse any more." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Plotting the responses" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Finally, we plot the optimal control sequence and notice that it is identical to the one computed in the simultaneous (sparse) framework." ] }, { "cell_type": "code", "execution_count": 44, "metadata": {}, "outputs": [ { "data": { "image/png": "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pk2bkiQ///nP+/X8jRs3Jkkee+yxjB07tthcVMea1hfrWX+saX2xnnvnne98Z8aM2XEh8yF9DtYtt9ySCy+8sOoxAADe1q+fMz6kA+ull17K3Xffnba2tuy///5VjwMAsEvDZgcLAGA4cpI7AEBhAgsAoLC6DazVq1fnfe97X4466qj86Z/+aX72s59VPRL7YPPmzfnIRz6So446KlOnTs0HP/jBrFmzpuqxKOBLX/pSmpqa8vjjj1c9Cvtoy5Yt6ejoyJFHHpljjz3Wl5SGubvvvjsnnHBCjj/++Bx33HFZunRp1SMNK0P6Mg374rLLLsvs2bMzY8aMfOc738msWbPywAMPVD0W+2D27Nk588wz09TUlCVLlmT27Nm55557qh6LfbBy5co8+OCDmTJlStWjUMDVV1+d5ubm/OIXv0hTU1N++ctfVj0S/VSr1fLJT34y999/f/74j/84a9asyTvf+c589KMfzbhx46oeb1ioyx2sX/3qV1m5cmXfvz2de+65eeaZZ+x4DGOjR4/Ohz70oTQ1NSVJTjzxxDz99NMVT8W+2LJlS9rb23PTTTf1rSvD12uvvZZ/+qd/yvz58/vW8w//8A8rnop99corryTZccucSZMmpaWlpdqBhpG6DKy1a9fm4IMPzsiROzbompqaMmXKlDz33HMVT0YpX/va1/LhD3+46jHYB9dcc00uvPDCHHbYYVWPQgFPPfVUJk2alGuvvTbvfe9784EPfCD33Xdf1WPRT01NTbntttvy0Y9+NIceemje//73Z+nSpRk1alTVow0bdRlYSX7r34hdjaJ+zJ8/P6tXr85XvvKVqkehnx544IE8/PDD+exnP1v1KBTyxhtv5Omnn84xxxyTRx55JEuWLMkFF1yQF198serR6IetW7fmuuuuy/e///08++yzue+++3LxxRdn/fr1VY82bNRlYE2ePDnr1q3L1q1bk+yIq7Vr1zrPow589atfze2335677rqr72JuDD/Lly/PE088kcMOOyxtbW1Zt25dzjjjjNx1111Vj0Y/HXrooWlubs6nPvWpJMm73/3uHHbYYfmv//qviiejPx577LE8//zzOemkk5Ikf/Inf5KDDz44P/nJTyqebPioy8A66KCDcvzxx+db3/pWkuS73/1u2tra0tbWVu1g7JOFCxfm1ltvzb//+79nwoQJVY/DPrj66qvz/PPPZ82aNVmzZk0OOeSQ3H333TnzzDOrHo1+OvDAA/MXf/EXufvuu5Mkzz77bJ555pkcffTRFU9Gf7y5UbFq1aokyZNPPpmnnnoqRx11VMWTDR91eyX3VatWZcaMGXn55Zczfvz4LF26NMcee2zVY9FP69aty+TJk3P44Yf3fYOlpaUlK1asqHgySmhra8udd96Z4447rupR2AdPP/10Pv3pT+fll1/OiBEj8sUvfjF/9Vd/VfVY9NOtt96a+fPnp7m5ObVaLfPmzcsFF1xQ9VjDRt0GFgBAVeryI0IAgCoJLACAwgQWAEBhAgsAoDCBBQBQmMACAChMYAENYcaMGa6zBQwagQUAUJjAAgAoTGABDWn79u257LLLMnHixDz00ENVjwPUmZFVDwAw2LZu3ZqLL7449913X5YvX553vetdVY8E1BmBBTSULVu25OMf/3hWrlyZ//zP/8yRRx5Z9UhAHRJYQMPYtGlTzjrrrKxZsyY//vGPM2XKlKpHAuqUwAIaxosvvpi1a9emvb1dXAEDyknuQMOYMmVKvv3tb2fx4sX5yle+UvU4QB2zgwU0lPPOOy9Lly7N9OnTs//+++fKK6+seiSgDgksoOF86lOfyubNm3PppZdm9OjR+exnP1v1SECdEVhAQ5o1a1Y2bdqUjo6O7L///pk5c2bVIwF1pKlWq9WqHgIAoJ44yR0AoDCBBQBQmMACAChMYAEAFCawAAAKE1gAAIX9f0VMqOMAUed0AAAAAElFTkSuQmCC" }, "execution_count": 44, "metadata": {}, "output_type": "execute_result" } ], "source": [ "plot(0:(N-1),uopts,marker=:diamond,label=\"u_seq\",linetype=:steppost)\n", "xlabel!(\"k\")\n", "ylabel!(\"u\")" ] }, { "cell_type": "code", "execution_count": 45, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "2×10 reshape(::PseudoBlockArray{…,::Array{Float64,1}}, 2, 10) with eltype Float64:\n", " 4.0 2.90983 1.63933 0.827815 … 0.016135 0.00855228\n", " -1.09017 -1.2705 -0.811515 -0.434556 -0.00758275 -0.00252758" ] }, "execution_count": 45, "metadata": {}, "output_type": "execute_result" } ], "source": [ "xopts = Chat*uopts + Ahat*x0;\n", "xopts = reshape(xopts,(2,:))" ] }, { "cell_type": "code", "execution_count": 46, "metadata": {}, "outputs": [ { "data": { "image/png": "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" }, "execution_count": 46, "metadata": {}, "output_type": "execute_result" } ], "source": [ "plot(0:N,hcat(x0,xopts)',marker=:diamond,label=[\"x1\" \"x2\"],linetype=:steppost)\n", "xlabel!(\"k\")\n", "ylabel!(\"x\")" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Imposing constraints on controls" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "If additional constraints are imposed, namely, the bound constraints on $\\mathbf u$, the problem becomes " ] }, { "cell_type": "code", "execution_count": 47, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "Variable\n", "size: (10, 1)\n", "sign: real\n", "vexity: affine\n", "id: 731…720" ] }, "execution_count": 47, "metadata": {}, "output_type": "execute_result" } ], "source": [ "u = Variable(N*m)" ] }, { "cell_type": "code", "execution_count": 48, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "1" ] }, "execution_count": 48, "metadata": {}, "output_type": "execute_result" } ], "source": [ "umax = 1" ] }, { "cell_type": "code", "execution_count": 49, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "minimize\n", "└─ + (convex; real)\n", " ├─ * (convex; positive)\n", " │ ├─ 0.5\n", " │ └─ * (convex; positive)\n", " │ ├─ …\n", " │ └─ …\n", " └─ sum (affine; real)\n", " └─ .* (affine; real)\n", " ├─ …\n", " └─ …\n", "subject to\n", "└─ <= constraint (convex)\n", " ├─ abs (convex; positive)\n", " │ └─ 10-element real variable (id: 731…720)\n", " └─ 1\n", "\n", "status: `solve!` not called yet" ] }, "execution_count": 49, "metadata": {}, "output_type": "execute_result" } ], "source": [ "problem = minimize(1/2*quadform(u,H) + dot(F*x0,u),[abs(u) <= umax])" ] }, { "cell_type": "code", "execution_count": 50, "metadata": {}, "outputs": [], "source": [ "solve!(problem, () -> SCS.Optimizer(verbose=false))" ] }, { "cell_type": "code", "execution_count": 51, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "OPTIMAL::TerminationStatusCode = 1" ] }, "execution_count": 51, "metadata": {}, "output_type": "execute_result" } ], "source": [ "problem.status" ] }, { "cell_type": "code", "execution_count": 52, "metadata": {}, "outputs": [ { "data": { "image/png": "iVBORw0KGgoAAAANSUhEUgAAAlgAAAGQCAYAAAByNR6YAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjMuNCwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy8QVMy6AAAACXBIWXMAAA9hAAAPYQGoP6dpAAAifElEQVR4nO3de1DVdf7H8dcBBEWFQsfyAhwlsfWyIpbraqu1mW1u1qbFanmNxNZzii6bmOP6m5pMcdpWVo4rbUxZmjOmXRxdx8pVshm1lKHJLDIVOWy6mhqIKIZ8f3+c9RipCPiBL+fwfMwweODr4f3lM+rT7+XgsCzLEgAAAIwJsXsAAACAYENgAQAAGBY0gVVRUaH8/HxVVFTYPQoAAGjhgiawvv76aw0cOFBff/11g5+jtLTU4ESwC+sYHFjH4MA6Bg/Wsn6CJrBMOHfunN0jwADWMTiwjsGBdQwerGX9EFgAAACGEVgAAACGhdk9AAAALU1lZaUKCwtVVVVl9yh1VlpaqujoaLvHsE1oaKji4+N1zTXX1Gl7AgsA0GgqKioUExNj9xjNyr59+5SUlKTy8nK7R0EDTJs2TUuXLlVISO0nAQksAECj8Hg8Sk9PV1ZWllwul93jNAvV1dVKTU1Vx44dtWHDBkVGRto9Euro7Nmz+vjjjzVr1ixJ0iuvvFLr9gQWAMA4j8cjt9stxSb53ktElqRDhw4pLy9Pb731lm655Ra7x0E9DR48WJKUkZGhhQsX1nq6kIvcAQBG+eNqRLo0Z4c0Il1ut1sej8fu0Wx39OhRSVJCQoLNk6Chhg0bJkk6ePBgrdtxBAsAYEyNuHpgoeRw+N5Lcrvd8pZbSkkNriNZ7VtJPaMdddq2urpakhQWxj+/gSo8PFzSlV8XjBUGABhRUVGh9PR0KTbpQlxJFyKrME+Zs59QZtuJUkRwXXv0TUpYnSMLzcuWLVt09uxZjRw50ujzElgAACMiIyOVlZXlO4L19swLkWVZvsfeAmUsWKyUcVF2j2rMVz9YmrD5nE7+aPckaKgtW7aovLz8soFVVVXVoCOOBBYAwJjzF7Kfv7BdDyz0xdVHWcrOzuZC92bK4XDo5MmTateunSSpY8eO2rlzp5xO5yW33759u1wul86dO6eqqiq5XC796U9/0smTJ/XUU0/p888/15kzZzRkyBAtXrxYrVq10p49ezR16lT9+OOP+sUvfqF9+/Zpzpw5uvvuuy8712uvvaasrCxZlqVWrVpp9erVcjqdevPNN7Vw4UI5HA7FxsbqlVdeUdeuXfX6669r5cqViomJ0e7duxUREaFVq1apR48e2rt3r6ZMmaLy8nJVV1fr3nvv1f3336+lS5equrpaH330kcaMGaNJkybppptu0uOPP64PP/xQY8aM0ZNPPlnv7ymBBQAwqkZkFeZJ3gLiqhb7yyz9cLZxnvuacKlHlPlTl/Pnz9fTTz+tBx98UJJ04sQJSdLTTz+tYcOG6Z///Kcsy9K0adOUnZ2tJ598UhMnTtTjjz+uyZMna/v27Ro6dGitX2PLli2aN2+etm7dqs6dO6uiokKStHv3bj3zzDPatWuXunbtqnnz5iktLU3r16+XJO3YsUOff/654uPjNWvWLGVmZionJ0fZ2dn6/e9/r9mzZ0uSjh8/rpiYGD366KMqLy/XSy+9JEkqKirSsWPHdMMNN2ju3LkN/h4RWAAA41wul7zlljJnP6GMBYuJq8v4/oylnquqVG01zvOHOqTDE8LUsbXZyLrtttv0wgsv6Ntvv9Vvf/tb/0tOvPfee9q+fbv++te/SpJOnz6t8PBwlZWVaffu3Zo4caIk38sd9OvXr9avsX79ek2aNEmdO3eWJP9rhm3evFl33323unbtKkmaMWOGXnjhBVmW75t4yy23KD4+XpL061//WosXL5bku/vvmWee0alTpzR8+HCNGDHisl+7devWGj9+fIO+N+cRWACARpGS6lJm24lBdc2VaR1bO7Q3JaxRj2DVJa5CQ0Nr3BV35syZWrd/4okndM8992jTpk2aPXu2+vbtqyVLlsiyLL333nvq0aNHje3LysrkcJiJPMuyajzXz5+3devW/l+Hhob6fxzR2LFjNWTIEH344YfKzs7WokWL9K9//euSX6Nt27ZXPS+BBQBoPEF2t2BjaIxTePWVkJCgHTt2aOTIkXrnnXd06tSpWrcvLCxUr1691KNHD8XGxvpPu91zzz1asGCBlixZorCwMJ04ccJ/uq1v375asWKFJk6cqE8//VRffPFFrV9j9OjRevjhh5WWlqbrr7/ef4rw9ttvV2Zmpg4fPqzrr79eS5cu1e23337FINq7d6969OihSZMmadCgQRoyZIgkKSoqSv/5z3/q+q2qMwILAIAWbtGiRXK5XOrUqZNuu+02dejQodbtFy9erM2bNys8PFyhoaH+U4KLFi1SRkaGkpKSFBISolatWikzM1M33HCD3njjDU2dOlV/+9vflJycrF/96le1fo1hw4Zpzpw5GjlypBwOh8LDw7V69Wr16dNH8+fP99/1d/4i9yt5++23tWLFCoWHh8uyLC1dulSSdN999+nNN99UUlKS/yJ3ExzW+ZOWAS4/P18DBw7Url27lJyc3KDnOH/BGwIb6xgcWMfAl/+9pYHvVmnXfWFK7mj/UZrGUN99NPFvVbC49dZb9ec//7nWuwibo7quIT8qBwAAwDBOEQIAgEu66aab/BeJn9enTx+tWLHiqp97y5YtknzXbRUXF9f43LXXXqvNmzdf9dewE4EFAAAuaefOnY3+NdauXdvoX8MOnCIEAAAwjMACAKCJhIaGSpLOnm2kF75Cozv/chGtWrWqdTtOEQIA0EScTqdat26t559/XnPnzlV4eLjdI6GOqqqqtG/fPj377LNq3769EhMTa92ewAIAoIlER0fr/fff17333qsNGzbYPQ4a4NZbb9W///1vRURE1LodgQUAQBMaOXKkDh8+rKKioho/nqa5Ky0tVXR0tN1j2CYkJESdOnXS9ddfr5CQK19hRWABANDEoqOj1b9/f7vHqBde/Ld+uMgdAADAMAILAADAMAILAADAMAILAADAMAILAADAMAILAADAMAILAADAMAILAADAMAILAADAMAILAADAMAILAADAMAILAADAMAILAADAMAILAADAMAILAICrUVlh9wRohggsAAAaaFWuR0rv4HsP/ASBBQBAA3g8HmXOekzq2k+Zsx6Tx0Nk4QICCwCAevJ4PHK73dKIdGnODmlEutxuN5EFvzC7BwAAIJDUiKsHFkoOh++9JLfbLW+5pZRUl81TmnfulEMxMXZPETgILAAA6qiiokLp6elSbNKFuJIuRFZhnjJnP6HMthOliEhbZzWvnb5JsdQz2mH3IAGBwAIAoI4iIyOVlZXlO4L19swLkWVZvsfeAmUsWKyUcVF2j2rUVz9YmrD5nE7+aPckgYPAAgCgHlwu3+k/t9vt+8ADC31x9VGWsrOz/Z9Hy2ZbYO3du1eTJ0/W999/r2uuuUavv/66evfuXWObLVu2aNSoUUpMTPR/bNu2bWrTpk1TjwsAgF+NyCrMk7wFxBVqsC2wpk+frrS0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" }, "execution_count": 52, "metadata": {}, "output_type": "execute_result" } ], "source": [ "plot(0:(N-1),u.value,marker=:diamond,label=\"u_seq_constr\",linetype=:steppost)\n", "xlabel!(\"k\")\n", "ylabel!(\"u\")" ] }, { "cell_type": "code", "execution_count": 53, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "2×10 reshape(::PseudoBlockArray{…,::Array{Float64,2}}, 2, 10) with eltype Float64:\n", " 4.0 6.0 7.0 7.0 6.0 … 1.10341 0.55488 0.318435\n", " 2.0 1.0 6.63161e-8 -1.0 -2.0 -0.548532 -0.236446 -0.0788149" ] }, "execution_count": 53, "metadata": {}, "output_type": "execute_result" } ], "source": [ "xopts = Chat*u.value + Ahat*x0;\n", "xopts = reshape(xopts,(2,:))" ] }, { "cell_type": "code", "execution_count": 54, "metadata": {}, "outputs": [ { "data": { "image/png": "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VIxoycjIUGFhoVwulyRpwoQJ2rt3r8NVIZ5xXEg9L730kkpKSpwuAzHy3e9+V9nZ2ec8//LLL0du9v7Nb35TV199dZe9WBs2bNA3vvENjRkzRpL00EMP9fgYkfABq76+Xtddd5369g3NmepyuZSTk6PPPvus03qfffaZhg8fHlnOzc09Zx0kl+eff17Tp0/v8rW6ujrddttt+uY3v6kVK1bEuDLEyr333quxY8dq3rx5Onz48Dmvc1xILW+//ba++uorTZs2rcvXOS6khq+++kodHR0aMmRI5Lnu/u93dYz4/PPP1dHRccH9xPVM7j0V7rEIs7uZeeLM9bpbB8nhySef1Mcff6xVq1ad89ptt92mhoYGZWVlqaGhQYWFhRo8eLCKioocqBTR8uabbyonJ0cnT57Uo48+qvvvv19vvPHGOetxXEgdv/zlLzVnzpzID/IzcVxILT3NDV2t21MJ34M1bNgwNTQ0RAam2rat+vp65eTkdFovJyen02nD/fv3n7MOksOyZcv06quvasOGDZEJ386UmZmprKwsSVJ2drZmzZqlrVu3xrpMRFn4/3e/fv20YMGCLj9jjgup49ixY/rtb3+rH//4x12+znEhdVx55ZWS1KlXu7v/+2cfI/bt26ehQ4cqLe3C8SnhA9ZVV12lcePGae3atZKk3//+98rNzVVubm6n9e655x794Q9/0BdffCHbtrVq1SoVFxc7UDGi6dlnn9W6dev0P//zPxo0aFCX6xw4cCDSvXv06FGtX79e48aNi2GViLZjx47pyJEjkeV169Z1+RlzXEgdr7zyim655ZbIWJqzcVxILTNnzpRlWZKk7du36+DBg7rjjjvOWW/q1Knavn279uzZI0lasWJFz48RvRicHzf27NljT5gwwR41apQ9fvx4u7a21rZt2y4pKbFfe+21yHovvPCCPXLkSPv666+3S0pK7K+//tqpkhEF9fX1tiR7xIgR9q233mrfeuut9u23327bdue2sHz5cvumm26yb7nlFvumm26yH3/88ciVh0gOn3zyiV1QUGCPHTvWzs/Pt++66y77008/tW2b40KquuOOO+xf/vKXnZ7juJD8HnroIXvo0KF2nz597KuvvtoeOXKkbdu2ffDgQfsHP/iBfcMNN9g33XSTvWXLlsjfPPbYY/bKlSsjy6+99pqdl5dnjxw50r777rvt5ubmHu2bW+UAAAAYlvCnCAEAAOINAQsAAMAwAhYAAIBhBCwAAADDCFgAAACGEbAAAAAMI2ABSAkPPPCA8vPznS4DQIogYAEAABhGwAIAADCMgAUgJXV0dOinP/2pPB6Ptm3b5nQ5AJJMX6cLAIBYa29v1/33369NmzappqZGY8eOdbokAEmGgAUgpbS1temf//mftWPHDm3dulWjRo1yuiQASYiABSBlHD9+XNOmTdO+ffv0l7/8RTk5OU6XBCBJEbAApIzDhw+rvr5eXq+XcAUgqhjkDiBl5OTk6De/+Y2WL1+uf//3f3e6HABJjB4sACnlRz/6kdasWaM5c+aof//++vnPf+50SQCSEAELQMq59957deLECf3kJz9RRkaGHnroIadLApBkCFgAUlJJSYmOHz8un8+n/v37a+7cuU6XBCCJuGzbtp0uAgAAIJkwyB0AAMAwAhYAAIBhBCwAAADDCFgAAACGEbAAAAAMI2ABAAAY9v8BWrdNBCnGMnQAAAAASUVORK5CYII=" }, "execution_count": 54, "metadata": {}, "output_type": "execute_result" } ], "source": [ "plot(0:N,hcat(x0,xopts)',marker=:diamond,label=[\"x1\" \"x2\"],linetype=:steppost)\n", "xlabel!(\"k\")\n", "ylabel!(\"x\")" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## References\n", "\n", "[1] ..." ] } ], "metadata": { "@webio": { "lastCommId": null, "lastKernelId": null }, "kernelspec": { "display_name": "Julia 1.5.3", "language": "julia", "name": "julia-1.5" }, "language_info": { "file_extension": ".jl", "mimetype": "application/julia", "name": "julia", "version": "1.5.3" }, "latex_envs": { "LaTeX_envs_menu_present": true, "autoclose": false, "autocomplete": false, "bibliofile": "biblio.bib", "cite_by": "apalike", "current_citInitial": 1, "eqLabelWithNumbers": true, "eqNumInitial": 1, "hotkeys": { "equation": "Ctrl-E", "itemize": "Ctrl-I" }, "labels_anchors": false, "latex_user_defs": false, "report_style_numbering": false, "user_envs_cfg": false }, "toc": { "base_numbering": 1, "nav_menu": { "height": "204px", "width": "422px" }, "number_sections": true, "sideBar": true, "skip_h1_title": false, "title_cell": "Table of Contents", "title_sidebar": "Contents", "toc_cell": false, "toc_position": { "height": "calc(100% - 180px)", "left": "10px", "top": "150px", "width": "217.767px" }, "toc_section_display": true, "toc_window_display": false }, "varInspector": { "cols": { "lenName": 16, "lenType": 16, "lenVar": 40 }, "kernels_config": { "python": { "delete_cmd_postfix": "", "delete_cmd_prefix": "del ", "library": "var_list.py", "varRefreshCmd": "print(var_dic_list())" }, "r": { "delete_cmd_postfix": ") ", "delete_cmd_prefix": "rm(", "library": "var_list.r", "varRefreshCmd": "cat(var_dic_list()) " } }, "types_to_exclude": [ "module", "function", "builtin_function_or_method", "instance", "_Feature" ], "window_display": false } }, "nbformat": 4, "nbformat_minor": 2 }