{
"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": [
""
],
"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. = 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": [
""
],
"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": [
""
],
"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": [
""
],
"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": [
""
],
"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": [
""
],
"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": [
""
],
"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": [
""
],
"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": [
""
],
"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": [
""
],
"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": [
""
],
"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": [
""
],
"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": [
""
],
"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": [
""
],
"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": [
""
],
"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": [
""
],
"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": [
""
],
"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
}