{ "cells": [ { "cell_type": "markdown", "metadata": {}, "source": [ "# Example 4: Minimum Frobenius Norm Static Output Feedback" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "The example system has been taken from \\[1, Example 4.2\\]. The eigenvalue placement with minimum Frobenium norm is discussed in \\[2, Example 4\\]. The open-loop system has eigenvlaues at $\\pm1$, $\\pm2$. We want to place two eigenvalues at -3 and -4, i.e., we carry out a partial eigenvalue assignment.\n", "\n", "1. Yannakoudakis, A. G. (2016): *The static output feedback from the invariant point of view*. IMA Journal of Mathematical Control and Information, 33(3), 639-668. DOI: <https://doi.org/10.1093/imamci/dnu057>\n", "2. Röbenack, K.; Gerbet, D.: *Minimum Norm Partial Eigenvalue Placement for Static Output Feedback Control*.\n", "[International Conference on System Theory, Control and Computing (ICSTCC)](https://icstcc2021.ac.tuiasi.ro/), \n", "October 20-23, 2021, Iași, Romania" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Polynomial ring" ] }, { "cell_type": "code", "execution_count": 37, "metadata": {}, "outputs": [ { "data": { "text/html": [ "<html><script type=\"math/tex; mode=display\">\\newcommand{\\Bold}[1]{\\mathbf{#1}}\\Bold{Q}[k_{11}, k_{12}, k_{21}, k_{22}, s, l_{0}, l_{1}, l_{2}, q]</script></html>" ], "text/latex": [ "$$\\newcommand{\\Bold}[1]{\\mathbf{#1}}\\Bold{Q}[k_{11}, k_{12}, k_{21}, k_{22}, s, l_{0}, l_{1}, l_{2}, q]$$" ], "text/plain": [ "Multivariate Polynomial Ring in k11, k12, k21, k22, s, l0, l1, l2, q over Rational Field" ] }, "execution_count": 37, "metadata": {}, "output_type": "execute_result" } ], "source": [ "%display latex\n", "R.<k11,k12,k21,k22,s,l0,l1,l2,q> = PolynomialRing(QQ, order='lex')\n", "R" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "State space system" ] }, { "cell_type": "code", "execution_count": 38, "metadata": {}, "outputs": [ { "data": { "text/html": [ "<html><script type=\"math/tex; mode=display\">\\newcommand{\\Bold}[1]{\\mathbf{#1}}\\left(\\left(\\begin{array}{rrrr}\n", "-1 & 0 & 0 & 0 \\\\\n", "0 & -2 & 0 & 0 \\\\\n", "0 & 0 & 1 & 0 \\\\\n", "0 & 0 & 0 & 2\n", "\\end{array}\\right), \\left(\\begin{array}{rr}\n", "1 & 0 \\\\\n", "1 & 0 \\\\\n", "1 & 1 \\\\\n", "1 & 0\n", "\\end{array}\\right), \\left(\\begin{array}{rrrr}\n", "1 & 1 & 1 & 1 \\\\\n", "0 & 0 & 0 & 1\n", "\\end{array}\\right)\\right)</script></html>" ], "text/latex": [ "$$\\newcommand{\\Bold}[1]{\\mathbf{#1}}\\left(\\left(\\begin{array}{rrrr}\n", "-1 & 0 & 0 & 0 \\\\\n", "0 & -2 & 0 & 0 \\\\\n", "0 & 0 & 1 & 0 \\\\\n", "0 & 0 & 0 & 2\n", "\\end{array}\\right), \\left(\\begin{array}{rr}\n", "1 & 0 \\\\\n", "1 & 0 \\\\\n", "1 & 1 \\\\\n", "1 & 0\n", "\\end{array}\\right), \\left(\\begin{array}{rrrr}\n", "1 & 1 & 1 & 1 \\\\\n", "0 & 0 & 0 & 1\n", "\\end{array}\\right)\\right)$$" ], "text/plain": [ "(\n", "[-1 0 0 0] [1 0] \n", "[ 0 -2 0 0] [1 0] \n", "[ 0 0 1 0] [1 1] [1 1 1 1]\n", "[ 0 0 0 2], [1 0], [0 0 0 1]\n", ")" ] }, "execution_count": 38, "metadata": {}, "output_type": "execute_result" } ], "source": [ "A = matrix(R,[[-1,0,0,0],\n", " [0,-2,0,0],\n", " [0,0,1,0],\n", " [0,0,0,2]])\n", "B = matrix(R,[[1,0],[1,0],[1,1],[1,0]])\n", "C = matrix(R,[[1,1,1,1],[0,0,0,1]])\n", "(A,B,C)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Symbolic feedback matrix" ] }, { "cell_type": "code", "execution_count": 39, "metadata": {}, "outputs": [ { "data": { "text/html": [ "<html><script type=\"math/tex; mode=display\">\\newcommand{\\Bold}[1]{\\mathbf{#1}}\\left(\\begin{array}{rr}\n", "k_{11} & k_{12} \\\\\n", "k_{21} & k_{22}\n", "\\end{array}\\right)</script></html>" ], "text/latex": [ "$$\\newcommand{\\Bold}[1]{\\mathbf{#1}}\\left(\\begin{array}{rr}\n", "k_{11} & k_{12} \\\\\n", "k_{21} & k_{22}\n", "\\end{array}\\right)$$" ], "text/plain": [ "[k11 k12]\n", "[k21 k22]" ] }, "execution_count": 39, "metadata": {}, "output_type": "execute_result" } ], "source": [ "K = matrix(R,[[k11,k12],[k21,k22]])\n", "K" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Closed-loop characteristic polynomial" ] }, { "cell_type": "code", "execution_count": 41, "metadata": {}, "outputs": [ { "data": { "text/html": [ "<html><script type=\"math/tex; mode=display\">\\newcommand{\\Bold}[1]{\\mathbf{#1}}k_{12} k_{21} s^{2} - k_{11} k_{22} s^{2} + 4 k_{11} s^{3} + k_{12} s^{3} + k_{21} s^{3} + s^{4} + 3 k_{12} k_{21} s - 3 k_{11} k_{22} s + 2 k_{12} s^{2} + k_{21} s^{2} + 2 k_{12} k_{21} - 2 k_{11} k_{22} - 10 k_{11} s - k_{12} s - 4 k_{21} s - 5 s^{2} - 2 k_{12} - 4 k_{21} + 4</script></html>" ], "text/latex": [ "$$\\newcommand{\\Bold}[1]{\\mathbf{#1}}k_{12} k_{21} s^{2} - k_{11} k_{22} s^{2} + 4 k_{11} s^{3} + k_{12} s^{3} + k_{21} s^{3} + s^{4} + 3 k_{12} k_{21} s - 3 k_{11} k_{22} s + 2 k_{12} s^{2} + k_{21} s^{2} + 2 k_{12} k_{21} - 2 k_{11} k_{22} - 10 k_{11} s - k_{12} s - 4 k_{21} s - 5 s^{2} - 2 k_{12} - 4 k_{21} + 4$$" ], "text/plain": [ "k12*k21*s^2 - k11*k22*s^2 + 4*k11*s^3 + k12*s^3 + k21*s^3 + s^4 + 3*k12*k21*s - 3*k11*k22*s + 2*k12*s^2 + k21*s^2 + 2*k12*k21 - 2*k11*k22 - 10*k11*s - k12*s - 4*k21*s - 5*s^2 - 2*k12 - 4*k21 + 4" ] }, "execution_count": 41, "metadata": {}, "output_type": "execute_result" } ], "source": [ "CP = det(s*matrix.identity(4)-(A-B*K*C))\n", "CP" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Remainders of polynomial division for an eigenvalue placement at $-3,-4,-5,-2\\pm2j$" ] }, { "cell_type": "code", "execution_count": 45, "metadata": {}, "outputs": [ { "data": { "text/html": [ "<html><script type=\"math/tex; mode=display\">\\newcommand{\\Bold}[1]{\\mathbf{#1}}\\left[2 k_{12} k_{21} - 2 k_{11} k_{22} - 78 k_{11} - 8 k_{12} - 10 k_{21} + 40, 6 k_{12} k_{21} - 6 k_{11} k_{22} - 216 k_{11} - 30 k_{12} - 36 k_{21} + 180\\right]</script></html>" ], "text/latex": [ "$$\\newcommand{\\Bold}[1]{\\mathbf{#1}}\\left[2 k_{12} k_{21} - 2 k_{11} k_{22} - 78 k_{11} - 8 k_{12} - 10 k_{21} + 40, 6 k_{12} k_{21} - 6 k_{11} k_{22} - 216 k_{11} - 30 k_{12} - 36 k_{21} + 180\\right]$$" ], "text/plain": [ "[2*k12*k21 - 2*k11*k22 - 78*k11 - 8*k12 - 10*k21 + 40,\n", " 6*k12*k21 - 6*k11*k22 - 216*k11 - 30*k12 - 36*k21 + 180]" ] }, "execution_count": 45, "metadata": {}, "output_type": "execute_result" } ], "source": [ "q1,r1 = CP.quo_rem(s+3)\n", "q2,r2 = CP.quo_rem(s+4)\n", "[r1,r2]" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Lagrangian function" ] }, { "cell_type": "code", "execution_count": 46, "metadata": {}, "outputs": [ { "data": { "text/html": [ "<html><script type=\"math/tex; mode=display\">\\newcommand{\\Bold}[1]{\\mathbf{#1}}k_{11}^{2} l_{0} - 2 k_{11} k_{22} l_{1} - 6 k_{11} k_{22} l_{2} - 78 k_{11} l_{1} - 216 k_{11} l_{2} + k_{12}^{2} l_{0} + 2 k_{12} k_{21} l_{1} + 6 k_{12} k_{21} l_{2} - 8 k_{12} l_{1} - 30 k_{12} l_{2} + k_{21}^{2} l_{0} - 10 k_{21} l_{1} - 36 k_{21} l_{2} + k_{22}^{2} l_{0} - l_{0} q + 40 l_{1} + 180 l_{2} + q</script></html>" ], "text/latex": [ "$$\\newcommand{\\Bold}[1]{\\mathbf{#1}}k_{11}^{2} l_{0} - 2 k_{11} k_{22} l_{1} - 6 k_{11} k_{22} l_{2} - 78 k_{11} l_{1} - 216 k_{11} l_{2} + k_{12}^{2} l_{0} + 2 k_{12} k_{21} l_{1} + 6 k_{12} k_{21} l_{2} - 8 k_{12} l_{1} - 30 k_{12} l_{2} + k_{21}^{2} l_{0} - 10 k_{21} l_{1} - 36 k_{21} l_{2} + k_{22}^{2} l_{0} - l_{0} q + 40 l_{1} + 180 l_{2} + q$$" ], "text/plain": [ "k11^2*l0 - 2*k11*k22*l1 - 6*k11*k22*l2 - 78*k11*l1 - 216*k11*l2 + k12^2*l0 + 2*k12*k21*l1 + 6*k12*k21*l2 - 8*k12*l1 - 30*k12*l2 + k21^2*l0 - 10*k21*l1 - 36*k21*l2 + k22^2*l0 - l0*q + 40*l1 + 180*l2 + q" ] }, "execution_count": 46, "metadata": {}, "output_type": "execute_result" } ], "source": [ "L = q + l0*(k11^2+k12^2+k21^2+k22^2-q) + l1*r1 + l2*r2\n", "L" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Neccessary optimility condition and associated polynomial ideal" ] }, { "cell_type": "code", "execution_count": 47, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "0 : k11 : 2*k11*l0 - 2*k22*l1 - 6*k22*l2 - 78*l1 - 216*l2\n", "1 : k12 : 2*k12*l0 + 2*k21*l1 + 6*k21*l2 - 8*l1 - 30*l2\n", "2 : k21 : 2*k12*l1 + 6*k12*l2 + 2*k21*l0 - 10*l1 - 36*l2\n", "3 : k22 : -2*k11*l1 - 6*k11*l2 + 2*k22*l0\n", "4 : l0 : k11^2 + k12^2 + k21^2 + k22^2 - q\n", "5 : l1 : -2*k11*k22 - 78*k11 + 2*k12*k21 - 8*k12 - 10*k21 + 40\n", "6 : l2 : -6*k11*k22 - 216*k11 + 6*k12*k21 - 30*k12 - 36*k21 + 180\n", "7 : q : -l0 + 1\n" ] }, { "data": { "text/html": [ "<html><script type=\"math/tex; mode=display\">\\newcommand{\\Bold}[1]{\\mathbf{#1}}\\left(2 k_{11} l_{0} - 2 k_{22} l_{1} - 6 k_{22} l_{2} - 78 l_{1} - 216 l_{2}, 2 k_{12} l_{0} + 2 k_{21} l_{1} + 6 k_{21} l_{2} - 8 l_{1} - 30 l_{2}, 2 k_{12} l_{1} + 6 k_{12} l_{2} + 2 k_{21} l_{0} - 10 l_{1} - 36 l_{2}, -2 k_{11} l_{1} - 6 k_{11} l_{2} + 2 k_{22} l_{0}, k_{11}^{2} + k_{12}^{2} + k_{21}^{2} + k_{22}^{2} - q, -2 k_{11} k_{22} - 78 k_{11} + 2 k_{12} k_{21} - 8 k_{12} - 10 k_{21} + 40, -6 k_{11} k_{22} - 216 k_{11} + 6 k_{12} k_{21} - 30 k_{12} - 36 k_{21} + 180, -l_{0} + 1\\right)\\Bold{Q}[k_{11}, k_{12}, k_{21}, k_{22}, s, l_{0}, l_{1}, l_{2}, q]</script></html>" ], "text/latex": [ "$$\\newcommand{\\Bold}[1]{\\mathbf{#1}}\\left(2 k_{11} l_{0} - 2 k_{22} l_{1} - 6 k_{22} l_{2} - 78 l_{1} - 216 l_{2}, 2 k_{12} l_{0} + 2 k_{21} l_{1} + 6 k_{21} l_{2} - 8 l_{1} - 30 l_{2}, 2 k_{12} l_{1} + 6 k_{12} l_{2} + 2 k_{21} l_{0} - 10 l_{1} - 36 l_{2}, -2 k_{11} l_{1} - 6 k_{11} l_{2} + 2 k_{22} l_{0}, k_{11}^{2} + k_{12}^{2} + k_{21}^{2} + k_{22}^{2} - q, -2 k_{11} k_{22} - 78 k_{11} + 2 k_{12} k_{21} - 8 k_{12} - 10 k_{21} + 40, -6 k_{11} k_{22} - 216 k_{11} + 6 k_{12} k_{21} - 30 k_{12} - 36 k_{21} + 180, -l_{0} + 1\\right)\\Bold{Q}[k_{11}, k_{12}, k_{21}, k_{22}, s, l_{0}, l_{1}, l_{2}, q]$$" ], "text/plain": [ "Ideal (2*k11*l0 - 2*k22*l1 - 6*k22*l2 - 78*l1 - 216*l2, 2*k12*l0 + 2*k21*l1 + 6*k21*l2 - 8*l1 - 30*l2, 2*k12*l1 + 6*k12*l2 + 2*k21*l0 - 10*l1 - 36*l2, -2*k11*l1 - 6*k11*l2 + 2*k22*l0, k11^2 + k12^2 + k21^2 + k22^2 - q, -2*k11*k22 - 78*k11 + 2*k12*k21 - 8*k12 - 10*k21 + 40, -6*k11*k22 - 216*k11 + 6*k12*k21 - 30*k12 - 36*k21 + 180, -l0 + 1) of Multivariate Polynomial Ring in k11, k12, k21, k22, s, l0, l1, l2, q over Rational Field" ] }, "execution_count": 47, "metadata": {}, "output_type": "execute_result" } ], "source": [ "vars = [k11,k12,k21,k22,l0,l1,l2,q]\n", "PLIST = []\n", "for ii in range(len(vars)):\n", " print(ii,\" : \",vars[ii],\" : \",diff(L,vars[ii]))\n", " PLIST.append(diff(L,vars[ii]))\n", "I = Ideal(PLIST)\n", "I" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Dimension of the ideal" ] }, { "cell_type": "code", "execution_count": 48, "metadata": {}, "outputs": [ { "data": { "text/html": [ "<html><script type=\"math/tex; mode=display\">\\newcommand{\\Bold}[1]{\\mathbf{#1}}1</script></html>" ], "text/latex": [ "$$\\newcommand{\\Bold}[1]{\\mathbf{#1}}1$$" ], "text/plain": [ "1" ] }, "execution_count": 48, "metadata": {}, "output_type": "execute_result" } ], "source": [ "I.dimension()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Change of the ring (without the variable s), dimension of the new ideal over the new ring" ] }, { "cell_type": "code", "execution_count": 49, "metadata": {}, "outputs": [ { "data": { "text/html": [ "<html><script type=\"math/tex; mode=display\">\\newcommand{\\Bold}[1]{\\mathbf{#1}}0</script></html>" ], "text/latex": [ "$$\\newcommand{\\Bold}[1]{\\mathbf{#1}}0$$" ], "text/plain": [ "0" ] }, "execution_count": 49, "metadata": {}, "output_type": "execute_result" } ], "source": [ "J = I.change_ring(PolynomialRing(QQ, 'k11,k12,k21,k22,l0,l1,l2,q'))\n", "J.dimension()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Algebraic variety, computation of possible solutions w.r.t. q" ] }, { "cell_type": "code", "execution_count": 50, "metadata": {}, "outputs": [ { "data": { "text/html": [ "<html><script type=\"math/tex; mode=display\">\\newcommand{\\Bold}[1]{\\mathbf{#1}}\\left[\\verb|{q:|\\phantom{\\verb!x!}\\verb|49.86765685705741?,|\\phantom{\\verb!x!}\\verb|l2:|\\phantom{\\verb!x!}\\verb|1.724779377670393?,|\\phantom{\\verb!x!}\\verb|l1:|\\phantom{\\verb!x!}\\verb|-4.776564836819256?,|\\phantom{\\verb!x!}\\verb|l0:|\\phantom{\\verb!x!}\\verb|1,|\\phantom{\\verb!x!}\\verb|k22:|\\phantom{\\verb!x!}\\verb|-0.004657285406960964?,|\\phantom{\\verb!x!}\\verb|k21:|\\phantom{\\verb!x!}\\verb|5.312689537081823?,|\\phantom{\\verb!x!}\\verb|k12:|\\phantom{\\verb!x!}\\verb|4.652185288969493?,|\\phantom{\\verb!x!}\\verb|k11:|\\phantom{\\verb!x!}\\verb|-0.011708391316228208?}|, \\verb|{q:|\\phantom{\\verb!x!}\\verb|999.2471217743665?,|\\phantom{\\verb!x!}\\verb|l2:|\\phantom{\\verb!x!}\\verb|-7.002551934616844?,|\\phantom{\\verb!x!}\\verb|l1:|\\phantom{\\verb!x!}\\verb|17.53660754400994?,|\\phantom{\\verb!x!}\\verb|l0:|\\phantom{\\verb!x!}\\verb|1,|\\phantom{\\verb!x!}\\verb|k22:|\\phantom{\\verb!x!}\\verb|-22.72982463317064?,|\\phantom{\\verb!x!}\\verb|k21:|\\phantom{\\verb!x!}\\verb|14.43443587369492?,|\\phantom{\\verb!x!}\\verb|k12:|\\phantom{\\verb!x!}\\verb|15.21077467795653?,|\\phantom{\\verb!x!}\\verb|k11:|\\phantom{\\verb!x!}\\verb|6.548403517217146?}|, \\verb|{q:|\\phantom{\\verb!x!}\\verb|1561.763567399865?,|\\phantom{\\verb!x!}\\verb|l2:|\\phantom{\\verb!x!}\\verb|-0.01707246399143216?,|\\phantom{\\verb!x!}\\verb|l1:|\\phantom{\\verb!x!}\\verb|108.04659597236198?,|\\phantom{\\verb!x!}\\verb|l0:|\\phantom{\\verb!x!}\\verb|1,|\\phantom{\\verb!x!}\\verb|k22:|\\phantom{\\verb!x!}\\verb|-39.00476708252040?,|\\phantom{\\verb!x!}\\verb|k21:|\\phantom{\\verb!x!}\\verb|3.953570842581141?,|\\phantom{\\verb!x!}\\verb|k12:|\\phantom{\\verb!x!}\\verb|4.962917040643787?,|\\phantom{\\verb!x!}\\verb|k11:|\\phantom{\\verb!x!}\\verb|-0.3611707055916909?}|, \\verb|{q:|\\phantom{\\verb!x!}\\verb|-4.916404336627678?|\\phantom{\\verb!x!}\\verb|-|\\phantom{\\verb!x!}\\verb|18.52750021398926?*I,|\\phantom{\\verb!x!}\\verb|l2:|\\phantom{\\verb!x!}\\verb|4.339721358523375?|\\phantom{\\verb!x!}\\verb|+|\\phantom{\\verb!x!}\\verb|0.2633215598930059?*I,|\\phantom{\\verb!x!}\\verb|l1:|\\phantom{\\verb!x!}\\verb|-12.01723568378310?|\\phantom{\\verb!x!}\\verb|-|\\phantom{\\verb!x!}\\verb|0.7361405887374441?*I,|\\phantom{\\verb!x!}\\verb|l0:|\\phantom{\\verb!x!}\\verb|1,|\\phantom{\\verb!x!}\\verb|k22:|\\phantom{\\verb!x!}\\verb|2.503462143622678?|\\phantom{\\verb!x!}\\verb|+|\\phantom{\\verb!x!}\\verb|0.3220443233695608?*I,|\\phantom{\\verb!x!}\\verb|k21:|\\phantom{\\verb!x!}\\verb|7.930611453339347?|\\phantom{\\verb!x!}\\verb|+|\\phantom{\\verb!x!}\\verb|9.557597773794300?*I,|\\phantom{\\verb!x!}\\verb|k12:|\\phantom{\\verb!x!}\\verb|9.59540187514585?|\\phantom{\\verb!x!}\\verb|-|\\phantom{\\verb!x!}\\verb|8.99762547548652?*I,|\\phantom{\\verb!x!}\\verb|k11:|\\phantom{\\verb!x!}\\verb|2.508671109495064?|\\phantom{\\verb!x!}\\verb|+|\\phantom{\\verb!x!}\\verb|0.1866574327692599?*I}|, \\verb|{q:|\\phantom{\\verb!x!}\\verb|-4.916404336627678?|\\phantom{\\verb!x!}\\verb|+|\\phantom{\\verb!x!}\\verb|18.52750021398926?*I,|\\phantom{\\verb!x!}\\verb|l2:|\\phantom{\\verb!x!}\\verb|4.339721358523375?|\\phantom{\\verb!x!}\\verb|-|\\phantom{\\verb!x!}\\verb|0.2633215598930059?*I,|\\phantom{\\verb!x!}\\verb|l1:|\\phantom{\\verb!x!}\\verb|-12.01723568378310?|\\phantom{\\verb!x!}\\verb|+|\\phantom{\\verb!x!}\\verb|0.7361405887374441?*I,|\\phantom{\\verb!x!}\\verb|l0:|\\phantom{\\verb!x!}\\verb|1,|\\phantom{\\verb!x!}\\verb|k22:|\\phantom{\\verb!x!}\\verb|2.503462143622678?|\\phantom{\\verb!x!}\\verb|-|\\phantom{\\verb!x!}\\verb|0.3220443233695608?*I,|\\phantom{\\verb!x!}\\verb|k21:|\\phantom{\\verb!x!}\\verb|7.930611453339347?|\\phantom{\\verb!x!}\\verb|-|\\phantom{\\verb!x!}\\verb|9.557597773794300?*I,|\\phantom{\\verb!x!}\\verb|k12:|\\phantom{\\verb!x!}\\verb|9.59540187514585?|\\phantom{\\verb!x!}\\verb|+|\\phantom{\\verb!x!}\\verb|8.99762547548652?*I,|\\phantom{\\verb!x!}\\verb|k11:|\\phantom{\\verb!x!}\\verb|2.508671109495064?|\\phantom{\\verb!x!}\\verb|-|\\phantom{\\verb!x!}\\verb|0.1866574327692599?*I}|, \\verb|{q:|\\phantom{\\verb!x!}\\verb|1357.768400840521?|\\phantom{\\verb!x!}\\verb|+|\\phantom{\\verb!x!}\\verb|0.?e-177*I,|\\phantom{\\verb!x!}\\verb|l2:|\\phantom{\\verb!x!}\\verb|-32.12818743969861?|\\phantom{\\verb!x!}\\verb|+|\\phantom{\\verb!x!}\\verb|0.?e-176*I,|\\phantom{\\verb!x!}\\verb|l1:|\\phantom{\\verb!x!}\\verb|0.4586019187827692?|\\phantom{\\verb!x!}\\verb|+|\\phantom{\\verb!x!}\\verb|0.?e-175*I,|\\phantom{\\verb!x!}\\verb|l0:|\\phantom{\\verb!x!}\\verb|1,|\\phantom{\\verb!x!}\\verb|k22:|\\phantom{\\verb!x!}\\verb|-35.98956877727162?|\\phantom{\\verb!x!}\\verb|+|\\phantom{\\verb!x!}\\verb|0.?e-176*I,|\\phantom{\\verb!x!}\\verb|k21:|\\phantom{\\verb!x!}\\verb|5.067929623658367?|\\phantom{\\verb!x!}\\verb|+|\\phantom{\\verb!x!}\\verb|0.?e-175*I,|\\phantom{\\verb!x!}\\verb|k12:|\\phantom{\\verb!x!}\\verb|6.057612470277891?|\\phantom{\\verb!x!}\\verb|+|\\phantom{\\verb!x!}\\verb|0.?e-174*I,|\\phantom{\\verb!x!}\\verb|k11:|\\phantom{\\verb!x!}\\verb|0.3751806979787524?|\\phantom{\\verb!x!}\\verb|+|\\phantom{\\verb!x!}\\verb|0.?e-176*I}|\\right]</script></html>" ], "text/latex": [ "$$\\newcommand{\\Bold}[1]{\\mathbf{#1}}\\left[\\verb|{q:|\\phantom{\\verb!x!}\\verb|49.86765685705741?,|\\phantom{\\verb!x!}\\verb|l2:|\\phantom{\\verb!x!}\\verb|1.724779377670393?,|\\phantom{\\verb!x!}\\verb|l1:|\\phantom{\\verb!x!}\\verb|-4.776564836819256?,|\\phantom{\\verb!x!}\\verb|l0:|\\phantom{\\verb!x!}\\verb|1,|\\phantom{\\verb!x!}\\verb|k22:|\\phantom{\\verb!x!}\\verb|-0.004657285406960964?,|\\phantom{\\verb!x!}\\verb|k21:|\\phantom{\\verb!x!}\\verb|5.312689537081823?,|\\phantom{\\verb!x!}\\verb|k12:|\\phantom{\\verb!x!}\\verb|4.652185288969493?,|\\phantom{\\verb!x!}\\verb|k11:|\\phantom{\\verb!x!}\\verb|-0.011708391316228208?}|, \\verb|{q:|\\phantom{\\verb!x!}\\verb|999.2471217743665?,|\\phantom{\\verb!x!}\\verb|l2:|\\phantom{\\verb!x!}\\verb|-7.002551934616844?,|\\phantom{\\verb!x!}\\verb|l1:|\\phantom{\\verb!x!}\\verb|17.53660754400994?,|\\phantom{\\verb!x!}\\verb|l0:|\\phantom{\\verb!x!}\\verb|1,|\\phantom{\\verb!x!}\\verb|k22:|\\phantom{\\verb!x!}\\verb|-22.72982463317064?,|\\phantom{\\verb!x!}\\verb|k21:|\\phantom{\\verb!x!}\\verb|14.43443587369492?,|\\phantom{\\verb!x!}\\verb|k12:|\\phantom{\\verb!x!}\\verb|15.21077467795653?,|\\phantom{\\verb!x!}\\verb|k11:|\\phantom{\\verb!x!}\\verb|6.548403517217146?}|, \\verb|{q:|\\phantom{\\verb!x!}\\verb|1561.763567399865?,|\\phantom{\\verb!x!}\\verb|l2:|\\phantom{\\verb!x!}\\verb|-0.01707246399143216?,|\\phantom{\\verb!x!}\\verb|l1:|\\phantom{\\verb!x!}\\verb|108.04659597236198?,|\\phantom{\\verb!x!}\\verb|l0:|\\phantom{\\verb!x!}\\verb|1,|\\phantom{\\verb!x!}\\verb|k22:|\\phantom{\\verb!x!}\\verb|-39.00476708252040?,|\\phantom{\\verb!x!}\\verb|k21:|\\phantom{\\verb!x!}\\verb|3.953570842581141?,|\\phantom{\\verb!x!}\\verb|k12:|\\phantom{\\verb!x!}\\verb|4.962917040643787?,|\\phantom{\\verb!x!}\\verb|k11:|\\phantom{\\verb!x!}\\verb|-0.3611707055916909?}|, \\verb|{q:|\\phantom{\\verb!x!}\\verb|-4.916404336627678?|\\phantom{\\verb!x!}\\verb|-|\\phantom{\\verb!x!}\\verb|18.52750021398926?*I,|\\phantom{\\verb!x!}\\verb|l2:|\\phantom{\\verb!x!}\\verb|4.339721358523375?|\\phantom{\\verb!x!}\\verb|+|\\phantom{\\verb!x!}\\verb|0.2633215598930059?*I,|\\phantom{\\verb!x!}\\verb|l1:|\\phantom{\\verb!x!}\\verb|-12.01723568378310?|\\phantom{\\verb!x!}\\verb|-|\\phantom{\\verb!x!}\\verb|0.7361405887374441?*I,|\\phantom{\\verb!x!}\\verb|l0:|\\phantom{\\verb!x!}\\verb|1,|\\phantom{\\verb!x!}\\verb|k22:|\\phantom{\\verb!x!}\\verb|2.503462143622678?|\\phantom{\\verb!x!}\\verb|+|\\phantom{\\verb!x!}\\verb|0.3220443233695608?*I,|\\phantom{\\verb!x!}\\verb|k21:|\\phantom{\\verb!x!}\\verb|7.930611453339347?|\\phantom{\\verb!x!}\\verb|+|\\phantom{\\verb!x!}\\verb|9.557597773794300?*I,|\\phantom{\\verb!x!}\\verb|k12:|\\phantom{\\verb!x!}\\verb|9.59540187514585?|\\phantom{\\verb!x!}\\verb|-|\\phantom{\\verb!x!}\\verb|8.99762547548652?*I,|\\phantom{\\verb!x!}\\verb|k11:|\\phantom{\\verb!x!}\\verb|2.508671109495064?|\\phantom{\\verb!x!}\\verb|+|\\phantom{\\verb!x!}\\verb|0.1866574327692599?*I}|, \\verb|{q:|\\phantom{\\verb!x!}\\verb|-4.916404336627678?|\\phantom{\\verb!x!}\\verb|+|\\phantom{\\verb!x!}\\verb|18.52750021398926?*I,|\\phantom{\\verb!x!}\\verb|l2:|\\phantom{\\verb!x!}\\verb|4.339721358523375?|\\phantom{\\verb!x!}\\verb|-|\\phantom{\\verb!x!}\\verb|0.2633215598930059?*I,|\\phantom{\\verb!x!}\\verb|l1:|\\phantom{\\verb!x!}\\verb|-12.01723568378310?|\\phantom{\\verb!x!}\\verb|+|\\phantom{\\verb!x!}\\verb|0.7361405887374441?*I,|\\phantom{\\verb!x!}\\verb|l0:|\\phantom{\\verb!x!}\\verb|1,|\\phantom{\\verb!x!}\\verb|k22:|\\phantom{\\verb!x!}\\verb|2.503462143622678?|\\phantom{\\verb!x!}\\verb|-|\\phantom{\\verb!x!}\\verb|0.3220443233695608?*I,|\\phantom{\\verb!x!}\\verb|k21:|\\phantom{\\verb!x!}\\verb|7.930611453339347?|\\phantom{\\verb!x!}\\verb|-|\\phantom{\\verb!x!}\\verb|9.557597773794300?*I,|\\phantom{\\verb!x!}\\verb|k12:|\\phantom{\\verb!x!}\\verb|9.59540187514585?|\\phantom{\\verb!x!}\\verb|+|\\phantom{\\verb!x!}\\verb|8.99762547548652?*I,|\\phantom{\\verb!x!}\\verb|k11:|\\phantom{\\verb!x!}\\verb|2.508671109495064?|\\phantom{\\verb!x!}\\verb|-|\\phantom{\\verb!x!}\\verb|0.1866574327692599?*I}|, \\verb|{q:|\\phantom{\\verb!x!}\\verb|1357.768400840521?|\\phantom{\\verb!x!}\\verb|+|\\phantom{\\verb!x!}\\verb|0.?e-177*I,|\\phantom{\\verb!x!}\\verb|l2:|\\phantom{\\verb!x!}\\verb|-32.12818743969861?|\\phantom{\\verb!x!}\\verb|+|\\phantom{\\verb!x!}\\verb|0.?e-176*I,|\\phantom{\\verb!x!}\\verb|l1:|\\phantom{\\verb!x!}\\verb|0.4586019187827692?|\\phantom{\\verb!x!}\\verb|+|\\phantom{\\verb!x!}\\verb|0.?e-175*I,|\\phantom{\\verb!x!}\\verb|l0:|\\phantom{\\verb!x!}\\verb|1,|\\phantom{\\verb!x!}\\verb|k22:|\\phantom{\\verb!x!}\\verb|-35.98956877727162?|\\phantom{\\verb!x!}\\verb|+|\\phantom{\\verb!x!}\\verb|0.?e-176*I,|\\phantom{\\verb!x!}\\verb|k21:|\\phantom{\\verb!x!}\\verb|5.067929623658367?|\\phantom{\\verb!x!}\\verb|+|\\phantom{\\verb!x!}\\verb|0.?e-175*I,|\\phantom{\\verb!x!}\\verb|k12:|\\phantom{\\verb!x!}\\verb|6.057612470277891?|\\phantom{\\verb!x!}\\verb|+|\\phantom{\\verb!x!}\\verb|0.?e-174*I,|\\phantom{\\verb!x!}\\verb|k11:|\\phantom{\\verb!x!}\\verb|0.3751806979787524?|\\phantom{\\verb!x!}\\verb|+|\\phantom{\\verb!x!}\\verb|0.?e-176*I}|\\right]$$" ], "text/plain": [ "[{q: 49.86765685705741?, l2: 1.724779377670393?, l1: -4.776564836819256?, l0: 1, k22: -0.004657285406960964?, k21: 5.312689537081823?, k12: 4.652185288969493?, k11: -0.011708391316228208?},\n", " {q: 999.2471217743665?, l2: -7.002551934616844?, l1: 17.53660754400994?, l0: 1, k22: -22.72982463317064?, k21: 14.43443587369492?, k12: 15.21077467795653?, k11: 6.548403517217146?},\n", " {q: 1561.763567399865?, l2: -0.01707246399143216?, l1: 108.04659597236198?, l0: 1, k22: -39.00476708252040?, k21: 3.953570842581141?, k12: 4.962917040643787?, k11: -0.3611707055916909?},\n", " {q: -4.916404336627678? - 18.52750021398926?*I, l2: 4.339721358523375? + 0.2633215598930059?*I, l1: -12.01723568378310? - 0.7361405887374441?*I, l0: 1, k22: 2.503462143622678? + 0.3220443233695608?*I, k21: 7.930611453339347? + 9.557597773794300?*I, k12: 9.59540187514585? - 8.99762547548652?*I, k11: 2.508671109495064? + 0.1866574327692599?*I},\n", " {q: -4.916404336627678? + 18.52750021398926?*I, l2: 4.339721358523375? - 0.2633215598930059?*I, l1: -12.01723568378310? + 0.7361405887374441?*I, l0: 1, k22: 2.503462143622678? - 0.3220443233695608?*I, k21: 7.930611453339347? - 9.557597773794300?*I, k12: 9.59540187514585? + 8.99762547548652?*I, k11: 2.508671109495064? - 0.1866574327692599?*I},\n", " {q: 1357.768400840521? + 0.?e-177*I, l2: -32.12818743969861? + 0.?e-176*I, l1: 0.4586019187827692? + 0.?e-175*I, l0: 1, k22: -35.98956877727162? + 0.?e-176*I, k21: 5.067929623658367? + 0.?e-175*I, k12: 6.057612470277891? + 0.?e-174*I, k11: 0.3751806979787524? + 0.?e-176*I}]" ] }, "execution_count": 50, "metadata": {}, "output_type": "execute_result" } ], "source": [ "lsg = J.variety(QQbar)\n", "lsg" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Selection of the minimum solution q" ] }, { "cell_type": "code", "execution_count": 51, "metadata": {}, "outputs": [ { "data": { "text/html": [ "<html><script type=\"math/tex; mode=display\">\\newcommand{\\Bold}[1]{\\mathbf{#1}}\\verb|{q:|\\phantom{\\verb!x!}\\verb|49.86765685705741?,|\\phantom{\\verb!x!}\\verb|l2:|\\phantom{\\verb!x!}\\verb|1.724779377670393?,|\\phantom{\\verb!x!}\\verb|l1:|\\phantom{\\verb!x!}\\verb|-4.776564836819256?,|\\phantom{\\verb!x!}\\verb|l0:|\\phantom{\\verb!x!}\\verb|1,|\\phantom{\\verb!x!}\\verb|k22:|\\phantom{\\verb!x!}\\verb|-0.004657285406960964?,|\\phantom{\\verb!x!}\\verb|k21:|\\phantom{\\verb!x!}\\verb|5.312689537081823?,|\\phantom{\\verb!x!}\\verb|k12:|\\phantom{\\verb!x!}\\verb|4.652185288969493?,|\\phantom{\\verb!x!}\\verb|k11:|\\phantom{\\verb!x!}\\verb|-0.011708391316228208?}|</script></html>" ], "text/latex": [ "$$\\newcommand{\\Bold}[1]{\\mathbf{#1}}\\verb|{q:|\\phantom{\\verb!x!}\\verb|49.86765685705741?,|\\phantom{\\verb!x!}\\verb|l2:|\\phantom{\\verb!x!}\\verb|1.724779377670393?,|\\phantom{\\verb!x!}\\verb|l1:|\\phantom{\\verb!x!}\\verb|-4.776564836819256?,|\\phantom{\\verb!x!}\\verb|l0:|\\phantom{\\verb!x!}\\verb|1,|\\phantom{\\verb!x!}\\verb|k22:|\\phantom{\\verb!x!}\\verb|-0.004657285406960964?,|\\phantom{\\verb!x!}\\verb|k21:|\\phantom{\\verb!x!}\\verb|5.312689537081823?,|\\phantom{\\verb!x!}\\verb|k12:|\\phantom{\\verb!x!}\\verb|4.652185288969493?,|\\phantom{\\verb!x!}\\verb|k11:|\\phantom{\\verb!x!}\\verb|-0.011708391316228208?}|$$" ], "text/plain": [ "{q: 49.86765685705741?, l2: 1.724779377670393?, l1: -4.776564836819256?, l0: 1, k22: -0.004657285406960964?, k21: 5.312689537081823?, k12: 4.652185288969493?, k11: -0.011708391316228208?}" ] }, "execution_count": 51, "metadata": {}, "output_type": "execute_result" } ], "source": [ "lx = lsg[0]\n", "lx" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Numerical feedback gain matrix" ] }, { "cell_type": "code", "execution_count": 52, "metadata": {}, "outputs": [ { "data": { "text/html": [ "<html><script type=\"math/tex; mode=display\">\\newcommand{\\Bold}[1]{\\mathbf{#1}}\\left(\\begin{array}{rr}\n", "-0.0117083913162282 & 4.65218528896949 \\\\\n", "5.31268953708182 & -0.00465728540696096\n", "\\end{array}\\right)</script></html>" ], "text/latex": [ "$$\\newcommand{\\Bold}[1]{\\mathbf{#1}}\\left(\\begin{array}{rr}\n", "-0.0117083913162282 & 4.65218528896949 \\\\\n", "5.31268953708182 & -0.00465728540696096\n", "\\end{array}\\right)$$" ], "text/plain": [ "[ -0.0117083913162282 4.65218528896949]\n", "[ 5.31268953708182 -0.00465728540696096]" ] }, "execution_count": 52, "metadata": {}, "output_type": "execute_result" } ], "source": [ "K0 = K.subs(k11=RR(lx['k11']),k12=RR(lx['k12']),\n", " k21=RR(lx['k21']),k22=RR(lx['k22']))\n", "K0" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Frobenius norm of the computed feedback matrix" ] }, { "cell_type": "code", "execution_count": 53, "metadata": {}, "outputs": [ { "data": { "text/html": [ "<html><script type=\"math/tex; mode=display\">\\newcommand{\\Bold}[1]{\\mathbf{#1}}7.061703537890657</script></html>" ], "text/latex": [ "$$\\newcommand{\\Bold}[1]{\\mathbf{#1}}7.061703537890657$$" ], "text/plain": [ "7.061703537890657" ] }, "execution_count": 53, "metadata": {}, "output_type": "execute_result" } ], "source": [ "K0.norm('frob')" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Verification of the closed-loop eigenvalues (over the rational field)" ] }, { "cell_type": "code", "execution_count": 54, "metadata": {}, "outputs": [ { "data": { "text/html": [ "<html><script type=\"math/tex; mode=display\">\\newcommand{\\Bold}[1]{\\mathbf{#1}}\\left[-4.000000000000001?, -3.000000000000001?, -1.930622507449263?, -0.9874187533371403?\\right]</script></html>" ], "text/latex": [ "$$\\newcommand{\\Bold}[1]{\\mathbf{#1}}\\left[-4.000000000000001?, -3.000000000000001?, -1.930622507449263?, -0.9874187533371403?\\right]$$" ], "text/plain": [ "[-4.000000000000001?, -3.000000000000001?, -1.930622507449263?, -0.9874187533371403?]" ] }, "execution_count": 54, "metadata": {}, "output_type": "execute_result" } ], "source": [ "A0 = matrix(QQ,A-B*K0*C)\n", "A0.eigenvalues()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Verification of the closed-loop eigenvalues (as floating point numbers)" ] }, { "cell_type": "code", "execution_count": 55, "metadata": {}, "outputs": [ { "data": { "text/html": [ "<html><script type=\"math/tex; mode=display\">\\newcommand{\\Bold}[1]{\\mathbf{#1}}\\left[-4.0000000000000036, -0.9874187533371406, -3.0, -1.9306225074492622\\right]</script></html>" ], "text/latex": [ "$$\\newcommand{\\Bold}[1]{\\mathbf{#1}}\\left[-4.0000000000000036, -0.9874187533371406, -3.0, -1.9306225074492622\\right]$$" ], "text/plain": [ "[-4.0000000000000036, -0.9874187533371406, -3.0, -1.9306225074492622]" ] }, "execution_count": 55, "metadata": {}, "output_type": "execute_result" } ], "source": [ "A0 = matrix(RDF,A-B*K0*C)\n", "A0.eigenvalues()" ] } ], "metadata": { "kernelspec": { "display_name": "SageMath 9.3", "language": "sage", "name": "sagemath" }, "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.9.6" } }, "nbformat": 4, "nbformat_minor": 4 }