{
 "cells": [
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# Example 1: Minimum Frobenius Norm Static Output Feedback"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "The example system has been taken from \\[1, Example 1\\]. The eigenvalue placement with minimum Frobenium norm is discussed in \\[2, Example 1\\]. The poles should be placed at -1, -2, -3, i.e., we want to have distinct real eigenvalues.\n",
    "\n",
    "1. Guney, S.; Atasoy, A. (2011). *An approach to pole placement method with output feedback*.\n",
    "In UKACC Control Conference, URL: https://www.researchgate.net/publication/267424630_An_Approach_to_Pole_Placement_Method_with_Output_Feedback\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": 19,
   "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}, l_{3}, 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}, l_{3}, q]$$"
      ],
      "text/plain": [
       "Multivariate Polynomial Ring in k11, k12, k21, k22, s, l0, l1, l2, l3, q over Rational Field"
      ]
     },
     "execution_count": 19,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "%display latex\n",
    "R.<k11,k12,k21,k22,s,l0,l1,l2,l3,q> = PolynomialRing(QQ, order='lex')\n",
    "R"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "State space system"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 20,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<html><script type=\"math/tex; mode=display\">\\newcommand{\\Bold}[1]{\\mathbf{#1}}\\left(\\left(\\begin{array}{rrr}\n",
       "-\\frac{57}{5} & -\\frac{7}{2} & 0 \\\\\n",
       "4 & 0 & 0 \\\\\n",
       "0 & 1 & 0\n",
       "\\end{array}\\right), \\left(\\begin{array}{rr}\n",
       "2 & 1 \\\\\n",
       "0 & -1 \\\\\n",
       "0 & 0\n",
       "\\end{array}\\right), \\left(\\begin{array}{rrr}\n",
       "1 & 0 & \\frac{57}{40} \\\\\n",
       "1 & -1 & 0\n",
       "\\end{array}\\right)\\right)</script></html>"
      ],
      "text/latex": [
       "$$\\newcommand{\\Bold}[1]{\\mathbf{#1}}\\left(\\left(\\begin{array}{rrr}\n",
       "-\\frac{57}{5} & -\\frac{7}{2} & 0 \\\\\n",
       "4 & 0 & 0 \\\\\n",
       "0 & 1 & 0\n",
       "\\end{array}\\right), \\left(\\begin{array}{rr}\n",
       "2 & 1 \\\\\n",
       "0 & -1 \\\\\n",
       "0 & 0\n",
       "\\end{array}\\right), \\left(\\begin{array}{rrr}\n",
       "1 & 0 & \\frac{57}{40} \\\\\n",
       "1 & -1 & 0\n",
       "\\end{array}\\right)\\right)$$"
      ],
      "text/plain": [
       "(\n",
       "[-57/5  -7/2     0]  [ 2  1]                     \n",
       "[    4     0     0]  [ 0 -1]  [    1     0 57/40]\n",
       "[    0     1     0], [ 0  0], [    1    -1     0]\n",
       ")"
      ]
     },
     "execution_count": 20,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "A = matrix(R,[[-11.4, -3.5, 0],[4, 0, 0],[0, 1, 0]])\n",
    "B = matrix(R,[[2,1],[0,-1],[0,0]])\n",
    "C = matrix(R,[[1,0,1.425],[1,-1,0]])\n",
    "(A,B,C)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Symbolic feedback matrix"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 21,
   "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": 21,
     "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": 22,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<html><script type=\"math/tex; mode=display\">\\newcommand{\\Bold}[1]{\\mathbf{#1}}-2 k_{12} k_{21} s + 2 k_{11} k_{22} s + 2 k_{11} s^{2} + 2 k_{12} s^{2} + k_{21} s^{2} + 2 k_{22} s^{2} + s^{3} - \\frac{57}{20} k_{12} k_{21} + \\frac{57}{20} k_{11} k_{22} - 8 k_{12} s + \\frac{83}{40} k_{21} s + \\frac{109}{10} k_{22} s + \\frac{57}{5} s^{2} + \\frac{57}{5} k_{11} - \\frac{2109}{200} k_{21} + 14 s</script></html>"
      ],
      "text/latex": [
       "$$\\newcommand{\\Bold}[1]{\\mathbf{#1}}-2 k_{12} k_{21} s + 2 k_{11} k_{22} s + 2 k_{11} s^{2} + 2 k_{12} s^{2} + k_{21} s^{2} + 2 k_{22} s^{2} + s^{3} - \\frac{57}{20} k_{12} k_{21} + \\frac{57}{20} k_{11} k_{22} - 8 k_{12} s + \\frac{83}{40} k_{21} s + \\frac{109}{10} k_{22} s + \\frac{57}{5} s^{2} + \\frac{57}{5} k_{11} - \\frac{2109}{200} k_{21} + 14 s$$"
      ],
      "text/plain": [
       "-2*k12*k21*s + 2*k11*k22*s + 2*k11*s^2 + 2*k12*s^2 + k21*s^2 + 2*k22*s^2 + s^3 - 57/20*k12*k21 + 57/20*k11*k22 - 8*k12*s + 83/40*k21*s + 109/10*k22*s + 57/5*s^2 + 57/5*k11 - 2109/200*k21 + 14*s"
      ]
     },
     "execution_count": 22,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "CP = det(s*matrix.identity(3)-(A-B*K*C))\n",
    "CP"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Remainders of polynomial division for an eigenvalue placement at -1, -2, -3"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 23,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<html><script type=\"math/tex; mode=display\">\\newcommand{\\Bold}[1]{\\mathbf{#1}}\\left(-\\frac{17}{20} k_{12} k_{21} + \\frac{17}{20} k_{11} k_{22} + \\frac{67}{5} k_{11} + 10 k_{12} - \\frac{581}{50} k_{21} - \\frac{89}{10} k_{22} - \\frac{18}{5}, -2 k_{12} k_{21} + 2 k_{11} k_{22} - 6 k_{11} - 14 k_{12} - \\frac{37}{40} k_{21} + \\frac{49}{10} k_{22} - \\frac{66}{5}, 2 k_{11} + 2 k_{12} + k_{21} + 2 k_{22} + \\frac{27}{5}\\right)</script></html>"
      ],
      "text/latex": [
       "$$\\newcommand{\\Bold}[1]{\\mathbf{#1}}\\left(-\\frac{17}{20} k_{12} k_{21} + \\frac{17}{20} k_{11} k_{22} + \\frac{67}{5} k_{11} + 10 k_{12} - \\frac{581}{50} k_{21} - \\frac{89}{10} k_{22} - \\frac{18}{5}, -2 k_{12} k_{21} + 2 k_{11} k_{22} - 6 k_{11} - 14 k_{12} - \\frac{37}{40} k_{21} + \\frac{49}{10} k_{22} - \\frac{66}{5}, 2 k_{11} + 2 k_{12} + k_{21} + 2 k_{22} + \\frac{27}{5}\\right)$$"
      ],
      "text/plain": [
       "(-17/20*k12*k21 + 17/20*k11*k22 + 67/5*k11 + 10*k12 - 581/50*k21 - 89/10*k22 - 18/5,\n",
       " -2*k12*k21 + 2*k11*k22 - 6*k11 - 14*k12 - 37/40*k21 + 49/10*k22 - 66/5,\n",
       " 2*k11 + 2*k12 + k21 + 2*k22 + 27/5)"
      ]
     },
     "execution_count": 23,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "q1,r1 = CP.quo_rem(s+1)\n",
    "q2,r2 = q1.quo_rem(s+2)\n",
    "q3,r3 = q2.quo_rem(s+3)\n",
    "r1,r2,r3"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Lagrangian function"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 24,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<html><script type=\"math/tex; mode=display\">\\newcommand{\\Bold}[1]{\\mathbf{#1}}k_{11}^{2} l_{0} + \\frac{17}{20} k_{11} k_{22} l_{1} + 2 k_{11} k_{22} l_{2} + \\frac{67}{5} k_{11} l_{1} - 6 k_{11} l_{2} + 2 k_{11} l_{3} + k_{12}^{2} l_{0} - \\frac{17}{20} k_{12} k_{21} l_{1} - 2 k_{12} k_{21} l_{2} + 10 k_{12} l_{1} - 14 k_{12} l_{2} + 2 k_{12} l_{3} + k_{21}^{2} l_{0} - \\frac{581}{50} k_{21} l_{1} - \\frac{37}{40} k_{21} l_{2} + k_{21} l_{3} + k_{22}^{2} l_{0} - \\frac{89}{10} k_{22} l_{1} + \\frac{49}{10} k_{22} l_{2} + 2 k_{22} l_{3} - l_{0} q - \\frac{18}{5} l_{1} - \\frac{66}{5} l_{2} + \\frac{27}{5} l_{3} + q</script></html>"
      ],
      "text/latex": [
       "$$\\newcommand{\\Bold}[1]{\\mathbf{#1}}k_{11}^{2} l_{0} + \\frac{17}{20} k_{11} k_{22} l_{1} + 2 k_{11} k_{22} l_{2} + \\frac{67}{5} k_{11} l_{1} - 6 k_{11} l_{2} + 2 k_{11} l_{3} + k_{12}^{2} l_{0} - \\frac{17}{20} k_{12} k_{21} l_{1} - 2 k_{12} k_{21} l_{2} + 10 k_{12} l_{1} - 14 k_{12} l_{2} + 2 k_{12} l_{3} + k_{21}^{2} l_{0} - \\frac{581}{50} k_{21} l_{1} - \\frac{37}{40} k_{21} l_{2} + k_{21} l_{3} + k_{22}^{2} l_{0} - \\frac{89}{10} k_{22} l_{1} + \\frac{49}{10} k_{22} l_{2} + 2 k_{22} l_{3} - l_{0} q - \\frac{18}{5} l_{1} - \\frac{66}{5} l_{2} + \\frac{27}{5} l_{3} + q$$"
      ],
      "text/plain": [
       "k11^2*l0 + 17/20*k11*k22*l1 + 2*k11*k22*l2 + 67/5*k11*l1 - 6*k11*l2 + 2*k11*l3 + k12^2*l0 - 17/20*k12*k21*l1 - 2*k12*k21*l2 + 10*k12*l1 - 14*k12*l2 + 2*k12*l3 + k21^2*l0 - 581/50*k21*l1 - 37/40*k21*l2 + k21*l3 + k22^2*l0 - 89/10*k22*l1 + 49/10*k22*l2 + 2*k22*l3 - l0*q - 18/5*l1 - 66/5*l2 + 27/5*l3 + q"
      ]
     },
     "execution_count": 24,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "L = q + l0*(k11^2+k12^2+k21^2+k22^2-q) + l1*r1 + l2*r2 + l3*r3\n",
    "L"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Neccessary optimility condition and associated polynomial ideal"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 25,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "0  :  k11  :  2*k11*l0 + 17/20*k22*l1 + 2*k22*l2 + 67/5*l1 - 6*l2 + 2*l3\n",
      "1  :  k12  :  2*k12*l0 - 17/20*k21*l1 - 2*k21*l2 + 10*l1 - 14*l2 + 2*l3\n",
      "2  :  k21  :  -17/20*k12*l1 - 2*k12*l2 + 2*k21*l0 - 581/50*l1 - 37/40*l2 + l3\n",
      "3  :  k22  :  17/20*k11*l1 + 2*k11*l2 + 2*k22*l0 - 89/10*l1 + 49/10*l2 + 2*l3\n",
      "4  :  l0  :  k11^2 + k12^2 + k21^2 + k22^2 - q\n",
      "5  :  l1  :  17/20*k11*k22 + 67/5*k11 - 17/20*k12*k21 + 10*k12 - 581/50*k21 - 89/10*k22 - 18/5\n",
      "6  :  l2  :  2*k11*k22 - 6*k11 - 2*k12*k21 - 14*k12 - 37/40*k21 + 49/10*k22 - 66/5\n",
      "7  :  l3  :  2*k11 + 2*k12 + k21 + 2*k22 + 27/5\n",
      "8  :  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} + \\frac{17}{20} k_{22} l_{1} + 2 k_{22} l_{2} + \\frac{67}{5} l_{1} - 6 l_{2} + 2 l_{3}, 2 k_{12} l_{0} - \\frac{17}{20} k_{21} l_{1} - 2 k_{21} l_{2} + 10 l_{1} - 14 l_{2} + 2 l_{3}, -\\frac{17}{20} k_{12} l_{1} - 2 k_{12} l_{2} + 2 k_{21} l_{0} - \\frac{581}{50} l_{1} - \\frac{37}{40} l_{2} + l_{3}, \\frac{17}{20} k_{11} l_{1} + 2 k_{11} l_{2} + 2 k_{22} l_{0} - \\frac{89}{10} l_{1} + \\frac{49}{10} l_{2} + 2 l_{3}, k_{11}^{2} + k_{12}^{2} + k_{21}^{2} + k_{22}^{2} - q, \\frac{17}{20} k_{11} k_{22} + \\frac{67}{5} k_{11} - \\frac{17}{20} k_{12} k_{21} + 10 k_{12} - \\frac{581}{50} k_{21} - \\frac{89}{10} k_{22} - \\frac{18}{5}, 2 k_{11} k_{22} - 6 k_{11} - 2 k_{12} k_{21} - 14 k_{12} - \\frac{37}{40} k_{21} + \\frac{49}{10} k_{22} - \\frac{66}{5}, 2 k_{11} + 2 k_{12} + k_{21} + 2 k_{22} + \\frac{27}{5}, -l_{0} + 1\\right)\\Bold{Q}[k_{11}, k_{12}, k_{21}, k_{22}, s, l_{0}, l_{1}, l_{2}, l_{3}, q]</script></html>"
      ],
      "text/latex": [
       "$$\\newcommand{\\Bold}[1]{\\mathbf{#1}}\\left(2 k_{11} l_{0} + \\frac{17}{20} k_{22} l_{1} + 2 k_{22} l_{2} + \\frac{67}{5} l_{1} - 6 l_{2} + 2 l_{3}, 2 k_{12} l_{0} - \\frac{17}{20} k_{21} l_{1} - 2 k_{21} l_{2} + 10 l_{1} - 14 l_{2} + 2 l_{3}, -\\frac{17}{20} k_{12} l_{1} - 2 k_{12} l_{2} + 2 k_{21} l_{0} - \\frac{581}{50} l_{1} - \\frac{37}{40} l_{2} + l_{3}, \\frac{17}{20} k_{11} l_{1} + 2 k_{11} l_{2} + 2 k_{22} l_{0} - \\frac{89}{10} l_{1} + \\frac{49}{10} l_{2} + 2 l_{3}, k_{11}^{2} + k_{12}^{2} + k_{21}^{2} + k_{22}^{2} - q, \\frac{17}{20} k_{11} k_{22} + \\frac{67}{5} k_{11} - \\frac{17}{20} k_{12} k_{21} + 10 k_{12} - \\frac{581}{50} k_{21} - \\frac{89}{10} k_{22} - \\frac{18}{5}, 2 k_{11} k_{22} - 6 k_{11} - 2 k_{12} k_{21} - 14 k_{12} - \\frac{37}{40} k_{21} + \\frac{49}{10} k_{22} - \\frac{66}{5}, 2 k_{11} + 2 k_{12} + k_{21} + 2 k_{22} + \\frac{27}{5}, -l_{0} + 1\\right)\\Bold{Q}[k_{11}, k_{12}, k_{21}, k_{22}, s, l_{0}, l_{1}, l_{2}, l_{3}, q]$$"
      ],
      "text/plain": [
       "Ideal (2*k11*l0 + 17/20*k22*l1 + 2*k22*l2 + 67/5*l1 - 6*l2 + 2*l3, 2*k12*l0 - 17/20*k21*l1 - 2*k21*l2 + 10*l1 - 14*l2 + 2*l3, -17/20*k12*l1 - 2*k12*l2 + 2*k21*l0 - 581/50*l1 - 37/40*l2 + l3, 17/20*k11*l1 + 2*k11*l2 + 2*k22*l0 - 89/10*l1 + 49/10*l2 + 2*l3, k11^2 + k12^2 + k21^2 + k22^2 - q, 17/20*k11*k22 + 67/5*k11 - 17/20*k12*k21 + 10*k12 - 581/50*k21 - 89/10*k22 - 18/5, 2*k11*k22 - 6*k11 - 2*k12*k21 - 14*k12 - 37/40*k21 + 49/10*k22 - 66/5, 2*k11 + 2*k12 + k21 + 2*k22 + 27/5, -l0 + 1) of Multivariate Polynomial Ring in k11, k12, k21, k22, s, l0, l1, l2, l3, q over Rational Field"
      ]
     },
     "execution_count": 25,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "vars = [k11,k12,k21,k22,l0,l1,l2,l3,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": [
    "Elimination ideal"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 26,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<html><script type=\"math/tex; mode=display\">\\newcommand{\\Bold}[1]{\\mathbf{#1}}\\left(82230276339214102137754000000000 q^{4} - 16573151331396038867639067132000000 q^{3} + 2096519019934073899613493346851250000 q^{2} - 290174420184422803500902782422838853400 q + 926701100980361302638540549730477878569\\right)\\Bold{Q}[k_{11}, k_{12}, k_{21}, k_{22}, s, l_{0}, l_{1}, l_{2}, l_{3}, q]</script></html>"
      ],
      "text/latex": [
       "$$\\newcommand{\\Bold}[1]{\\mathbf{#1}}\\left(82230276339214102137754000000000 q^{4} - 16573151331396038867639067132000000 q^{3} + 2096519019934073899613493346851250000 q^{2} - 290174420184422803500902782422838853400 q + 926701100980361302638540549730477878569\\right)\\Bold{Q}[k_{11}, k_{12}, k_{21}, k_{22}, s, l_{0}, l_{1}, l_{2}, l_{3}, q]$$"
      ],
      "text/plain": [
       "Ideal (82230276339214102137754000000000*q^4 - 16573151331396038867639067132000000*q^3 + 2096519019934073899613493346851250000*q^2 - 290174420184422803500902782422838853400*q + 926701100980361302638540549730477878569) of Multivariate Polynomial Ring in k11, k12, k21, k22, s, l0, l1, l2, l3, q over Rational Field"
      ]
     },
     "execution_count": 26,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "J0 = I.elimination_ideal([k11,k12,k21,k22,l0,l1,l2,l3])\n",
    "J0"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Computation of possible solutions w.r.t. q"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 27,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<html><script type=\"math/tex; mode=display\">\\newcommand{\\Bold}[1]{\\mathbf{#1}}\\left[\\left(3.26883937657574, 1\\right), \\left(170.916064276310, 1\\right)\\right]</script></html>"
      ],
      "text/latex": [
       "$$\\newcommand{\\Bold}[1]{\\mathbf{#1}}\\left[\\left(3.26883937657574, 1\\right), \\left(170.916064276310, 1\\right)\\right]$$"
      ],
      "text/plain": [
       "[(3.26883937657574, 1), (170.916064276310, 1)]"
      ]
     },
     "execution_count": 27,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "J0.change_ring(PolynomialRing(RR, 'q')).gens()[0].roots()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Selection of the minimum solution q"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 28,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<html><script type=\"math/tex; mode=display\">\\newcommand{\\Bold}[1]{\\mathbf{#1}}3.26883937657574</script></html>"
      ],
      "text/latex": [
       "$$\\newcommand{\\Bold}[1]{\\mathbf{#1}}3.26883937657574$$"
      ],
      "text/plain": [
       "3.26883937657574"
      ]
     },
     "execution_count": 28,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "qmin = J0.change_ring(PolynomialRing(RR, 'q')).gens()[0].roots()[0][0]\n",
    "qmin"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Dimension of the polynomial ideal"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 29,
   "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": 29,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "I.dimension()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "For the direct computation of the algebraic variety, we need a 0-dimensional ideal. To achieve this, we omit the variable s"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 30,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<html><script type=\"math/tex; mode=display\">\\newcommand{\\Bold}[1]{\\mathbf{#1}}\\left[\\verb|{q:|\\phantom{\\verb!x!}\\verb|3.268839376575746?,|\\phantom{\\verb!x!}\\verb|l3:|\\phantom{\\verb!x!}\\verb|0.4268284555997831?,|\\phantom{\\verb!x!}\\verb|l2:|\\phantom{\\verb!x!}\\verb|-0.3375305868756624?,|\\phantom{\\verb!x!}\\verb|l1:|\\phantom{\\verb!x!}\\verb|-0.2229755726084477?,|\\phantom{\\verb!x!}\\verb|l0:|\\phantom{\\verb!x!}\\verb|1,|\\phantom{\\verb!x!}\\verb|k22:|\\phantom{\\verb!x!}\\verb|-0.6992229440461313?,|\\phantom{\\verb!x!}\\verb|k21:|\\phantom{\\verb!x!}\\verb|-1.157344168706315?,|\\phantom{\\verb!x!}\\verb|k12:|\\phantom{\\verb!x!}\\verb|-1.174350365749620?,|\\phantom{\\verb!x!}\\verb|k11:|\\phantom{\\verb!x!}\\verb|-0.2477546058510917?}|, \\verb|{q:|\\phantom{\\verb!x!}\\verb|170.9160642763102?,|\\phantom{\\verb!x!}\\verb|l3:|\\phantom{\\verb!x!}\\verb|-25.89323591709195?,|\\phantom{\\verb!x!}\\verb|l2:|\\phantom{\\verb!x!}\\verb|7.090078463322560?,|\\phantom{\\verb!x!}\\verb|l1:|\\phantom{\\verb!x!}\\verb|0.3079126349941297?,|\\phantom{\\verb!x!}\\verb|l0:|\\phantom{\\verb!x!}\\verb|1,|\\phantom{\\verb!x!}\\verb|k22:|\\phantom{\\verb!x!}\\verb|6.174475682394953?,|\\phantom{\\verb!x!}\\verb|k21:|\\phantom{\\verb!x!}\\verb|-10.798376008389913?,|\\phantom{\\verb!x!}\\verb|k12:|\\phantom{\\verb!x!}\\verb|-3.990217664985441?,|\\phantom{\\verb!x!}\\verb|k11:|\\phantom{\\verb!x!}\\verb|0.5149299867854444?}|, \\verb|{q:|\\phantom{\\verb!x!}\\verb|13.68035394055291?|\\phantom{\\verb!x!}\\verb|-|\\phantom{\\verb!x!}\\verb|141.3649013768673?*I,|\\phantom{\\verb!x!}\\verb|l3:|\\phantom{\\verb!x!}\\verb|-38.02263838715278?|\\phantom{\\verb!x!}\\verb|+|\\phantom{\\verb!x!}\\verb|28.09491245948313?*I,|\\phantom{\\verb!x!}\\verb|l2:|\\phantom{\\verb!x!}\\verb|-16.37028291228165?|\\phantom{\\verb!x!}\\verb|-|\\phantom{\\verb!x!}\\verb|7.040331241381002?*I,|\\phantom{\\verb!x!}\\verb|l1:|\\phantom{\\verb!x!}\\verb|9.69553140531921?|\\phantom{\\verb!x!}\\verb|-|\\phantom{\\verb!x!}\\verb|6.198863621543925?*I,|\\phantom{\\verb!x!}\\verb|l0:|\\phantom{\\verb!x!}\\verb|1,|\\phantom{\\verb!x!}\\verb|k22:|\\phantom{\\verb!x!}\\verb|4.161920215448037?|\\phantom{\\verb!x!}\\verb|-|\\phantom{\\verb!x!}\\verb|2.131263818093075?*I,|\\phantom{\\verb!x!}\\verb|k21:|\\phantom{\\verb!x!}\\verb|-7.975570937866967?|\\phantom{\\verb!x!}\\verb|+|\\phantom{\\verb!x!}\\verb|2.989305095507171?*I,|\\phantom{\\verb!x!}\\verb|k12:|\\phantom{\\verb!x!}\\verb|1.572282513745333?|\\phantom{\\verb!x!}\\verb|-|\\phantom{\\verb!x!}\\verb|5.838511282216107?*I,|\\phantom{\\verb!x!}\\verb|k11:|\\phantom{\\verb!x!}\\verb|-4.446417260259886?|\\phantom{\\verb!x!}\\verb|+|\\phantom{\\verb!x!}\\verb|6.475122552555597?*I}|, \\verb|{q:|\\phantom{\\verb!x!}\\verb|13.68035394055291?|\\phantom{\\verb!x!}\\verb|+|\\phantom{\\verb!x!}\\verb|141.3649013768673?*I,|\\phantom{\\verb!x!}\\verb|l3:|\\phantom{\\verb!x!}\\verb|-38.02263838715278?|\\phantom{\\verb!x!}\\verb|-|\\phantom{\\verb!x!}\\verb|28.09491245948313?*I,|\\phantom{\\verb!x!}\\verb|l2:|\\phantom{\\verb!x!}\\verb|-16.37028291228165?|\\phantom{\\verb!x!}\\verb|+|\\phantom{\\verb!x!}\\verb|7.040331241381002?*I,|\\phantom{\\verb!x!}\\verb|l1:|\\phantom{\\verb!x!}\\verb|9.69553140531921?|\\phantom{\\verb!x!}\\verb|+|\\phantom{\\verb!x!}\\verb|6.198863621543925?*I,|\\phantom{\\verb!x!}\\verb|l0:|\\phantom{\\verb!x!}\\verb|1,|\\phantom{\\verb!x!}\\verb|k22:|\\phantom{\\verb!x!}\\verb|4.161920215448037?|\\phantom{\\verb!x!}\\verb|+|\\phantom{\\verb!x!}\\verb|2.131263818093075?*I,|\\phantom{\\verb!x!}\\verb|k21:|\\phantom{\\verb!x!}\\verb|-7.975570937866967?|\\phantom{\\verb!x!}\\verb|-|\\phantom{\\verb!x!}\\verb|2.989305095507171?*I,|\\phantom{\\verb!x!}\\verb|k12:|\\phantom{\\verb!x!}\\verb|1.572282513745333?|\\phantom{\\verb!x!}\\verb|+|\\phantom{\\verb!x!}\\verb|5.838511282216107?*I,|\\phantom{\\verb!x!}\\verb|k11:|\\phantom{\\verb!x!}\\verb|-4.446417260259886?|\\phantom{\\verb!x!}\\verb|-|\\phantom{\\verb!x!}\\verb|6.475122552555597?*I}|\\right]</script></html>"
      ],
      "text/latex": [
       "$$\\newcommand{\\Bold}[1]{\\mathbf{#1}}\\left[\\verb|{q:|\\phantom{\\verb!x!}\\verb|3.268839376575746?,|\\phantom{\\verb!x!}\\verb|l3:|\\phantom{\\verb!x!}\\verb|0.4268284555997831?,|\\phantom{\\verb!x!}\\verb|l2:|\\phantom{\\verb!x!}\\verb|-0.3375305868756624?,|\\phantom{\\verb!x!}\\verb|l1:|\\phantom{\\verb!x!}\\verb|-0.2229755726084477?,|\\phantom{\\verb!x!}\\verb|l0:|\\phantom{\\verb!x!}\\verb|1,|\\phantom{\\verb!x!}\\verb|k22:|\\phantom{\\verb!x!}\\verb|-0.6992229440461313?,|\\phantom{\\verb!x!}\\verb|k21:|\\phantom{\\verb!x!}\\verb|-1.157344168706315?,|\\phantom{\\verb!x!}\\verb|k12:|\\phantom{\\verb!x!}\\verb|-1.174350365749620?,|\\phantom{\\verb!x!}\\verb|k11:|\\phantom{\\verb!x!}\\verb|-0.2477546058510917?}|, \\verb|{q:|\\phantom{\\verb!x!}\\verb|170.9160642763102?,|\\phantom{\\verb!x!}\\verb|l3:|\\phantom{\\verb!x!}\\verb|-25.89323591709195?,|\\phantom{\\verb!x!}\\verb|l2:|\\phantom{\\verb!x!}\\verb|7.090078463322560?,|\\phantom{\\verb!x!}\\verb|l1:|\\phantom{\\verb!x!}\\verb|0.3079126349941297?,|\\phantom{\\verb!x!}\\verb|l0:|\\phantom{\\verb!x!}\\verb|1,|\\phantom{\\verb!x!}\\verb|k22:|\\phantom{\\verb!x!}\\verb|6.174475682394953?,|\\phantom{\\verb!x!}\\verb|k21:|\\phantom{\\verb!x!}\\verb|-10.798376008389913?,|\\phantom{\\verb!x!}\\verb|k12:|\\phantom{\\verb!x!}\\verb|-3.990217664985441?,|\\phantom{\\verb!x!}\\verb|k11:|\\phantom{\\verb!x!}\\verb|0.5149299867854444?}|, \\verb|{q:|\\phantom{\\verb!x!}\\verb|13.68035394055291?|\\phantom{\\verb!x!}\\verb|-|\\phantom{\\verb!x!}\\verb|141.3649013768673?*I,|\\phantom{\\verb!x!}\\verb|l3:|\\phantom{\\verb!x!}\\verb|-38.02263838715278?|\\phantom{\\verb!x!}\\verb|+|\\phantom{\\verb!x!}\\verb|28.09491245948313?*I,|\\phantom{\\verb!x!}\\verb|l2:|\\phantom{\\verb!x!}\\verb|-16.37028291228165?|\\phantom{\\verb!x!}\\verb|-|\\phantom{\\verb!x!}\\verb|7.040331241381002?*I,|\\phantom{\\verb!x!}\\verb|l1:|\\phantom{\\verb!x!}\\verb|9.69553140531921?|\\phantom{\\verb!x!}\\verb|-|\\phantom{\\verb!x!}\\verb|6.198863621543925?*I,|\\phantom{\\verb!x!}\\verb|l0:|\\phantom{\\verb!x!}\\verb|1,|\\phantom{\\verb!x!}\\verb|k22:|\\phantom{\\verb!x!}\\verb|4.161920215448037?|\\phantom{\\verb!x!}\\verb|-|\\phantom{\\verb!x!}\\verb|2.131263818093075?*I,|\\phantom{\\verb!x!}\\verb|k21:|\\phantom{\\verb!x!}\\verb|-7.975570937866967?|\\phantom{\\verb!x!}\\verb|+|\\phantom{\\verb!x!}\\verb|2.989305095507171?*I,|\\phantom{\\verb!x!}\\verb|k12:|\\phantom{\\verb!x!}\\verb|1.572282513745333?|\\phantom{\\verb!x!}\\verb|-|\\phantom{\\verb!x!}\\verb|5.838511282216107?*I,|\\phantom{\\verb!x!}\\verb|k11:|\\phantom{\\verb!x!}\\verb|-4.446417260259886?|\\phantom{\\verb!x!}\\verb|+|\\phantom{\\verb!x!}\\verb|6.475122552555597?*I}|, \\verb|{q:|\\phantom{\\verb!x!}\\verb|13.68035394055291?|\\phantom{\\verb!x!}\\verb|+|\\phantom{\\verb!x!}\\verb|141.3649013768673?*I,|\\phantom{\\verb!x!}\\verb|l3:|\\phantom{\\verb!x!}\\verb|-38.02263838715278?|\\phantom{\\verb!x!}\\verb|-|\\phantom{\\verb!x!}\\verb|28.09491245948313?*I,|\\phantom{\\verb!x!}\\verb|l2:|\\phantom{\\verb!x!}\\verb|-16.37028291228165?|\\phantom{\\verb!x!}\\verb|+|\\phantom{\\verb!x!}\\verb|7.040331241381002?*I,|\\phantom{\\verb!x!}\\verb|l1:|\\phantom{\\verb!x!}\\verb|9.69553140531921?|\\phantom{\\verb!x!}\\verb|+|\\phantom{\\verb!x!}\\verb|6.198863621543925?*I,|\\phantom{\\verb!x!}\\verb|l0:|\\phantom{\\verb!x!}\\verb|1,|\\phantom{\\verb!x!}\\verb|k22:|\\phantom{\\verb!x!}\\verb|4.161920215448037?|\\phantom{\\verb!x!}\\verb|+|\\phantom{\\verb!x!}\\verb|2.131263818093075?*I,|\\phantom{\\verb!x!}\\verb|k21:|\\phantom{\\verb!x!}\\verb|-7.975570937866967?|\\phantom{\\verb!x!}\\verb|-|\\phantom{\\verb!x!}\\verb|2.989305095507171?*I,|\\phantom{\\verb!x!}\\verb|k12:|\\phantom{\\verb!x!}\\verb|1.572282513745333?|\\phantom{\\verb!x!}\\verb|+|\\phantom{\\verb!x!}\\verb|5.838511282216107?*I,|\\phantom{\\verb!x!}\\verb|k11:|\\phantom{\\verb!x!}\\verb|-4.446417260259886?|\\phantom{\\verb!x!}\\verb|-|\\phantom{\\verb!x!}\\verb|6.475122552555597?*I}|\\right]$$"
      ],
      "text/plain": [
       "[{q: 3.268839376575746?, l3: 0.4268284555997831?, l2: -0.3375305868756624?, l1: -0.2229755726084477?, l0: 1, k22: -0.6992229440461313?, k21: -1.157344168706315?, k12: -1.174350365749620?, k11: -0.2477546058510917?},\n",
       " {q: 170.9160642763102?, l3: -25.89323591709195?, l2: 7.090078463322560?, l1: 0.3079126349941297?, l0: 1, k22: 6.174475682394953?, k21: -10.798376008389913?, k12: -3.990217664985441?, k11: 0.5149299867854444?},\n",
       " {q: 13.68035394055291? - 141.3649013768673?*I, l3: -38.02263838715278? + 28.09491245948313?*I, l2: -16.37028291228165? - 7.040331241381002?*I, l1: 9.69553140531921? - 6.198863621543925?*I, l0: 1, k22: 4.161920215448037? - 2.131263818093075?*I, k21: -7.975570937866967? + 2.989305095507171?*I, k12: 1.572282513745333? - 5.838511282216107?*I, k11: -4.446417260259886? + 6.475122552555597?*I},\n",
       " {q: 13.68035394055291? + 141.3649013768673?*I, l3: -38.02263838715278? - 28.09491245948313?*I, l2: -16.37028291228165? + 7.040331241381002?*I, l1: 9.69553140531921? + 6.198863621543925?*I, l0: 1, k22: 4.161920215448037? + 2.131263818093075?*I, k21: -7.975570937866967? - 2.989305095507171?*I, k12: 1.572282513745333? + 5.838511282216107?*I, k11: -4.446417260259886? - 6.475122552555597?*I}]"
      ]
     },
     "execution_count": 30,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "I0 = I.change_ring(PolynomialRing(QQ,'k11,k12,k21,k22,l0,l1,l2,l3,q'))\n",
    "sol = I0.variety(QQbar)\n",
    "sol"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Selection of the solution to be used"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 31,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<html><script type=\"math/tex; mode=display\">\\newcommand{\\Bold}[1]{\\mathbf{#1}}\\verb|{q:|\\phantom{\\verb!x!}\\verb|3.268839376575746?,|\\phantom{\\verb!x!}\\verb|l3:|\\phantom{\\verb!x!}\\verb|0.4268284555997831?,|\\phantom{\\verb!x!}\\verb|l2:|\\phantom{\\verb!x!}\\verb|-0.3375305868756624?,|\\phantom{\\verb!x!}\\verb|l1:|\\phantom{\\verb!x!}\\verb|-0.2229755726084477?,|\\phantom{\\verb!x!}\\verb|l0:|\\phantom{\\verb!x!}\\verb|1,|\\phantom{\\verb!x!}\\verb|k22:|\\phantom{\\verb!x!}\\verb|-0.6992229440461313?,|\\phantom{\\verb!x!}\\verb|k21:|\\phantom{\\verb!x!}\\verb|-1.157344168706315?,|\\phantom{\\verb!x!}\\verb|k12:|\\phantom{\\verb!x!}\\verb|-1.174350365749620?,|\\phantom{\\verb!x!}\\verb|k11:|\\phantom{\\verb!x!}\\verb|-0.2477546058510917?}|</script></html>"
      ],
      "text/latex": [
       "$$\\newcommand{\\Bold}[1]{\\mathbf{#1}}\\verb|{q:|\\phantom{\\verb!x!}\\verb|3.268839376575746?,|\\phantom{\\verb!x!}\\verb|l3:|\\phantom{\\verb!x!}\\verb|0.4268284555997831?,|\\phantom{\\verb!x!}\\verb|l2:|\\phantom{\\verb!x!}\\verb|-0.3375305868756624?,|\\phantom{\\verb!x!}\\verb|l1:|\\phantom{\\verb!x!}\\verb|-0.2229755726084477?,|\\phantom{\\verb!x!}\\verb|l0:|\\phantom{\\verb!x!}\\verb|1,|\\phantom{\\verb!x!}\\verb|k22:|\\phantom{\\verb!x!}\\verb|-0.6992229440461313?,|\\phantom{\\verb!x!}\\verb|k21:|\\phantom{\\verb!x!}\\verb|-1.157344168706315?,|\\phantom{\\verb!x!}\\verb|k12:|\\phantom{\\verb!x!}\\verb|-1.174350365749620?,|\\phantom{\\verb!x!}\\verb|k11:|\\phantom{\\verb!x!}\\verb|-0.2477546058510917?}|$$"
      ],
      "text/plain": [
       "{q: 3.268839376575746?, l3: 0.4268284555997831?, l2: -0.3375305868756624?, l1: -0.2229755726084477?, l0: 1, k22: -0.6992229440461313?, k21: -1.157344168706315?, k12: -1.174350365749620?, k11: -0.2477546058510917?}"
      ]
     },
     "execution_count": 31,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "lx = sol[0]\n",
    "lx"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Numerical feedback gain matrix"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 32,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<html><script type=\"math/tex; mode=display\">\\newcommand{\\Bold}[1]{\\mathbf{#1}}\\left(\\begin{array}{rr}\n",
       "-0.247754605851092 & -1.17435036574962 \\\\\n",
       "-1.15734416870631 & -0.699222944046131\n",
       "\\end{array}\\right)</script></html>"
      ],
      "text/latex": [
       "$$\\newcommand{\\Bold}[1]{\\mathbf{#1}}\\left(\\begin{array}{rr}\n",
       "-0.247754605851092 & -1.17435036574962 \\\\\n",
       "-1.15734416870631 & -0.699222944046131\n",
       "\\end{array}\\right)$$"
      ],
      "text/plain": [
       "[-0.247754605851092  -1.17435036574962]\n",
       "[ -1.15734416870631 -0.699222944046131]"
      ]
     },
     "execution_count": 32,
     "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": 33,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<html><script type=\"math/tex; mode=display\">\\newcommand{\\Bold}[1]{\\mathbf{#1}}1.8079931904118847</script></html>"
      ],
      "text/latex": [
       "$$\\newcommand{\\Bold}[1]{\\mathbf{#1}}1.8079931904118847$$"
      ],
      "text/plain": [
       "1.8079931904118847"
      ]
     },
     "execution_count": 33,
     "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": 36,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<html><script type=\"math/tex; mode=display\">\\newcommand{\\Bold}[1]{\\mathbf{#1}}\\left[-3.000000000000005?, -1.999999999999994?, -1.000000000000002?\\right]</script></html>"
      ],
      "text/latex": [
       "$$\\newcommand{\\Bold}[1]{\\mathbf{#1}}\\left[-3.000000000000005?, -1.999999999999994?, -1.000000000000002?\\right]$$"
      ],
      "text/plain": [
       "[-3.000000000000005?, -1.999999999999994?, -1.000000000000002?]"
      ]
     },
     "execution_count": 36,
     "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": 39,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<html><script type=\"math/tex; mode=display\">\\newcommand{\\Bold}[1]{\\mathbf{#1}}\\left[-2.999999999999992, -2.0000000000000075, -0.9999999999999986\\right]</script></html>"
      ],
      "text/latex": [
       "$$\\newcommand{\\Bold}[1]{\\mathbf{#1}}\\left[-2.999999999999992, -2.0000000000000075, -0.9999999999999986\\right]$$"
      ],
      "text/plain": [
       "[-2.999999999999992, -2.0000000000000075, -0.9999999999999986]"
      ]
     },
     "execution_count": 39,
     "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
}