{
 "cells": [
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# Example 2: Minimum Frobenius Norm Static Output Feedback"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "The example system has been taken from \\[1, Example 2\\]. The eigenvalue placement with minimum Frobenium norm is discussed in \\[2, Example 2\\]. The poles should be placed at -3, -3, -4, i.e., we want to have a double eigenvalue.\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": 29,
   "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": 29,
     "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": 30,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<html><script type=\"math/tex; mode=display\">\\newcommand{\\Bold}[1]{\\mathbf{#1}}\\left(\\left(\\begin{array}{rrr}\n",
       "0 & 1 & 0 \\\\\n",
       "\\frac{981}{50} & 0 & -\\frac{443}{50} \\\\\n",
       "0 & 0 & -100\n",
       "\\end{array}\\right), \\left(\\begin{array}{rr}\n",
       "0 & -1 \\\\\n",
       "0 & 1 \\\\\n",
       "1 & 0\n",
       "\\end{array}\\right), \\left(\\begin{array}{rrr}\n",
       "1 & 0 & 2 \\\\\n",
       "1 & 1 & 0\n",
       "\\end{array}\\right)\\right)</script></html>"
      ],
      "text/latex": [
       "$$\\newcommand{\\Bold}[1]{\\mathbf{#1}}\\left(\\left(\\begin{array}{rrr}\n",
       "0 & 1 & 0 \\\\\n",
       "\\frac{981}{50} & 0 & -\\frac{443}{50} \\\\\n",
       "0 & 0 & -100\n",
       "\\end{array}\\right), \\left(\\begin{array}{rr}\n",
       "0 & -1 \\\\\n",
       "0 & 1 \\\\\n",
       "1 & 0\n",
       "\\end{array}\\right), \\left(\\begin{array}{rrr}\n",
       "1 & 0 & 2 \\\\\n",
       "1 & 1 & 0\n",
       "\\end{array}\\right)\\right)$$"
      ],
      "text/plain": [
       "(\n",
       "[      0       1       0]  [ 0 -1]         \n",
       "[ 981/50       0 -443/50]  [ 0  1]  [1 0 2]\n",
       "[      0       0    -100], [ 1  0], [1 1 0]\n",
       ")"
      ]
     },
     "execution_count": 30,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "A = matrix(R,[[0, 1, 0],[19.62, 0, -8.86],[0, 0, -100]])\n",
    "B = matrix(R,[[0, -1],[0, 1],[1, 0]])\n",
    "C = matrix(R,[[1, 0, 2],[1, 1, 0]])\n",
    "(A,B,C)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Symbolic feedback matrix"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 31,
   "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": 31,
     "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": 32,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<html><script type=\"math/tex; mode=display\">\\newcommand{\\Bold}[1]{\\mathbf{#1}}2 k_{11} s^{2} - k_{21} s^{2} + s^{3} + \\frac{461}{10} k_{12} k_{21} - \\frac{461}{10} k_{11} k_{22} - \\frac{443}{50} k_{12} s - 99 k_{21} s - \\frac{931}{50} k_{22} s + 100 s^{2} - \\frac{481}{10} k_{11} - \\frac{443}{50} k_{12} + 100 k_{21} - 1862 k_{22} - \\frac{981}{50} s - 1962</script></html>"
      ],
      "text/latex": [
       "$$\\newcommand{\\Bold}[1]{\\mathbf{#1}}2 k_{11} s^{2} - k_{21} s^{2} + s^{3} + \\frac{461}{10} k_{12} k_{21} - \\frac{461}{10} k_{11} k_{22} - \\frac{443}{50} k_{12} s - 99 k_{21} s - \\frac{931}{50} k_{22} s + 100 s^{2} - \\frac{481}{10} k_{11} - \\frac{443}{50} k_{12} + 100 k_{21} - 1862 k_{22} - \\frac{981}{50} s - 1962$$"
      ],
      "text/plain": [
       "2*k11*s^2 - k21*s^2 + s^3 + 461/10*k12*k21 - 461/10*k11*k22 - 443/50*k12*s - 99*k21*s - 931/50*k22*s + 100*s^2 - 481/10*k11 - 443/50*k12 + 100*k21 - 1862*k22 - 981/50*s - 1962"
      ]
     },
     "execution_count": 32,
     "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": 33,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<html><script type=\"math/tex; mode=display\">\\newcommand{\\Bold}[1]{\\mathbf{#1}}\\left(\\frac{461}{10} k_{12} k_{21} - \\frac{461}{10} k_{11} k_{22} - \\frac{301}{10} k_{11} + \\frac{443}{25} k_{12} + 388 k_{21} - \\frac{90307}{50} k_{22} - \\frac{51507}{50}, -12 k_{11} - \\frac{443}{50} k_{12} - 93 k_{21} - \\frac{931}{50} k_{22} - \\frac{29631}{50}, 2 k_{11} - k_{21} + 90\\right)</script></html>"
      ],
      "text/latex": [
       "$$\\newcommand{\\Bold}[1]{\\mathbf{#1}}\\left(\\frac{461}{10} k_{12} k_{21} - \\frac{461}{10} k_{11} k_{22} - \\frac{301}{10} k_{11} + \\frac{443}{25} k_{12} + 388 k_{21} - \\frac{90307}{50} k_{22} - \\frac{51507}{50}, -12 k_{11} - \\frac{443}{50} k_{12} - 93 k_{21} - \\frac{931}{50} k_{22} - \\frac{29631}{50}, 2 k_{11} - k_{21} + 90\\right)$$"
      ],
      "text/plain": [
       "(461/10*k12*k21 - 461/10*k11*k22 - 301/10*k11 + 443/25*k12 + 388*k21 - 90307/50*k22 - 51507/50,\n",
       " -12*k11 - 443/50*k12 - 93*k21 - 931/50*k22 - 29631/50,\n",
       " 2*k11 - k21 + 90)"
      ]
     },
     "execution_count": 33,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "q1,r1 = CP.quo_rem(s+3)\n",
    "q2,r2 = q1.quo_rem(s+3)\n",
    "q3,r3 = q2.quo_rem(s+4)\n",
    "r1,r2,r3"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Lagrangian function"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 34,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<html><script type=\"math/tex; mode=display\">\\newcommand{\\Bold}[1]{\\mathbf{#1}}k_{11}^{2} l_{0} - \\frac{461}{10} k_{11} k_{22} l_{1} - \\frac{301}{10} k_{11} l_{1} - 12 k_{11} l_{2} + 2 k_{11} l_{3} + k_{12}^{2} l_{0} + \\frac{461}{10} k_{12} k_{21} l_{1} + \\frac{443}{25} k_{12} l_{1} - \\frac{443}{50} k_{12} l_{2} + k_{21}^{2} l_{0} + 388 k_{21} l_{1} - 93 k_{21} l_{2} - k_{21} l_{3} + k_{22}^{2} l_{0} - \\frac{90307}{50} k_{22} l_{1} - \\frac{931}{50} k_{22} l_{2} - l_{0} q - \\frac{51507}{50} l_{1} - \\frac{29631}{50} l_{2} + 90 l_{3} + q</script></html>"
      ],
      "text/latex": [
       "$$\\newcommand{\\Bold}[1]{\\mathbf{#1}}k_{11}^{2} l_{0} - \\frac{461}{10} k_{11} k_{22} l_{1} - \\frac{301}{10} k_{11} l_{1} - 12 k_{11} l_{2} + 2 k_{11} l_{3} + k_{12}^{2} l_{0} + \\frac{461}{10} k_{12} k_{21} l_{1} + \\frac{443}{25} k_{12} l_{1} - \\frac{443}{50} k_{12} l_{2} + k_{21}^{2} l_{0} + 388 k_{21} l_{1} - 93 k_{21} l_{2} - k_{21} l_{3} + k_{22}^{2} l_{0} - \\frac{90307}{50} k_{22} l_{1} - \\frac{931}{50} k_{22} l_{2} - l_{0} q - \\frac{51507}{50} l_{1} - \\frac{29631}{50} l_{2} + 90 l_{3} + q$$"
      ],
      "text/plain": [
       "k11^2*l0 - 461/10*k11*k22*l1 - 301/10*k11*l1 - 12*k11*l2 + 2*k11*l3 + k12^2*l0 + 461/10*k12*k21*l1 + 443/25*k12*l1 - 443/50*k12*l2 + k21^2*l0 + 388*k21*l1 - 93*k21*l2 - k21*l3 + k22^2*l0 - 90307/50*k22*l1 - 931/50*k22*l2 - l0*q - 51507/50*l1 - 29631/50*l2 + 90*l3 + q"
      ]
     },
     "execution_count": 34,
     "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": 35,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "0  :  k11  :  2*k11*l0 - 461/10*k22*l1 - 301/10*l1 - 12*l2 + 2*l3\n",
      "1  :  k12  :  2*k12*l0 + 461/10*k21*l1 + 443/25*l1 - 443/50*l2\n",
      "2  :  k21  :  461/10*k12*l1 + 2*k21*l0 + 388*l1 - 93*l2 - l3\n",
      "3  :  k22  :  -461/10*k11*l1 + 2*k22*l0 - 90307/50*l1 - 931/50*l2\n",
      "4  :  l0  :  k11^2 + k12^2 + k21^2 + k22^2 - q\n",
      "5  :  l1  :  -461/10*k11*k22 - 301/10*k11 + 461/10*k12*k21 + 443/25*k12 + 388*k21 - 90307/50*k22 - 51507/50\n",
      "6  :  l2  :  -12*k11 - 443/50*k12 - 93*k21 - 931/50*k22 - 29631/50\n",
      "7  :  l3  :  2*k11 - k21 + 90\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{461}{10} k_{22} l_{1} - \\frac{301}{10} l_{1} - 12 l_{2} + 2 l_{3}, 2 k_{12} l_{0} + \\frac{461}{10} k_{21} l_{1} + \\frac{443}{25} l_{1} - \\frac{443}{50} l_{2}, \\frac{461}{10} k_{12} l_{1} + 2 k_{21} l_{0} + 388 l_{1} - 93 l_{2} - l_{3}, -\\frac{461}{10} k_{11} l_{1} + 2 k_{22} l_{0} - \\frac{90307}{50} l_{1} - \\frac{931}{50} l_{2}, k_{11}^{2} + k_{12}^{2} + k_{21}^{2} + k_{22}^{2} - q, -\\frac{461}{10} k_{11} k_{22} - \\frac{301}{10} k_{11} + \\frac{461}{10} k_{12} k_{21} + \\frac{443}{25} k_{12} + 388 k_{21} - \\frac{90307}{50} k_{22} - \\frac{51507}{50}, -12 k_{11} - \\frac{443}{50} k_{12} - 93 k_{21} - \\frac{931}{50} k_{22} - \\frac{29631}{50}, 2 k_{11} - k_{21} + 90, -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{461}{10} k_{22} l_{1} - \\frac{301}{10} l_{1} - 12 l_{2} + 2 l_{3}, 2 k_{12} l_{0} + \\frac{461}{10} k_{21} l_{1} + \\frac{443}{25} l_{1} - \\frac{443}{50} l_{2}, \\frac{461}{10} k_{12} l_{1} + 2 k_{21} l_{0} + 388 l_{1} - 93 l_{2} - l_{3}, -\\frac{461}{10} k_{11} l_{1} + 2 k_{22} l_{0} - \\frac{90307}{50} l_{1} - \\frac{931}{50} l_{2}, k_{11}^{2} + k_{12}^{2} + k_{21}^{2} + k_{22}^{2} - q, -\\frac{461}{10} k_{11} k_{22} - \\frac{301}{10} k_{11} + \\frac{461}{10} k_{12} k_{21} + \\frac{443}{25} k_{12} + 388 k_{21} - \\frac{90307}{50} k_{22} - \\frac{51507}{50}, -12 k_{11} - \\frac{443}{50} k_{12} - 93 k_{21} - \\frac{931}{50} k_{22} - \\frac{29631}{50}, 2 k_{11} - k_{21} + 90, -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 - 461/10*k22*l1 - 301/10*l1 - 12*l2 + 2*l3, 2*k12*l0 + 461/10*k21*l1 + 443/25*l1 - 443/50*l2, 461/10*k12*l1 + 2*k21*l0 + 388*l1 - 93*l2 - l3, -461/10*k11*l1 + 2*k22*l0 - 90307/50*l1 - 931/50*l2, k11^2 + k12^2 + k21^2 + k22^2 - q, -461/10*k11*k22 - 301/10*k11 + 461/10*k12*k21 + 443/25*k12 + 388*k21 - 90307/50*k22 - 51507/50, -12*k11 - 443/50*k12 - 93*k21 - 931/50*k22 - 29631/50, 2*k11 - k21 + 90, -l0 + 1) of Multivariate Polynomial Ring in k11, k12, k21, k22, s, l0, l1, l2, l3, q over Rational Field"
      ]
     },
     "execution_count": 35,
     "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": 36,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<html><script type=\"math/tex; mode=display\">\\newcommand{\\Bold}[1]{\\mathbf{#1}}\\left(743984251427871486920144275832068491488281250 q^{4} - 6684322385321726860643482367467620059165725453125 q^{3} + 22013416240139431256173076827447995890610917423698875 q^{2} - 31706669025491173284411110344950631901748502702664953888 q + 16933085437845849430221649184469909408834771791804607019548\\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(743984251427871486920144275832068491488281250 q^{4} - 6684322385321726860643482367467620059165725453125 q^{3} + 22013416240139431256173076827447995890610917423698875 q^{2} - 31706669025491173284411110344950631901748502702664953888 q + 16933085437845849430221649184469909408834771791804607019548\\right)\\Bold{Q}[k_{11}, k_{12}, k_{21}, k_{22}, s, l_{0}, l_{1}, l_{2}, l_{3}, q]$$"
      ],
      "text/plain": [
       "Ideal (743984251427871486920144275832068491488281250*q^4 - 6684322385321726860643482367467620059165725453125*q^3 + 22013416240139431256173076827447995890610917423698875*q^2 - 31706669025491173284411110344950631901748502702664953888*q + 16933085437845849430221649184469909408834771791804607019548) of Multivariate Polynomial Ring in k11, k12, k21, k22, s, l0, l1, l2, l3, q over Rational Field"
      ]
     },
     "execution_count": 36,
     "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": 37,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<html><script type=\"math/tex; mode=display\">\\newcommand{\\Bold}[1]{\\mathbf{#1}}\\left[\\left(2038.25815459246, 1\\right), \\left(3278.95026577783, 1\\right)\\right]</script></html>"
      ],
      "text/latex": [
       "$$\\newcommand{\\Bold}[1]{\\mathbf{#1}}\\left[\\left(2038.25815459246, 1\\right), \\left(3278.95026577783, 1\\right)\\right]$$"
      ],
      "text/plain": [
       "[(2038.25815459246, 1), (3278.95026577783, 1)]"
      ]
     },
     "execution_count": 37,
     "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": 38,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<html><script type=\"math/tex; mode=display\">\\newcommand{\\Bold}[1]{\\mathbf{#1}}2038.25815459246</script></html>"
      ],
      "text/latex": [
       "$$\\newcommand{\\Bold}[1]{\\mathbf{#1}}2038.25815459246$$"
      ],
      "text/plain": [
       "2038.25815459246"
      ]
     },
     "execution_count": 38,
     "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": 39,
   "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": 39,
     "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": 40,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<html><script type=\"math/tex; mode=display\">\\newcommand{\\Bold}[1]{\\mathbf{#1}}\\left[\\verb|{q:|\\phantom{\\verb!x!}\\verb|2038.258154592421?,|\\phantom{\\verb!x!}\\verb|l3:|\\phantom{\\verb!x!}\\verb|41.95161902174205?,|\\phantom{\\verb!x!}\\verb|l2:|\\phantom{\\verb!x!}\\verb|-0.5492155735055070?,|\\phantom{\\verb!x!}\\verb|l1:|\\phantom{\\verb!x!}\\verb|-0.03108165258292408?,|\\phantom{\\verb!x!}\\verb|l0:|\\phantom{\\verb!x!}\\verb|1,|\\phantom{\\verb!x!}\\verb|k22:|\\phantom{\\verb!x!}\\verb|-0.8847562529184268?,|\\phantom{\\verb!x!}\\verb|k21:|\\phantom{\\verb!x!}\\verb|-0.1616471218549174?,|\\phantom{\\verb!x!}\\verb|k12:|\\phantom{\\verb!x!}\\verb|-2.273450734426870?,|\\phantom{\\verb!x!}\\verb|k11:|\\phantom{\\verb!x!}\\verb|-45.08082356092746?}|, \\verb|{q:|\\phantom{\\verb!x!}\\verb|3278.950265777833?,|\\phantom{\\verb!x!}\\verb|l3:|\\phantom{\\verb!x!}\\verb|283.4279275257919?,|\\phantom{\\verb!x!}\\verb|l2:|\\phantom{\\verb!x!}\\verb|-6.706680673787214?,|\\phantom{\\verb!x!}\\verb|l1:|\\phantom{\\verb!x!}\\verb|-0.3488968102848198?,|\\phantom{\\verb!x!}\\verb|l0:|\\phantom{\\verb!x!}\\verb|1,|\\phantom{\\verb!x!}\\verb|k22:|\\phantom{\\verb!x!}\\verb|-35.61327065206581?,|\\phantom{\\verb!x!}\\verb|k21:|\\phantom{\\verb!x!}\\verb|4.971119105352403?,|\\phantom{\\verb!x!}\\verb|k12:|\\phantom{\\verb!x!}\\verb|13.35872552049407?,|\\phantom{\\verb!x!}\\verb|k11:|\\phantom{\\verb!x!}\\verb|-42.51444044732380?}|, \\verb|{q:|\\phantom{\\verb!x!}\\verb|1833.643019842273?|\\phantom{\\verb!x!}\\verb|-|\\phantom{\\verb!x!}\\verb|207.9262264607811?*I,|\\phantom{\\verb!x!}\\verb|l3:|\\phantom{\\verb!x!}\\verb|22.92645275271472?|\\phantom{\\verb!x!}\\verb|-|\\phantom{\\verb!x!}\\verb|48.79668803123861?*I,|\\phantom{\\verb!x!}\\verb|l2:|\\phantom{\\verb!x!}\\verb|1.806582640038055?|\\phantom{\\verb!x!}\\verb|-|\\phantom{\\verb!x!}\\verb|0.4763577215930209?*I,|\\phantom{\\verb!x!}\\verb|l1:|\\phantom{\\verb!x!}\\verb|0.1972647661083527?|\\phantom{\\verb!x!}\\verb|+|\\phantom{\\verb!x!}\\verb|0.0661897043039494?*I,|\\phantom{\\verb!x!}\\verb|l0:|\\phantom{\\verb!x!}\\verb|1,|\\phantom{\\verb!x!}\\verb|k22:|\\phantom{\\verb!x!}\\verb|-10.044949010449721?|\\phantom{\\verb!x!}\\verb|-|\\phantom{\\verb!x!}\\verb|6.656486438006417?*I,|\\phantom{\\verb!x!}\\verb|k21:|\\phantom{\\verb!x!}\\verb|0.7271754583177050?|\\phantom{\\verb!x!}\\verb|+|\\phantom{\\verb!x!}\\verb|2.685324786258234?*I,|\\phantom{\\verb!x!}\\verb|k12:|\\phantom{\\verb!x!}\\verb|7.045889413219074?|\\phantom{\\verb!x!}\\verb|-|\\phantom{\\verb!x!}\\verb|16.01618243384714?*I,|\\phantom{\\verb!x!}\\verb|k11:|\\phantom{\\verb!x!}\\verb|-44.63641227084115?|\\phantom{\\verb!x!}\\verb|+|\\phantom{\\verb!x!}\\verb|1.342662393129117?*I}|, \\verb|{q:|\\phantom{\\verb!x!}\\verb|1833.643019842273?|\\phantom{\\verb!x!}\\verb|+|\\phantom{\\verb!x!}\\verb|207.9262264607811?*I,|\\phantom{\\verb!x!}\\verb|l3:|\\phantom{\\verb!x!}\\verb|22.92645275271472?|\\phantom{\\verb!x!}\\verb|+|\\phantom{\\verb!x!}\\verb|48.79668803123861?*I,|\\phantom{\\verb!x!}\\verb|l2:|\\phantom{\\verb!x!}\\verb|1.806582640038055?|\\phantom{\\verb!x!}\\verb|+|\\phantom{\\verb!x!}\\verb|0.4763577215930209?*I,|\\phantom{\\verb!x!}\\verb|l1:|\\phantom{\\verb!x!}\\verb|0.1972647661083527?|\\phantom{\\verb!x!}\\verb|-|\\phantom{\\verb!x!}\\verb|0.0661897043039494?*I,|\\phantom{\\verb!x!}\\verb|l0:|\\phantom{\\verb!x!}\\verb|1,|\\phantom{\\verb!x!}\\verb|k22:|\\phantom{\\verb!x!}\\verb|-10.044949010449721?|\\phantom{\\verb!x!}\\verb|+|\\phantom{\\verb!x!}\\verb|6.656486438006417?*I,|\\phantom{\\verb!x!}\\verb|k21:|\\phantom{\\verb!x!}\\verb|0.7271754583177050?|\\phantom{\\verb!x!}\\verb|-|\\phantom{\\verb!x!}\\verb|2.685324786258234?*I,|\\phantom{\\verb!x!}\\verb|k12:|\\phantom{\\verb!x!}\\verb|7.045889413219074?|\\phantom{\\verb!x!}\\verb|+|\\phantom{\\verb!x!}\\verb|16.01618243384714?*I,|\\phantom{\\verb!x!}\\verb|k11:|\\phantom{\\verb!x!}\\verb|-44.63641227084115?|\\phantom{\\verb!x!}\\verb|-|\\phantom{\\verb!x!}\\verb|1.342662393129117?*I}|\\right]</script></html>"
      ],
      "text/latex": [
       "$$\\newcommand{\\Bold}[1]{\\mathbf{#1}}\\left[\\verb|{q:|\\phantom{\\verb!x!}\\verb|2038.258154592421?,|\\phantom{\\verb!x!}\\verb|l3:|\\phantom{\\verb!x!}\\verb|41.95161902174205?,|\\phantom{\\verb!x!}\\verb|l2:|\\phantom{\\verb!x!}\\verb|-0.5492155735055070?,|\\phantom{\\verb!x!}\\verb|l1:|\\phantom{\\verb!x!}\\verb|-0.03108165258292408?,|\\phantom{\\verb!x!}\\verb|l0:|\\phantom{\\verb!x!}\\verb|1,|\\phantom{\\verb!x!}\\verb|k22:|\\phantom{\\verb!x!}\\verb|-0.8847562529184268?,|\\phantom{\\verb!x!}\\verb|k21:|\\phantom{\\verb!x!}\\verb|-0.1616471218549174?,|\\phantom{\\verb!x!}\\verb|k12:|\\phantom{\\verb!x!}\\verb|-2.273450734426870?,|\\phantom{\\verb!x!}\\verb|k11:|\\phantom{\\verb!x!}\\verb|-45.08082356092746?}|, \\verb|{q:|\\phantom{\\verb!x!}\\verb|3278.950265777833?,|\\phantom{\\verb!x!}\\verb|l3:|\\phantom{\\verb!x!}\\verb|283.4279275257919?,|\\phantom{\\verb!x!}\\verb|l2:|\\phantom{\\verb!x!}\\verb|-6.706680673787214?,|\\phantom{\\verb!x!}\\verb|l1:|\\phantom{\\verb!x!}\\verb|-0.3488968102848198?,|\\phantom{\\verb!x!}\\verb|l0:|\\phantom{\\verb!x!}\\verb|1,|\\phantom{\\verb!x!}\\verb|k22:|\\phantom{\\verb!x!}\\verb|-35.61327065206581?,|\\phantom{\\verb!x!}\\verb|k21:|\\phantom{\\verb!x!}\\verb|4.971119105352403?,|\\phantom{\\verb!x!}\\verb|k12:|\\phantom{\\verb!x!}\\verb|13.35872552049407?,|\\phantom{\\verb!x!}\\verb|k11:|\\phantom{\\verb!x!}\\verb|-42.51444044732380?}|, \\verb|{q:|\\phantom{\\verb!x!}\\verb|1833.643019842273?|\\phantom{\\verb!x!}\\verb|-|\\phantom{\\verb!x!}\\verb|207.9262264607811?*I,|\\phantom{\\verb!x!}\\verb|l3:|\\phantom{\\verb!x!}\\verb|22.92645275271472?|\\phantom{\\verb!x!}\\verb|-|\\phantom{\\verb!x!}\\verb|48.79668803123861?*I,|\\phantom{\\verb!x!}\\verb|l2:|\\phantom{\\verb!x!}\\verb|1.806582640038055?|\\phantom{\\verb!x!}\\verb|-|\\phantom{\\verb!x!}\\verb|0.4763577215930209?*I,|\\phantom{\\verb!x!}\\verb|l1:|\\phantom{\\verb!x!}\\verb|0.1972647661083527?|\\phantom{\\verb!x!}\\verb|+|\\phantom{\\verb!x!}\\verb|0.0661897043039494?*I,|\\phantom{\\verb!x!}\\verb|l0:|\\phantom{\\verb!x!}\\verb|1,|\\phantom{\\verb!x!}\\verb|k22:|\\phantom{\\verb!x!}\\verb|-10.044949010449721?|\\phantom{\\verb!x!}\\verb|-|\\phantom{\\verb!x!}\\verb|6.656486438006417?*I,|\\phantom{\\verb!x!}\\verb|k21:|\\phantom{\\verb!x!}\\verb|0.7271754583177050?|\\phantom{\\verb!x!}\\verb|+|\\phantom{\\verb!x!}\\verb|2.685324786258234?*I,|\\phantom{\\verb!x!}\\verb|k12:|\\phantom{\\verb!x!}\\verb|7.045889413219074?|\\phantom{\\verb!x!}\\verb|-|\\phantom{\\verb!x!}\\verb|16.01618243384714?*I,|\\phantom{\\verb!x!}\\verb|k11:|\\phantom{\\verb!x!}\\verb|-44.63641227084115?|\\phantom{\\verb!x!}\\verb|+|\\phantom{\\verb!x!}\\verb|1.342662393129117?*I}|, \\verb|{q:|\\phantom{\\verb!x!}\\verb|1833.643019842273?|\\phantom{\\verb!x!}\\verb|+|\\phantom{\\verb!x!}\\verb|207.9262264607811?*I,|\\phantom{\\verb!x!}\\verb|l3:|\\phantom{\\verb!x!}\\verb|22.92645275271472?|\\phantom{\\verb!x!}\\verb|+|\\phantom{\\verb!x!}\\verb|48.79668803123861?*I,|\\phantom{\\verb!x!}\\verb|l2:|\\phantom{\\verb!x!}\\verb|1.806582640038055?|\\phantom{\\verb!x!}\\verb|+|\\phantom{\\verb!x!}\\verb|0.4763577215930209?*I,|\\phantom{\\verb!x!}\\verb|l1:|\\phantom{\\verb!x!}\\verb|0.1972647661083527?|\\phantom{\\verb!x!}\\verb|-|\\phantom{\\verb!x!}\\verb|0.0661897043039494?*I,|\\phantom{\\verb!x!}\\verb|l0:|\\phantom{\\verb!x!}\\verb|1,|\\phantom{\\verb!x!}\\verb|k22:|\\phantom{\\verb!x!}\\verb|-10.044949010449721?|\\phantom{\\verb!x!}\\verb|+|\\phantom{\\verb!x!}\\verb|6.656486438006417?*I,|\\phantom{\\verb!x!}\\verb|k21:|\\phantom{\\verb!x!}\\verb|0.7271754583177050?|\\phantom{\\verb!x!}\\verb|-|\\phantom{\\verb!x!}\\verb|2.685324786258234?*I,|\\phantom{\\verb!x!}\\verb|k12:|\\phantom{\\verb!x!}\\verb|7.045889413219074?|\\phantom{\\verb!x!}\\verb|+|\\phantom{\\verb!x!}\\verb|16.01618243384714?*I,|\\phantom{\\verb!x!}\\verb|k11:|\\phantom{\\verb!x!}\\verb|-44.63641227084115?|\\phantom{\\verb!x!}\\verb|-|\\phantom{\\verb!x!}\\verb|1.342662393129117?*I}|\\right]$$"
      ],
      "text/plain": [
       "[{q: 2038.258154592421?, l3: 41.95161902174205?, l2: -0.5492155735055070?, l1: -0.03108165258292408?, l0: 1, k22: -0.8847562529184268?, k21: -0.1616471218549174?, k12: -2.273450734426870?, k11: -45.08082356092746?},\n",
       " {q: 3278.950265777833?, l3: 283.4279275257919?, l2: -6.706680673787214?, l1: -0.3488968102848198?, l0: 1, k22: -35.61327065206581?, k21: 4.971119105352403?, k12: 13.35872552049407?, k11: -42.51444044732380?},\n",
       " {q: 1833.643019842273? - 207.9262264607811?*I, l3: 22.92645275271472? - 48.79668803123861?*I, l2: 1.806582640038055? - 0.4763577215930209?*I, l1: 0.1972647661083527? + 0.0661897043039494?*I, l0: 1, k22: -10.044949010449721? - 6.656486438006417?*I, k21: 0.7271754583177050? + 2.685324786258234?*I, k12: 7.045889413219074? - 16.01618243384714?*I, k11: -44.63641227084115? + 1.342662393129117?*I},\n",
       " {q: 1833.643019842273? + 207.9262264607811?*I, l3: 22.92645275271472? + 48.79668803123861?*I, l2: 1.806582640038055? + 0.4763577215930209?*I, l1: 0.1972647661083527? - 0.0661897043039494?*I, l0: 1, k22: -10.044949010449721? + 6.656486438006417?*I, k21: 0.7271754583177050? - 2.685324786258234?*I, k12: 7.045889413219074? + 16.01618243384714?*I, k11: -44.63641227084115? - 1.342662393129117?*I}]"
      ]
     },
     "execution_count": 40,
     "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": 41,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<html><script type=\"math/tex; mode=display\">\\newcommand{\\Bold}[1]{\\mathbf{#1}}\\verb|{q:|\\phantom{\\verb!x!}\\verb|3278.950265777833?,|\\phantom{\\verb!x!}\\verb|l3:|\\phantom{\\verb!x!}\\verb|283.4279275257919?,|\\phantom{\\verb!x!}\\verb|l2:|\\phantom{\\verb!x!}\\verb|-6.706680673787214?,|\\phantom{\\verb!x!}\\verb|l1:|\\phantom{\\verb!x!}\\verb|-0.3488968102848198?,|\\phantom{\\verb!x!}\\verb|l0:|\\phantom{\\verb!x!}\\verb|1,|\\phantom{\\verb!x!}\\verb|k22:|\\phantom{\\verb!x!}\\verb|-35.61327065206581?,|\\phantom{\\verb!x!}\\verb|k21:|\\phantom{\\verb!x!}\\verb|4.971119105352403?,|\\phantom{\\verb!x!}\\verb|k12:|\\phantom{\\verb!x!}\\verb|13.35872552049407?,|\\phantom{\\verb!x!}\\verb|k11:|\\phantom{\\verb!x!}\\verb|-42.51444044732380?}|</script></html>"
      ],
      "text/latex": [
       "$$\\newcommand{\\Bold}[1]{\\mathbf{#1}}\\verb|{q:|\\phantom{\\verb!x!}\\verb|3278.950265777833?,|\\phantom{\\verb!x!}\\verb|l3:|\\phantom{\\verb!x!}\\verb|283.4279275257919?,|\\phantom{\\verb!x!}\\verb|l2:|\\phantom{\\verb!x!}\\verb|-6.706680673787214?,|\\phantom{\\verb!x!}\\verb|l1:|\\phantom{\\verb!x!}\\verb|-0.3488968102848198?,|\\phantom{\\verb!x!}\\verb|l0:|\\phantom{\\verb!x!}\\verb|1,|\\phantom{\\verb!x!}\\verb|k22:|\\phantom{\\verb!x!}\\verb|-35.61327065206581?,|\\phantom{\\verb!x!}\\verb|k21:|\\phantom{\\verb!x!}\\verb|4.971119105352403?,|\\phantom{\\verb!x!}\\verb|k12:|\\phantom{\\verb!x!}\\verb|13.35872552049407?,|\\phantom{\\verb!x!}\\verb|k11:|\\phantom{\\verb!x!}\\verb|-42.51444044732380?}|$$"
      ],
      "text/plain": [
       "{q: 3278.950265777833?, l3: 283.4279275257919?, l2: -6.706680673787214?, l1: -0.3488968102848198?, l0: 1, k22: -35.61327065206581?, k21: 4.971119105352403?, k12: 13.35872552049407?, k11: -42.51444044732380?}"
      ]
     },
     "execution_count": 41,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "lx = sol[1]\n",
    "lx"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Numerical feedback gain matrix"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 42,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<html><script type=\"math/tex; mode=display\">\\newcommand{\\Bold}[1]{\\mathbf{#1}}\\left(\\begin{array}{rr}\n",
       "-42.5144404473238 & 13.3587255204941 \\\\\n",
       "4.97111910535240 & -35.6132706520658\n",
       "\\end{array}\\right)</script></html>"
      ],
      "text/latex": [
       "$$\\newcommand{\\Bold}[1]{\\mathbf{#1}}\\left(\\begin{array}{rr}\n",
       "-42.5144404473238 & 13.3587255204941 \\\\\n",
       "4.97111910535240 & -35.6132706520658\n",
       "\\end{array}\\right)$$"
      ],
      "text/plain": [
       "[-42.5144404473238  13.3587255204941]\n",
       "[ 4.97111910535240 -35.6132706520658]"
      ]
     },
     "execution_count": 42,
     "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": 43,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<html><script type=\"math/tex; mode=display\">\\newcommand{\\Bold}[1]{\\mathbf{#1}}57.26211894243726</script></html>"
      ],
      "text/latex": [
       "$$\\newcommand{\\Bold}[1]{\\mathbf{#1}}57.26211894243726$$"
      ],
      "text/plain": [
       "57.26211894243726"
      ]
     },
     "execution_count": 43,
     "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": 44,
   "metadata": {
    "scrolled": true
   },
   "outputs": [
    {
     "data": {
      "text/html": [
       "<html><script type=\"math/tex; mode=display\">\\newcommand{\\Bold}[1]{\\mathbf{#1}}\\left[-4.000000000010891?, -2.999999999994561? - 3.33366?e-6 \\sqrt{-1}, -2.999999999994561? + 3.33366?e-6 \\sqrt{-1}\\right]</script></html>"
      ],
      "text/latex": [
       "$$\\newcommand{\\Bold}[1]{\\mathbf{#1}}\\left[-4.000000000010891?, -2.999999999994561? - 3.33366?e-6 \\sqrt{-1}, -2.999999999994561? + 3.33366?e-6 \\sqrt{-1}\\right]$$"
      ],
      "text/plain": [
       "[-4.000000000010891?, -2.999999999994561? - 3.33366?e-6*I, -2.999999999994561? + 3.33366?e-6*I]"
      ]
     },
     "execution_count": 44,
     "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": 45,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<html><script type=\"math/tex; mode=display\">\\newcommand{\\Bold}[1]{\\mathbf{#1}}\\left[-4.000000000015731, -2.9999999999921556 + 4.019993690152769 \\times 10^{-06}i, -2.9999999999921556 - 4.019993690152769 \\times 10^{-06}i\\right]</script></html>"
      ],
      "text/latex": [
       "$$\\newcommand{\\Bold}[1]{\\mathbf{#1}}\\left[-4.000000000015731, -2.9999999999921556 + 4.019993690152769 \\times 10^{-06}i, -2.9999999999921556 - 4.019993690152769 \\times 10^{-06}i\\right]$$"
      ],
      "text/plain": [
       "[-4.000000000015731,\n",
       " -2.9999999999921556 + 4.019993690152769e-06*I,\n",
       " -2.9999999999921556 - 4.019993690152769e-06*I]"
      ]
     },
     "execution_count": 45,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "A0 = matrix(RDF,A-B*K0*C)\n",
    "v = A0.eigenvalues()\n",
    "v"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Verification of the closed-loop eigenvalues: Real parts of numerically computed eigenvlues"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 46,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<html><script type=\"math/tex; mode=display\">\\newcommand{\\Bold}[1]{\\mathbf{#1}}\\left(-4.000000000015731,\\,-2.9999999999921556,\\,-2.9999999999921556\\right)</script></html>"
      ],
      "text/latex": [
       "$$\\newcommand{\\Bold}[1]{\\mathbf{#1}}\\left(-4.000000000015731,\\,-2.9999999999921556,\\,-2.9999999999921556\\right)$$"
      ],
      "text/plain": [
       "(-4.000000000015731, -2.9999999999921556, -2.9999999999921556)"
      ]
     },
     "execution_count": 46,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "vector([x.real() for x in v])"
   ]
  }
 ],
 "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
}