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