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