{
 "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
}