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