{"id":326,"date":"2017-05-07T09:35:55","date_gmt":"2017-05-07T14:35:55","guid":{"rendered":"http:\/\/blog.espol.edu.ec\/telg1001\/?p=326"},"modified":"2026-04-22T15:15:19","modified_gmt":"2026-04-22T20:15:19","slug":"laplace-hspolos-reales-complejos","status":"publish","type":"post","link":"https:\/\/blog.espol.edu.ec\/algoritmos101\/ss-u04\/laplace-hspolos-reales-complejos\/","title":{"rendered":"4.3.1 H(s) - Polos reales y complejos con Sympy-Python"},"content":{"rendered":"\n<hr class=\"wp-block-separator has-alpha-channel-opacity\" \/>\n\n\n\n<div class=\"wp-block-group has-medium-font-size is-layout-flex wp-block-group-is-layout-flex\">\n<p><a href=\"#hstransferencia\">H(s)<\/a><\/p>\n\n\n\n<p><a href=\"#polosnorepetidos\">polos reales <strong>no repetidos<\/strong><\/a><\/p>\n\n\n\n<p><a href=\"#gradosigualespq\">grados iguales P y Q<\/a><\/p>\n\n\n\n<p><a href=\"#polosrepetidos\">polos reales <strong>repetidos<\/strong><\/a><\/p>\n\n\n\n<p><a href=\"#poloscomplejo\">polos <strong>complejos<\/strong><\/a><\/p>\n\n\n\n<p><a href=\"#retrasotiempo\"><strong>exponencial s<\/strong> \/retraso<\/a><\/p>\n\n\n\n<p><a href=\"#buscapolosceros\">algoritmo busca_polosceros<\/a><\/p>\n\n\n\n<p><a href=\"#graficapolosceros\">gr\u00e1fica<\/a><\/p>\n\n\n\n<p><a href=\"#parametrocuadratico\">Q cuadr\u00e1ticos<\/a><\/p>\n\n\n\n<p><a href=\"#algoritmoQcuad\">algoritmo Q_cuad_s_parametros<\/a><\/p>\n<\/div>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\" \/>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"hstransferencia\">1. H(s) Funci\u00f3n de transferencia<\/h2>\n\n\n\n<p><em><strong>Referencia<\/strong><\/em>:&nbsp;Lathi ejemplo 4 p330, Hsu literal C. p112<\/p>\n\n\n\n<p>La funci\u00f3n de transferencia H(s) se escribe como P(s)\/Q(s) que es una expresi\u00f3n racional de s. Se considera que en la expresi\u00f3n el grado <strong>m<\/strong> del polinomio del numerador P(s)&nbsp; es mayor que el grado <strong>n<\/strong> del polinomio del denominador Q(s). Las ra\u00edces del polinomio P(s) del numerador se conocen como ceros, pues convierten la expresi\u00f3n en cero, mientras que para el denominador las ra\u00edces se denominan polos al convertir en infinito la expresi\u00f3n (Hsu).<\/p>\n\n\n<span class=\"wp-katex-eq katex-display\" data-display=\"true\"> \\frac{P(s)}{Q(s)} = \\frac{a_0(s-ceros(1))\\text{...}(s-ceros(m))}{b_0(s - polos(1)) \\text{...} (s - polos(n))}<\/span>\n\n\n\n<p>otra forma de escribir los polos y ceros (Lathi)<\/p>\n\n\n<span class=\"wp-katex-eq katex-display\" data-display=\"true\"> \\frac{P(s)}{Q(s)} = \\frac{ceros(1)}{s - polos(1)}+\\frac{ceros(2)}{s - polos(2)}+\\text{ ... } <\/span>\n\n\n<span class=\"wp-katex-eq katex-display\" data-display=\"true\"> \\text{ ... }+\\frac{ceros(n)}{s - polos(n)}+ganancia(s)<\/span>\n\n\n\n<p>Para el desarrollo de un algoritmo con Sympy, el primer paso consiste en determinan los polos de un ejercicio.<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\" \/>\n\n\n\n<div class=\"wp-block-group has-medium-font-size is-layout-flex wp-block-group-is-layout-flex\">\n<p><a href=\"#hstransferencia\">H(s)<\/a><\/p>\n\n\n\n<p><a href=\"#polosnorepetidos\">polos reales <strong>no repetidos<\/strong><\/a><\/p>\n\n\n\n<p><a href=\"#gradosigualespq\">grados iguales P y Q<\/a><\/p>\n\n\n\n<p><a href=\"#polosrepetidos\">polos reales <strong>repetidos<\/strong><\/a><\/p>\n\n\n\n<p><a href=\"#poloscomplejo\">polos <strong>complejos<\/strong><\/a><\/p>\n\n\n\n<p><a href=\"#retrasotiempo\"><strong>exponencial s<\/strong> \/retraso<\/a><\/p>\n\n\n\n<p><a href=\"#buscapolosceros\">algoritmo busca_polosceros<\/a><\/p>\n\n\n\n<p><a href=\"#graficapolosceros\">gr\u00e1fica<\/a><\/p>\n\n\n\n<p><a href=\"#parametrocuadratico\">Q cuadr\u00e1ticos<\/a><\/p>\n\n\n\n<p><a href=\"#algoritmoQcuad\">algoritmo Q_cuad_s_parametros<\/a><\/p>\n<\/div>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\" \/>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"polosnorepetidos\">2. Polos reales no repetidos y fracciones parciales<\/h2>\n\n\n\n<p><strong>Referencia<\/strong>: Hsu problema 3.17a p137, Lathi ejemplo 4.3a p338, Oppenheim ejemplo 9.9 p671<\/p>\n\n\n\n<p>La expresi\u00f3n H(s)&nbsp; tiene los componentes de P(s) y Q(s) como se indican,<\/p>\n\n\n<span class=\"wp-katex-eq katex-display\" data-display=\"true\"> H(s) = \\frac{2s+4}{s^2 +4s+3}<\/span>\n\n\n\n<h3 class=\"wp-block-heading\">Ingreso de H(s) como P(s) y Q(s)<\/h3>\n\n\n\n<p>Para la expresi\u00f3n de la funci\u00f3n de transferencia, con <strong>Sympy<\/strong> se crean los polinomios del numerador <strong>Ps<\/strong> y denominador <strong>Qs<\/strong>.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code><span style=\"color: #ff0000\"># INGRESO<\/span>\ns = sym.Symbol(<span style=\"color: #008000\">'s'<\/span>)\nPs = 2*s + 4  <span style=\"color: #ff0000\"># 1+0*s cuando es constante<\/span>\nQs = s**2 + 4*s + 3\n\nHs = Ps\/Qs<\/code><\/pre>\n\n\n\n<p>Siendo H(s) la forma en que se expresan los ejercicios, se realizan las operaciones para obtener las ra\u00edces del numerador y denominador. El resultado buscado con el algoritmo es:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>H(s):\n   2\u22c5(s + 2)   \n\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n(s + 1)\u22c5(s + 3)\n\n H(s) en fracciones parciales \n  1       1  \n\u2500\u2500\u2500\u2500\u2500 + \u2500\u2500\u2500\u2500\u2500\ns + 3   s + 1\n\n {Q_polos:veces}: {-1: 1, -3: 1}\n\n {P_ceros:veces}: {-2: 1}\n&gt;&gt;&gt;  <\/code><\/pre>\n\n\n\n<h3 class=\"wp-block-heading\">Algoritmo en Python<\/h3>\n\n\n\n<p>Hs se convierte en una expresi\u00f3n de Sympy con <code>sym.sympify(Hs)<\/code>s para el caso en que se de tan solo una constante. En el caso que Hs requiera agrupar t\u00e9rminos se usa la instrucci\u00f3n <code>sym.simplify(Hs,inverse=True)<\/code>.<\/p>\n\n\n\n<p>Una vez preparada la expresi\u00f3n Hs, se separa como numerador <code>Ps<\/code> y denominador <code>Qs<\/code> en forma de polinomio para obtener las ra\u00edces y las veces que ocurren con la instrucci\u00f3n <code>sym.roots()<\/code>.<\/p>\n\n\n\n<p>La expresi\u00f3n de H(s) en fracciones parciales se obtienen usando <code>sym.apart(Hs,s)<\/code>.<\/p>\n\n\n<div class=\"wp-block-syntaxhighlighter-code alignwide\"><pre class=\"brush: python; title: ; notranslate\" title=\"\">\n# Busca Polos y Ceros de H(s) con Sympy\n# Ps es numerador, Qs es denominador\nimport sympy as sym\n\n# INGRESO\ns = sym.Symbol('s')\n\nPs = 2*s + 4\nQs = s**2 + 4*s + 3\nHs = Ps\/Qs\n\n# PROCEDIMIENTO\nHs = sym.sympify(Hs) # convierte a sympy una constante\nHs = sym.simplify(Hs,inverse=True) # agrupa terminos\n\n# polos y ceros de Hs\n&#x5B;P,Q] = Hs.as_numer_denom()\nP = P.as_poly(s)  # numerador\nQ = Q.as_poly(s)  # denominador\nP_ceros = sym.roots(P)\nQ_polos = sym.roots(Q)\n\n# en factores\nHs = sym.factor(Hs,s)\n# fracciones parciales\nHs_fp = sym.apart(Hs,s)\n\n# SALIDA\nprint('H(s):')\nsym.pprint(Hs)\nprint('\\n H(s) en fracciones parciales ')\nsym.pprint(Hs_fp)\nprint('\\n {Q_polos:veces}:',Q_polos)\nprint('\\n {P_ceros:veces}:',P_ceros)\n<\/pre><\/div>\n\n\n<p>Para visualizar el concepto de polos y ceros, se presenta la gr\u00e1fica de polos y ceros en el dominio s, para un corte en el plano real. Por simplicidad se usar\u00e1 el procedimiento creado para el curso en telg1001.py<\/p>\n\n\n\n<p>Todos los polos y ceros se encuentran en el lado izquierdo del plano, es decir su parte real es negativa.<\/p>\n\n\n<div class=\"wp-block-syntaxhighlighter-code alignwide\"><pre class=\"brush: python; title: ; notranslate\" title=\"\">\n# GRAFICA -----------\nimport matplotlib.pyplot as plt\nimport telg1001 as ss\nfig_Hs = ss.graficar_Fs(Hs,Q_polos,P_ceros,f_nombre='H')\nplt.show()\n<\/pre><\/div>\n\n\n<figure class=\"wp-block-image aligncenter size-full\"><img loading=\"lazy\" decoding=\"async\" width=\"549\" height=\"449\" src=\"http:\/\/blog.espol.edu.ec\/algoritmos101\/files\/2017\/05\/Hs_PolosCeros_Ej01.png\" alt=\"Hs Polos Ceros Ej01\" class=\"wp-image-19950\" \/><\/figure>\n\n\n\n<p>Para revisar los polos de la expresi\u00f3n de fracciones parciales, se considera que los t\u00e9rminos de las expresiones podr\u00edan tener polos repetidos como en el ejemplo 3. Para polos repetidos, se usa el n\u00famero de <em><strong>veces<\/strong><\/em> mayor cuando aparecen polos de t\u00e9rminos suma.<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\" \/>\n\n\n\n<div class=\"wp-block-group has-medium-font-size is-layout-flex wp-block-group-is-layout-flex\">\n<p><a href=\"#hstransferencia\">H(s)<\/a><\/p>\n\n\n\n<p><a href=\"#polosnorepetidos\">polos reales <strong>no repetidos<\/strong><\/a><\/p>\n\n\n\n<p><a href=\"#gradosigualespq\">grados iguales P y Q<\/a><\/p>\n\n\n\n<p><a href=\"#polosrepetidos\">polos reales <strong>repetidos<\/strong><\/a><\/p>\n\n\n\n<p><a href=\"#poloscomplejo\">polos <strong>complejos<\/strong><\/a><\/p>\n\n\n\n<p><a href=\"#retrasotiempo\"><strong>exponencial s<\/strong> \/retraso<\/a><\/p>\n\n\n\n<p><a href=\"#buscapolosceros\">algoritmo busca_polosceros<\/a><\/p>\n\n\n\n<p><a href=\"#graficapolosceros\">gr\u00e1fica<\/a><\/p>\n\n\n\n<p><a href=\"#parametrocuadratico\">Q cuadr\u00e1ticos<\/a><\/p>\n\n\n\n<p><a href=\"#algoritmoQcuad\">algoritmo Q_cuad_s_parametros<\/a><\/p>\n<\/div>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\" \/>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"gradosigualespq\">3. Grados iguales de P(s) y Q(s), ceros con valores complejos<\/h2>\n\n\n\n<p><strong>Referencia<\/strong>: Lathi ejemplo 4.3b p338, Hsu ejercicio 3.20 p140, Oppenheim ejemplo 9.36 p716<\/p>\n\n\n<span class=\"wp-katex-eq katex-display\" data-display=\"true\"> H(s) = \\frac{2s^2 +5}{s^2 +3s+2}<\/span>\n\n\n\n<h3 class=\"wp-block-heading\">Ejemplo Desarrollo con Sympy-Python<\/h3>\n\n\n\n<p>Al algoritmo del ejercicio anterior se modifica solo el bloque de ingreso con las expresiones para numerador y denominador:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>Ps = 2*s**2+5\nQs = s**2 + 3*s + 2\nHs = Ps\/Qs<\/code><\/pre>\n\n\n\n<p>El resultado Hs_fp en fracciones parciales muestra que existe un t\u00e9rmino constante en las sumas de la expresi\u00f3n. La forma descrita por Lathi al inicio de la p\u00e1gina, la constante se la considera como 'ganancia(s)'.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>H(s):\n       2       \n    2*s  + 5   \n---------------\n(s + 1)*(s + 2)\n\n H(s) en fracciones parciales \n      13      7  \n2 - ----- + -----\n    s + 2   s + 1\n\n\n {Q_polos:veces}: {-1: 1, -2: 1}\n {P_ceros:veces}: {-sqrt(10)*I\/2: 1, sqrt(10)*I\/2: 1}\n&gt;&gt;&gt;<\/code><\/pre>\n\n\n\n<p>Por otra parte se tiene que los ceros tienen ra\u00edces con componente imaginario representado con el s\u00edmbolo '<code>I<\/code>', que para representar cada ra\u00edz en la gr\u00e1fica se considera el eje vertical tambi\u00e9n como parte <code>Imag(s)<\/code>. Si es cierto, es diferente a la naturaleza de <code>H(s)<\/code>, perdonen, se usa \u00e9sta \"libertad\" solo para resaltar la influencia de los polos en <code>H(s)<\/code> como se mostr\u00f3 en el ejercicio anterior, o se realizar\u00eda un gr\u00e1fico con el plano real e imaginario como base y una tercera dimensi\u00f3n para H(s).<\/p>\n\n\n\n<p>Los polos se encuentran en el lado izquierdo del plano, es decir su parte real es negativa.<\/p>\n\n\n\n<figure class=\"wp-block-image aligncenter size-full\"><img loading=\"lazy\" decoding=\"async\" width=\"590\" height=\"609\" src=\"http:\/\/blog.espol.edu.ec\/algoritmos101\/files\/2017\/05\/Hs_PolosCeros_Ej02.png\" alt=\"Hs Polos Ceros Ej02\" class=\"wp-image-19951\" \/><\/figure>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\" \/>\n\n\n\n<div class=\"wp-block-group has-medium-font-size is-layout-flex wp-block-group-is-layout-flex\">\n<p><a href=\"#hstransferencia\">H(s)<\/a><\/p>\n\n\n\n<p><a href=\"#polosnorepetidos\">polos reales <strong>no repetidos<\/strong><\/a><\/p>\n\n\n\n<p><a href=\"#gradosigualespq\">grados iguales P y Q<\/a><\/p>\n\n\n\n<p><a href=\"#polosrepetidos\">polos reales <strong>repetidos<\/strong><\/a><\/p>\n\n\n\n<p><a href=\"#poloscomplejo\">polos <strong>complejos<\/strong><\/a><\/p>\n\n\n\n<p><a href=\"#retrasotiempo\"><strong>exponencial s<\/strong> \/retraso<\/a><\/p>\n\n\n\n<p><a href=\"#buscapolosceros\">algoritmo busca_polosceros<\/a><\/p>\n\n\n\n<p><a href=\"#graficapolosceros\">gr\u00e1fica<\/a><\/p>\n\n\n\n<p><a href=\"#parametrocuadratico\">Q cuadr\u00e1ticos<\/a><\/p>\n\n\n\n<p><a href=\"#algoritmoQcuad\">algoritmo Q_cuad_s_parametros<\/a><\/p>\n<\/div>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\" \/>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"polosrepetidos\">4. Polos reales repetidos o ra\u00edces repetidas en denominador Q(s)<\/h2>\n\n\n\n<p><strong>Referencia<\/strong>: Lathi ejemplo 4.3d p342<\/p>\n\n\n<span class=\"wp-katex-eq katex-display\" data-display=\"true\"> H(s) = \\frac{8s+10}{(s+1)(s+2)^3}<\/span>\n\n\n\n<p>la forma de la expresi\u00f3n para el algoritmo es<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>Ps = 8*s+10\nQs = (s+1)*((s+2)**3)\n\nHs = Ps\/Qs<\/code><\/pre>\n\n\n\n<p>En \u00e9l ejercicio el t\u00e9rmino del denominador tiene un factor elevado al cubo, lo que muestra que la ra\u00edz es repetida y se debe reflejar en la respuesta del algoritmo. En las fracciones parciales se muestra que para el polo repetido existe un t\u00e9rmino suma para cada grado en el denominador.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>H(s):\n  2*(4*s + 5)   \n----------------\n               3\n(s + 1)*(s + 2) \n\n H(s) en fracciones parciales \n    2        2          6         2  \n- ----- - -------- + -------- + -----\n  s + 2          2          3   s + 1\n          (s + 2)    (s + 2)         \n\n {Q_polos:veces}: {-1: 1, -2: 3}\n {P_ceros:veces}: {-5\/4: 1}\n&gt;&gt;&gt; <\/code><\/pre>\n\n\n\n<p>Todos los polos y ceros se encuentran en el lado izquierdo del plano s.<\/p>\n\n\n\n<p>Se adjunta la gr\u00e1fica para la interpretaci\u00f3n de H(s). Revisar la escala en el eje imaginario, la mostrada est\u00e1 entre -50 y 50.<\/p>\n\n\n\n<figure class=\"wp-block-image aligncenter size-full\"><img loading=\"lazy\" decoding=\"async\" width=\"568\" height=\"451\" src=\"http:\/\/blog.espol.edu.ec\/algoritmos101\/files\/2017\/05\/Hs_PolosCeros_Ej03.png\" alt=\"Hs Polos Ceros Ej03\" class=\"wp-image-19952\" \/><\/figure>\n\n\n\n<p>Si la b\u00fasqueda de polos es sobre la expresi\u00f3n de fracciones parciales, se tiene que las veces se determinan como el mayor exponente del t\u00e9rmino del denominador.<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\" \/>\n\n\n\n<div class=\"wp-block-group has-medium-font-size is-layout-flex wp-block-group-is-layout-flex\">\n<p><a href=\"#hstransferencia\">H(s)<\/a><\/p>\n\n\n\n<p><a href=\"#polosnorepetidos\">polos reales <strong>no repetidos<\/strong><\/a><\/p>\n\n\n\n<p><a href=\"#gradosigualespq\">grados iguales P y Q<\/a><\/p>\n\n\n\n<p><a href=\"#polosrepetidos\">polos reales <strong>repetidos<\/strong><\/a><\/p>\n\n\n\n<p><a href=\"#poloscomplejo\">polos <strong>complejos<\/strong><\/a><\/p>\n\n\n\n<p><a href=\"#retrasotiempo\"><strong>exponencial s<\/strong> \/retraso<\/a><\/p>\n\n\n\n<p><a href=\"#buscapolosceros\">algoritmo busca_polosceros<\/a><\/p>\n\n\n\n<p><a href=\"#graficapolosceros\">gr\u00e1fica<\/a><\/p>\n\n\n\n<p><a href=\"#parametrocuadratico\">Q cuadr\u00e1ticos<\/a><\/p>\n\n\n\n<p><a href=\"#algoritmoQcuad\">algoritmo Q_cuad_s_parametros<\/a><\/p>\n<\/div>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\" \/>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"poloscomplejo\">5. H(s) con Fracciones parciales y polos de tipo complejo<\/h2>\n\n\n\n<p><strong>Referencia<\/strong>: Lathi ejemplo 4.3c p340<\/p>\n\n\n<span class=\"wp-katex-eq katex-display\" data-display=\"true\"> H(s) = \\frac{6(s+34)}{s(s^2+10s+34)}<\/span>\n\n\n\n<p>la forma de la expresi\u00f3n para el algoritmo es<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>Ps = 6*(s+34)\nQs = s*(s**2+10*s+34)\n\nHs = Ps\/Qs<\/code><\/pre>\n\n\n\n<p>Incorporando las instrucciones para identificar si el denominador tiene ra\u00edces complejas, se asignan los valores de los par\u00e1metros necesarios en un diccionario de variables, obteniendo como resultado,<\/p>\n\n\n\n<pre class=\"wp-block-code alignwide\"><code>H(s):\n    6*(s + 34)    \n------------------\n  \/ 2            \\\ns*\\s  + 10*s + 34\/\n\n H(s) en fracciones parciales \n    6*(s + 9)      6\n- -------------- + -\n   2               s\n  s  + 10*s + 34    \n\n {Q_polos:veces}: {-5 - 3*I: 1, -5 + 3*I: 1, 0: 1}\n {P_ceros:veces}: {-34: 1}\n&gt;&gt;&gt; <\/code><\/pre>\n\n\n\n<p>gr\u00e1fica ejemplo<\/p>\n\n\n\n<figure class=\"wp-block-image aligncenter size-full\"><img loading=\"lazy\" decoding=\"async\" width=\"558\" height=\"452\" src=\"http:\/\/blog.espol.edu.ec\/algoritmos101\/files\/2017\/05\/Hs_PolosCeros_Ej04.png\" alt=\"Hs Polos Ceros Ej04\" class=\"wp-image-19953\" \/><\/figure>\n\n\n\n<h3 class=\"wp-block-heading\">Ejemplo Instrucciones en Python<\/h3>\n\n\n<div class=\"wp-block-syntaxhighlighter-code alignwide\"><pre class=\"brush: python; title: ; notranslate\" title=\"\">\n# Fracciones parciales de H(s) con Sympy\n# Ps es numerador, Qs es denominador\n# con Transformada Inversa de Laplace\nimport numpy as np\nimport sympy as sym\n\n# INGRESO\ns = sym.Symbol('s')\nt = sym.Symbol('t', real=True)\n\nPs = 6*(s+34) \nQs = s*(s**2+10*s+34)\n\nHs = Ps\/Qs\n\n# PROCEDIMIENTO\nHs = sym.simplify(Hs,inverse=True)\n# Hs deber\u00eda ser un solo termino suma\nHs = sym.factor(Hs,s)\n# fracciones parciales\nHsp = sym.apart(Hs,s)\n\n# Analiza polos\ndef polosceros_simple(Hs):\n    ''' Busca_polo de un termino sin exp(-a*s)\n    '''\n    Hs = sym.simplify(Hs,inverse=True)\n    # Hs deber\u00eda ser un solo termino suma\n    Hs_factor = sym.factor(Hs,s)\n    # polos y ceros de termino Hs\n    &#x5B;P,Q] = Hs_factor.as_numer_denom()\n    P = sym.poly(P,s)  # numerador\n    Q = sym.poly(Q,s)  # denominador\n    P_ceros = sym.roots(P)\n    Q_polos = sym.roots(Q)\n    respuesta = {'Q_polos' : Q_polos,\n                 'P_ceros' : P_ceros}\n    return(respuesta)\n\npolosceros = polosceros_simple(Hs)\n\n# SALIDA\nprint('H(s):')\nsym.pprint(Hs)\nprint('\\n H(s) en fracciones parciales ')\nsym.pprint(Hsp)\nprint('\\n {Q_polos:veces}:',polosceros&#x5B;'Q_polos'])\nprint(' {P_ceros:veces}:',polosceros&#x5B;'P_ceros'])\n<\/pre><\/div>\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\" \/>\n\n\n\n<div class=\"wp-block-group has-medium-font-size is-layout-flex wp-block-group-is-layout-flex\">\n<p><a href=\"#hstransferencia\">H(s)<\/a><\/p>\n\n\n\n<p><a href=\"#polosnorepetidos\">polos reales <strong>no repetidos<\/strong><\/a><\/p>\n\n\n\n<p><a href=\"#gradosigualespq\">grados iguales P y Q<\/a><\/p>\n\n\n\n<p><a href=\"#polosrepetidos\">polos reales <strong>repetidos<\/strong><\/a><\/p>\n\n\n\n<p><a href=\"#poloscomplejo\">polos <strong>complejos<\/strong><\/a><\/p>\n\n\n\n<p><a href=\"#retrasotiempo\"><strong>exponencial s<\/strong> \/retraso<\/a><\/p>\n\n\n\n<p><a href=\"#buscapolosceros\">algoritmo busca_polosceros<\/a><\/p>\n\n\n\n<p><a href=\"#graficapolosceros\">gr\u00e1fica<\/a><\/p>\n\n\n\n<p><a href=\"#parametrocuadratico\">Q cuadr\u00e1ticos<\/a><\/p>\n\n\n\n<p><a href=\"#algoritmoQcuad\">algoritmo Q_cuad_s_parametros<\/a><\/p>\n<\/div>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\" \/>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"retrasotiempo\">6. Con suma de t\u00e9rminos y exponenciales de retraso en tiempo<\/h2>\n\n\n<span class=\"wp-katex-eq katex-display\" data-display=\"true\"> H(s) = \\frac{s+2}{s-1}+ \\frac{e^{-2s}}{s-2} <\/span>\n\n\n\n<p>la expresi\u00f3n para el algoritmo se escribe como:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>Hs = ((s+2)\/(s-1)) + sym.exp(-2*s)\/(s-2)<\/code><\/pre>\n\n\n\n<p>Para el segundo t\u00e9rmino que tiene un exponencial, no se puede aplicar directamente la instrucci\u00f3n <code>sym.apart(Hs,s)<\/code> al no ser reconocida como tipo polinomio. Para continuar se debe separar el t\u00e9rmino <code>sym.exp()<\/code> del resto de la expresi\u00f3n, y se podr\u00e1 aplicar fracciones parciales a esa parte, para luego volver a poner el t\u00e9rmino.<\/p>\n\n\n\n<p>Para facilitar el desarrollo del algoritmo, se recomienda empezar a analizar una expresi\u00f3n mas simple, como solamente el segundo t\u00e9rmino de la suma.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code> expresion H(s):\n         -2*s\ns + 2   e    \n----- + -----\ns - 1   s - 2\n\nPolos y ceros:\nt\u00e9rmino: 1 * (s + 2)\/(s - 1)\n Q_polos{polos:veces}:  {1: 1}\n P_ceros{polos:veces}:  {-2: 1}\nt\u00e9rmino: exp(-2*s) * 1\/(s - 2)\n Q_polos{polos:veces}:  {2: 1}\n P_ceros{polos:veces}:  {}\n<span style=\"color: #ff00ff\">&gt;&gt;&gt;<\/span><\/code><\/pre>\n\n\n\n<figure class=\"wp-block-image aligncenter size-full\"><img loading=\"lazy\" decoding=\"async\" width=\"549\" height=\"448\" src=\"http:\/\/blog.espol.edu.ec\/algoritmos101\/files\/2017\/05\/Hs_PolosCeros_Ej05.png\" alt=\"Hs Polos Ceros Ej05\" class=\"wp-image-19954\" \/><\/figure>\n\n\n\n<p>En el algoritmo se empieza por determinar si la expresi\u00f3n de Hs tiene t\u00e9rminos sym.exp(-s), la instrucci\u00f3n que permite listar estos t\u00e9rminos es<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>lista_exp = list(Hs.atoms(sym.exp(-s)))<\/code><\/pre>\n\n\n\n<p>como la expresi\u00f3n H(s) en los ejercicios puede contener sumas o multiplicaciones de bloques, primero se simplifica la expresi\u00f3n H(s)<\/p>\n\n\n<div class=\"wp-block-syntaxhighlighter-code \"><pre class=\"brush: python; first-line: 53; title: ; notranslate\" title=\"\">\n    # convierte a Sympy si es solo constante\n    Hs = sym.sympify(Hs)\n    # simplifica operaci\u00f3n Hs1(s)*Hs2(s)\n    Hs = sym.expand_power_exp(Hs)\n    Hs = sym.expand(Hs, power_exp=False)\n    \n    term_sum = sym.Add.make_args(Hs)\n    Hs_0 = 0*s # reagrupa Fs\n    for term_k in term_sum:\n        term_k = sym.simplify(term_k)\n        term_k = sym.expand_power_exp(term_k)\n        Hs_0 = Hs_0 + term_k\n    \n    # tabula sym.exp(-s) en lista_exp\n    lista_exp = list(Hs_0.atoms(sym.exp(-s)))\n    if len(lista_exp)&gt;0: # elimina constantes\n        for k in lista_exp:\n            if not(k.has(s)): # es constante\n                lista_exp.remove(k)\n<\/pre><\/div>\n\n\n<p>luego se tabula la lista_exp y se eliminan los t\u00e9rminos que pueden ser constantes o no dependen de 's', por ejemplo sym.exp(10).<\/p>\n\n\n\n<p>Luego se separa la expresi\u00f3n por grupos usando sym.collect() creando un diccionario con los elementos de la lista_exp y con las expresiones agrupadas.<\/p>\n\n\n\n<pre class=\"wp-block-code alignwide\"><code>    <span style=\"color: #ff0000\"># separados por lista_exp<\/span>\n    separados = sym.collect(Hs_0,lista_exp,evaluate=<span style=\"color: #d35400\">False<\/span>)<\/code><\/pre>\n\n\n\n<p>Con los elementos separados se puede aplicar la b\u00fasqueda de polos y ceros para cada elemento de la lista con la funci\u00f3n <code>polosceros_simple(Hs_k)<\/code><\/p>\n\n\n\n<p>Al final se pueden agrupar los Q_polos y P_ceros de toda la expresi\u00f3n siguiendo criterios como que las veces que ocurre cada polo es el m\u00e1ximo entre los t\u00e9rminos separados por lista_exp.<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\" \/>\n\n\n\n<div class=\"wp-block-group has-medium-font-size is-layout-flex wp-block-group-is-layout-flex\">\n<p><a href=\"#hstransferencia\">H(s)<\/a><\/p>\n\n\n\n<p><a href=\"#polosnorepetidos\">polos reales <strong>no repetidos<\/strong><\/a><\/p>\n\n\n\n<p><a href=\"#gradosigualespq\">grados iguales P y Q<\/a><\/p>\n\n\n\n<p><a href=\"#polosrepetidos\">polos reales <strong>repetidos<\/strong><\/a><\/p>\n\n\n\n<p><a href=\"#poloscomplejo\">polos <strong>complejos<\/strong><\/a><\/p>\n\n\n\n<p><a href=\"#retrasotiempo\"><strong>exponencial s<\/strong> \/retraso<\/a><\/p>\n\n\n\n<p><a href=\"#buscapolosceros\">algoritmo busca_polosceros<\/a><\/p>\n\n\n\n<p><a href=\"#graficapolosceros\">gr\u00e1fica<\/a><\/p>\n\n\n\n<p><a href=\"#parametrocuadratico\">Q cuadr\u00e1ticos<\/a><\/p>\n\n\n\n<p><a href=\"#algoritmoQcuad\">algoritmo Q_cuad_s_parametros<\/a><\/p>\n<\/div>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\" \/>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"buscapolosceros\">6.1 Algoritmo como funci\u00f3n busca_polosceros()<\/h2>\n\n\n<div class=\"wp-block-syntaxhighlighter-code alignwide\"><pre class=\"brush: python; title: ; notranslate\" title=\"\">\n# Busca Polos y Ceros de H(s) con Sympy\n# separa t\u00e9rminos con sym.exp(-a*s)\n# Ps es numerador, Qs es denominador\nimport numpy as np\nimport sympy as sym\nimport matplotlib.pyplot as plt\nimport telg1001 as ss\n\n# INGRESO\ns = sym.Symbol('s')\n\n# Ps = (2*s + 4)\n# Qs = s**2 + 4*s + 3\n\n# Ps = 2*s**2+5\n# Qs = s**2 + 3*s + 2\n\n# Ps = 8*s+10\n# Qs = (s+1)*((s+2)**3)\n\n# Ps = 6*(s+34)\n# Qs = s*(s**2+10*s+34)\n\n# Hs = Ps\/Qs\n# Hs = sym.exp(-2*s)\/(s-2)\n# Hs = 1\/s - sym.exp(-2*s)\/s\n# Hs = sym.exp(-2*s)\/s -sym.exp(-4*s)\/s\n# Hs = (2*s**2+5*s+12)\/((s+2)*(s**2+2*s+10))\nHs = ((s+2)\/(s-1)) + sym.exp(-2*s)\/(s-2)\n\n# PROCEDIMIENTO\ndef busca_polosceros(Hs):\n    ''' Busca polos de Hs (divisiones para cero)\n        y ceros de Hs,cuenta las veces que aparecen,\n        agrupa por exp(-a*s) agrupado en factores.\n    '''\n    def polosceros_simple(Hs):\n        ''' Busca_polo de un termino sin exp(-a*s)\n        '''\n        Hs = sym.simplify(Hs,inverse=True)\n        # Hs deber\u00eda ser un solo termino suma\n        Hs_factor = sym.factor(Hs,s)\n        # polos y ceros de termino Hs\n        &#x5B;P,Q] = Hs_factor.as_numer_denom()\n        P = sym.poly(P,s)  # numerador\n        Q = sym.poly(Q,s)  # denominador\n        P_ceros = sym.roots(P)\n        Q_polos = sym.roots(Q)\n        respuesta = {'Q_polos' : Q_polos,\n                     'P_ceros' : P_ceros}\n        return(respuesta)\n    \n    # convierte a Sympy si es solo constante\n    Hs = sym.sympify(Hs)\n    # simplifica operaci\u00f3n Hs1(s)*Hs2(s)\n    Hs = sym.expand_power_exp(Hs)\n    Hs = sym.expand(Hs, power_exp=False)\n    \n    term_sum = sym.Add.make_args(Hs)\n    Hs_0 = 0*s # reagrupa Fs\n    for term_k in term_sum:\n        term_k = sym.simplify(term_k)\n        term_k = sym.expand_power_exp(term_k)\n        Hs_0 = Hs_0 + term_k\n    \n    # tabula sym.exp(-s) en lista_exp\n    lista_exp = list(Hs_0.atoms(sym.exp(-s)))\n    if len(lista_exp)&gt;0: # elimina constantes\n        for k in lista_exp:\n            if not(k.has(s)): # es constante\n                lista_exp.remove(k)\n\n    # separados por lista_exp\n    separados = sym.collect(Hs_0,lista_exp,evaluate=False)\n\n    # polos y ceros por terminos exp(-s) agrupados\n    polosceros = {} ; Hs_fp = 0\n    for k in separados:\n        Hs_k = sym.factor(separados&#x5B;k],s)\n        PZ_k = polosceros_simple(Hs_k)\n        PZ_k&#x5B;'Hs_k']  = Hs_k\n        polosceros&#x5B;k] = PZ_k\n\n    # integra polos\n    Q_polos = {} ; P_ceros = {}\n    for k in polosceros:\n        polos = polosceros&#x5B;k]&#x5B;'Q_polos']\n        for unpolo in polos:\n            if unpolo in Q_polos:\n                veces = max(&#x5B;Q_polos&#x5B;unpolo],polos&#x5B;unpolo]])\n                Q_polos&#x5B;unpolo] = veces\n            else:\n                Q_polos&#x5B;unpolo] = polos&#x5B;unpolo]\n        ceros = polosceros&#x5B;k]&#x5B;'P_ceros']\n        for uncero in ceros:\n            if uncero in P_ceros:\n                veces = max(&#x5B;P_ceros&#x5B;uncero],ceros&#x5B;uncero]])\n                P_ceros&#x5B;uncero] = veces\n            else:\n                P_ceros&#x5B;uncero] = ceros&#x5B;uncero]\n    # revisa exp(-a*s)\n    if len(lista_exp)==0: #sin componentes\n        del polosceros&#x5B;'1']\n    polosceros&#x5B;'Q_polos'] = Q_polos\n    polosceros&#x5B;'P_ceros'] = P_ceros\n    return(polosceros)\n\npolosceros = busca_polosceros(Hs)\n\n# SALIDA\nprint('\\n expresion H(s):')\nsym.pprint(Hs)\nprint('\\nPolos y ceros:')\nlista_PZ = &#x5B;'Q_polos','P_ceros']\nfor k in polosceros:\n    if not(k in lista_PZ):\n        print('t\u00e9rmino:', k,'*',polosceros&#x5B;k]&#x5B;'Hs_k'])\n        print(' Q_polos{polos:veces}: ',polosceros&#x5B;k]&#x5B;'Q_polos'])\n        print(' P_ceros{polos:veces}: ',polosceros&#x5B;k]&#x5B;'P_ceros'])\n    else:\n        print(k,polosceros&#x5B;k])\n<\/pre><\/div>\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\" \/>\n\n\n\n<div class=\"wp-block-group has-medium-font-size is-layout-flex wp-block-group-is-layout-flex\">\n<p><a href=\"#hstransferencia\">H(s)<\/a><\/p>\n\n\n\n<p><a href=\"#polosnorepetidos\">polos reales <strong>no repetidos<\/strong><\/a><\/p>\n\n\n\n<p><a href=\"#gradosigualespq\">grados iguales P y Q<\/a><\/p>\n\n\n\n<p><a href=\"#polosrepetidos\">polos reales <strong>repetidos<\/strong><\/a><\/p>\n\n\n\n<p><a href=\"#poloscomplejo\">polos <strong>complejos<\/strong><\/a><\/p>\n\n\n\n<p><a href=\"#retrasotiempo\"><strong>exponencial s<\/strong> \/retraso<\/a><\/p>\n\n\n\n<p><a href=\"#buscapolosceros\">algoritmo busca_polosceros<\/a><\/p>\n\n\n\n<p><a href=\"#graficapolosceros\">gr\u00e1fica<\/a><\/p>\n\n\n\n<p><a href=\"#parametrocuadratico\">Q cuadr\u00e1ticos<\/a><\/p>\n\n\n\n<p><a href=\"#algoritmoQcuad\">algoritmo Q_cuad_s_parametros<\/a><\/p>\n<\/div>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\" \/>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"graficapolosceros\">6.2 gr\u00e1fica de polos y ceros<\/h2>\n\n\n\n<p>La gr\u00e1fica en \u00e9ste caso se realiza usando Hs y sus componentes, de \u00e9sta forma es posible visualizar el efecto de cada componente con sus polos y ceros.<\/p>\n\n\n<div class=\"wp-block-syntaxhighlighter-code alignwide\"><pre class=\"brush: python; title: ; notranslate\" title=\"\">\n# GRAFICA ----------------------\ndef graficar_Fs2(Fs,Q_polos={},P_ceros={},\n                s_a=1,s_b=0,muestras=101,f_nombre='F',\n                solopolos=False,polosceros={}):\n    # grafica Fs\n    lista_Hs =&#x5B;]\n\n    lista_PZ = &#x5B;'Q_polos','P_ceros']\n    lista_term = list(polosceros.keys())\n    lista_term.remove('Q_polos')\n    lista_term.remove('P_ceros')\n\n    # intervalo para s,y componentes Fs con exp(-a*s)\n    s_a = 0 ; s_b = 0 ; Lista_Hs = &#x5B;]\n    cond_componente = False\n    if len(lista_term)&gt;0:\n        cond_componente = True\n        if len(polosceros)&gt;1: # tiene componenes con exp(-a*s)\n            lista_Hs.append(&#x5B;Hs,{},{}])\n        for k in polosceros:\n            if not(k in lista_PZ):\n                Q_polosk = polosceros&#x5B;k]&#x5B;'Q_polos']\n                P_cerosk = polosceros&#x5B;k]&#x5B;'P_ceros']\n                &#x5B;s_ak,s_bk] = ss.intervalo_s(Q_polosk,P_cerosk)\n                s_a = min(s_a,s_ak)\n                s_b = max(s_b,s_bk)\n                lista_Hs.append(&#x5B;polosceros&#x5B;k]&#x5B;'Hs_k']*sym.sympify(k),\n                                 Q_polosk,P_cerosk])\n    else: #sin componenes con exp(-a*s)\n        lista_Hs.append(&#x5B;Hs,polosceros&#x5B;'Q_polos'],polosceros&#x5B;'P_ceros']])\n        &#x5B;s_a,s_b] = ss.intervalo_s(polosceros&#x5B;'Q_polos'],\n                                       polosceros&#x5B;'P_ceros'])\n    # graficas por cada componente\n    fig_Fs, graf_Fs = plt.subplots()\n    # no presenta errores de divisi\u00f3n para cero en lambdify()\n    np.seterr(divide='ignore', invalid='ignore')\n    for k in lista_Hs:\n        Fs_k = k&#x5B;0] ;Q_polosk = k&#x5B;1] ;P_cerosk = k&#x5B;2]\n        \n        # convierte a sympy una constante\n        Fs_k = sym.sympify(Fs_k,s) \n        if Fs_k.has(s): # no es constante\n            F_s = sym.lambdify(s,Fs_k,modules=ss.equivalentes)\n        else:\n            F_s = lambda s: Fs_k + 0*s\n        \n        s_i = np.linspace(s_a,s_b,muestras)\n        Fsi = F_s(s_i) # Revisar cuando s es complejo\n        lineaestilo = 'solid'\n        if len(Q_polosk)&gt;0 and cond_componente:\n            lineaestilo = 'dashed'\n            \n        graf_Fs.plot(s_i,Fsi,label=Fs_k,linestyle=lineaestilo)\n        lineacolor = plt.gca().lines&#x5B;-1].get_color()\n\n        if len(Q_polosk)&gt;0:\n            polo_re = &#x5B;] ; polo_im = &#x5B;]\n            for polos in Q_polosk.keys():    \n                graf_Fs.axvline(sym.re(polos),color='red',\n                                linestyle='dotted')\n                x_polo = sym.re(polos)\n                y_polo = sym.im(polos)\n                polo_re.append(x_polo)\n                polo_im.append(y_polo)\n                etiqueta = &quot;(&quot;+str(x_polo)+','+str(y_polo)+&quot;)&quot;\n                graf_Fs.annotate(etiqueta,(x_polo,y_polo))\n        \n            graf_Fs.scatter(polo_re,polo_im,marker='x',\n                            color =lineacolor,\n                            label = Q_polosk)\n        if len(P_cerosk)&gt;0:\n            cero_re = &#x5B;] ; cero_im = &#x5B;]\n            for cero in P_cerosk.keys():    \n                x_cero = sym.re(cero)\n                y_cero = sym.im(cero)\n                cero_re.append(x_cero)\n                cero_im.append(y_cero)\n                etiqueta = &quot;(&quot;+str(x_cero)+','+str(y_cero)+&quot;)&quot;\n                graf_Fs.annotate(etiqueta,(x_cero,y_cero))\n        \n            graf_Fs.scatter(cero_re,cero_im,marker='o',\n                            color =lineacolor,\n                            label = P_cerosk)\n\n    graf_Fs.axvline(0,color='gray')\n    graf_Fs.legend()\n    graf_Fs.set_xlabel('Real(s)')\n    graf_Fs.set_ylabel('F(s) ; Imag(s)')\n    graf_Fs.set_title(r'F(s) = $'+str(sym.latex(Hs))+'$')\n    graf_Fs.grid()\n    return(fig_Fs)\n\ngraficar_Fs2(Hs,polosceros=polosceros)\nplt.show()\n<\/pre><\/div>\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\" \/>\n\n\n\n<div class=\"wp-block-group has-medium-font-size is-layout-flex wp-block-group-is-layout-flex\">\n<p><a href=\"#hstransferencia\">H(s)<\/a><\/p>\n\n\n\n<p><a href=\"#polosnorepetidos\">polos reales <strong>no repetidos<\/strong><\/a><\/p>\n\n\n\n<p><a href=\"#gradosigualespq\">grados iguales P y Q<\/a><\/p>\n\n\n\n<p><a href=\"#polosrepetidos\">polos reales <strong>repetidos<\/strong><\/a><\/p>\n\n\n\n<p><a href=\"#poloscomplejo\">polos <strong>complejos<\/strong><\/a><\/p>\n\n\n\n<p><a href=\"#retrasotiempo\"><strong>exponencial s<\/strong> \/retraso<\/a><\/p>\n\n\n\n<p><a href=\"#buscapolosceros\">algoritmo busca_polosceros<\/a><\/p>\n\n\n\n<p><a href=\"#graficapolosceros\">gr\u00e1fica<\/a><\/p>\n\n\n\n<p><a href=\"#parametrocuadratico\">Q cuadr\u00e1ticos<\/a><\/p>\n\n\n\n<p><a href=\"#algoritmoQcuad\">algoritmo Q_cuad_s_parametros<\/a><\/p>\n<\/div>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\" \/>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"parametrocuadratico\">7. Parametros cuadr\u00e1ticos<\/h2>\n\n\n\n<p>Para el ejercicio 5, se tienen polos con valores complejos y para usar la tabla de transformadas de Laplace se requiere obtener algunos par\u00e1metros.<\/p>\n\n\n\n<p><strong>Referencia<\/strong>: Lathi ejemplo 4.3c p340<\/p>\n\n\n<span class=\"wp-katex-eq katex-display\" data-display=\"true\"> H(s) = \\frac{6(s+34)}{s(s^2+10s+34)}<\/span>\n\n\n\n<p>el desarrollo se puede describir como<\/p>\n\n\n<span class=\"wp-katex-eq katex-display\" data-display=\"true\"> H(s) = \\frac{6(s+34)}{s(s^2+10s+34)} = \\frac{k_1}{s} + \\frac{As+B}{s^2+10s+34}<\/span>\n\n\n\n<p>usando el m\u00e9todo de Heaviside, se obtiene k<sub>1<\/sub><\/p>\n\n\n<span class=\"wp-katex-eq katex-display\" data-display=\"true\"> k_1 = \\frac{6(s+34)}{\\cancel{s}(s^2+10s+34)}\\Big|_{s=0} =\\frac{6(0+34)}{(0^2+10(0)+34)} = \\frac{6(34)}{34}=6<\/span>\n\n\n<span class=\"wp-katex-eq katex-display\" data-display=\"true\"> \\frac{6(s+34)}{s(s^2+10s+34)} = \\frac{6}{s} + \\frac{As+B}{s^2+10s+34}<\/span>\n\n\n\n<p>se simplifican las fracciones al multiplicar ambos lados por s(s<sup>2<\/sup>+10s+34)<\/p>\n\n\n<span class=\"wp-katex-eq katex-display\" data-display=\"true\"> 6(s+34) = 6(s^2+10s+34) + (As+B)s <\/span>\n\n\n<span class=\"wp-katex-eq katex-display\" data-display=\"true\"> 6s+204 = 6s^2+60s+204 + A s^2+Bs<\/span>\n\n\n<span class=\"wp-katex-eq katex-display\" data-display=\"true\"> 6s+204 = (6+A)s^2+(60+B)s+204<\/span>\n\n\n\n<p>se puede observar que 6+A=0, por lo que A=-6.<br>Tambi\u00e9n se tiene que 60+B=6, por lo que B=-54<br>quedando la expresi\u00f3n como:<\/p>\n\n\n<span class=\"wp-katex-eq katex-display\" data-display=\"true\"> H(s) = \\frac{6}{s} + \\frac{-6s-54}{s^2+10s+34}<\/span>\n\n\n\n<p>Observando la <a href=\"https:\/\/blog.espol.edu.ec\/algoritmos101\/ss-u04\/transformada-laplace-tabla\/\" data-type=\"post\" data-id=\"1344\">tabla de transformadas de Laplace<\/a> se compara la expresi\u00f3n con las filas 12c y 12d se usan los par\u00e1metros de:<\/p>\n\n\n<span class=\"wp-katex-eq katex-display\" data-display=\"true\"> \\frac{As+B}{s^2+2as+c}<\/span>\n\n\n\n<p>A= -6, B=-64, a=5, c = 34<br>y se calculan:<\/p>\n\n\n<span class=\"wp-katex-eq katex-display\" data-display=\"true\"> b = \\sqrt{c-a^2} = \\sqrt{34-(5)^2} = 3 <\/span>\n\n\n<span class=\"wp-katex-eq katex-display\" data-display=\"true\"> r = \\sqrt{\\frac{A^2 c +B^2 -2ABa}{c-a^2}}<\/span>\n\n\n<span class=\"wp-katex-eq katex-display\" data-display=\"true\"> r = \\sqrt{\\frac{(-6)^2 (34) +(-64)^2 -2(-6)(-64)(5)}{(34)-(5)^2}}=10<\/span>\n\n\n<span class=\"wp-katex-eq katex-display\" data-display=\"true\"> \\theta = \\tan ^{-1} \\Bigg( \\frac{(-6)(5)-(-64)}{(-6)\\sqrt{34-(5)^2}} \\Bigg) = -0.9272<\/span>\n\n\n\n<p>con lo que se puede escribir la <a href=\"https:\/\/blog.espol.edu.ec\/algoritmos101\/ss-u04\/transformada-laplace-tabla\/\" data-type=\"post\" data-id=\"1344\">transformada inversa de Laplace<\/a> para h(t) como<\/p>\n\n\n<span class=\"wp-katex-eq katex-display\" data-display=\"true\"> h(t) = [6+10e^{-5t}\\cos (3t--0.9272)] \\mu (t)<\/span>\n\n\n\n<p>o la otra forma de expresi\u00f3n usando la fila 12d de la tabla<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\" \/>\n\n\n\n<div class=\"wp-block-group has-medium-font-size is-layout-flex wp-block-group-is-layout-flex\">\n<p><a href=\"#hstransferencia\">H(s)<\/a><\/p>\n\n\n\n<p><a href=\"#polosnorepetidos\">polos reales <strong>no repetidos<\/strong><\/a><\/p>\n\n\n\n<p><a href=\"#gradosigualespq\">grados iguales P y Q<\/a><\/p>\n\n\n\n<p><a href=\"#polosrepetidos\">polos reales <strong>repetidos<\/strong><\/a><\/p>\n\n\n\n<p><a href=\"#poloscomplejo\">polos <strong>complejos<\/strong><\/a><\/p>\n\n\n\n<p><a href=\"#retrasotiempo\"><strong>exponencial s<\/strong> \/retraso<\/a><\/p>\n\n\n\n<p><a href=\"#buscapolosceros\">algoritmo busca_polosceros<\/a><\/p>\n\n\n\n<p><a href=\"#graficapolosceros\">gr\u00e1fica<\/a><\/p>\n\n\n\n<p><a href=\"#parametrocuadratico\">Q cuadr\u00e1ticos<\/a><\/p>\n\n\n\n<p><a href=\"#algoritmoQcuad\">algoritmo Q_cuad_s_parametros<\/a><\/p>\n<\/div>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\" \/>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"algoritmoQcuad\">7.1 Algoritmo como funci\u00f3n <\/h2>\n\n\n\n<p>Incorporando las instrucciones para identificar si el denominador tiene ra\u00edces complejas, se asignan los valores de los par\u00e1metros necesarios en un diccionario de variables, obteniendo como resultado,<\/p>\n\n\n\n<pre class=\"wp-block-code alignwide\"><code>H(s) en fracciones parciales:\n    6*(s + 9)      6\n- -------------- + -\n   2               s\n  s  + 10*s + 34    \n\n parametros de Q_cuadratico: \n  -6*(s + 9)\/(s**2 + 10*s + 34)  :\n   {'A': -6.0, 'B': -54.0, 'a': 5.0, 'c': 34.0, 'r': 10.0, 'b': 3.0, 'theta': -0.9272952180016122}\n&gt;&gt;&gt; \n<\/code><\/pre>\n\n\n\n<p>mientras que el algoritmo se resume en<\/p>\n\n\n<div class=\"wp-block-syntaxhighlighter-code alignwide\"><pre class=\"brush: python; title: ; notranslate\" title=\"\">\n# Fracciones parciales de H(s) con Sympy\n# Ps es numerador, Qs es denominador\n# con Transformada Inversa de Laplace\nimport numpy as np\nimport sympy as sym\nimport telg1001 as ss\n\n# INGRESO\ns = sym.Symbol('s')\nt = sym.Symbol('t', real=True)\n\nPs = 6*(s+34) \nQs = s*(s**2+10*s+34)\n\nHs = Ps\/Qs\n\n# PROCEDIMIENTO\n# parametros de termino con Q cuadratico\ndef Q_cuad_s_parametros(Hs):\n    '''Si Q tiene grado=2, obtiene los parametros\n       para la tabla de Transformadas Inversas de Laplace\n    '''\n    def Q_cuad_sin_exp(Hs):\n        '''para Hs sin sym.exp(-a*s)\n        '''\n        # fracciones parciales NO separa Q con factores complejos\n        Hs_fp = sym.apart(Hs,s)\n        respuesta = {}\n        term_suma = sym.Add.make_args(Hs_fp)\n        for term_k in term_suma:\n            &#x5B;P,Q]  = term_k.as_numer_denom()\n            if sym.degree(Q) == 2 and sym.degree(P) == 1:\n                P_coef = P.as_coefficients_dict(s)\n                Q_coef = Q.as_coefficients_dict(s)\n                Q0 = 1 # Normalizar coefficiente s**2=1\n                if Q_coef&#x5B;s**2]!=1: \n                    Q0 = Q_coef&#x5B;s**2]\n                # Parametros de Q cuadratico\n                a = 0 ; c = 0\n                if s**1 in Q_coef:\n                    a = float(Q_coef&#x5B;s**1]\/Q0)\/2\n                if s**0 in Q_coef:\n                    c = float(Q_coef&#x5B;s**0]\/Q0)\n                A = float(P_coef&#x5B;s**1])\n                B = 0\n                if s**0 in P_coef:\n                    B = float(P_coef&#x5B;s**0])\n                rP = (A**2)*c + B**2 - 2*A*B*a\n                rQ = c - a**2\n                r  = np.sqrt(rP\/rQ)\n                b  = np.sqrt(c-a**2)\n                thetaP = A*a-B\n                thetaQ = A*np.sqrt(c-a**2)\n                theta  = np.arctan(thetaP\/thetaQ)\n                parametro = {'A': A, 'B': B,'a': a, 'c': c,\n                             'r': r, 'b': b,'theta':theta}\n                respuesta&#x5B;term_k] = parametro\n        return (respuesta)\n\n    Hs = sym.sympify(Hs,s)\n    Hs_fp = ss.apart_s(Hs) # separa por sym.exp(-a*s)\n    # tabula sym.exp(-s) en lista_exp\n    lista_exp = list(Hs_fp.atoms(sym.exp(-s)))\n    if len(lista_exp)&gt;0: # elimina constantes\n        for k in lista_exp:\n            if not(k.has(s)): # es constante\n                lista_exp.remove(k)\n\n    # separados por lista_exp\n    separados = sym.collect(Hs_fp,lista_exp,evaluate=False)\n\n    Qs2 = {} # agrupa parametros Qs2\n    for k in separados:\n        Qs2_k = Q_cuad_sin_exp(separados&#x5B;k])\n        if len(Qs2_k)&gt;0:\n            for term in Qs2_k:\n                Qs2&#x5B;k*term] = Qs2_k&#x5B;term]\n    return(Qs2)\n\nHs_fp = ss.apart_s(Hs)\nQs2 = Q_cuad_s_parametros(Hs)\n\n# SALIDA\nprint('H(s) en fracciones parciales:')\nsym.pprint(Hs_fp)\n\n# parametros de termino con Q cuadratico\nif len(Qs2)&gt;0:\n    print('\\n parametros de Q_cuadratico: ')\n    for k in Qs2:\n        print(' ',k,' :')\n        print('  ',Qs2&#x5B;k])\n<\/pre><\/div>\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\" \/>\n\n\n\n<div class=\"wp-block-group has-medium-font-size is-layout-flex wp-block-group-is-layout-flex\">\n<p><a href=\"#hstransferencia\">H(s)<\/a><\/p>\n\n\n\n<p><a href=\"#polosnorepetidos\">polos reales <strong>no repetidos<\/strong><\/a><\/p>\n\n\n\n<p><a href=\"#gradosigualespq\">grados iguales P y Q<\/a><\/p>\n\n\n\n<p><a href=\"#polosrepetidos\">polos reales <strong>repetidos<\/strong><\/a><\/p>\n\n\n\n<p><a href=\"#poloscomplejo\">polos <strong>complejos<\/strong><\/a><\/p>\n\n\n\n<p><a href=\"#retrasotiempo\"><strong>exponencial s<\/strong> \/retraso<\/a><\/p>\n\n\n\n<p><a href=\"#buscapolosceros\">algoritmo busca_polosceros<\/a><\/p>\n\n\n\n<p><a href=\"#graficapolosceros\">gr\u00e1fica<\/a><\/p>\n\n\n\n<p><a href=\"#parametrocuadratico\">Q cuadr\u00e1ticos<\/a><\/p>\n\n\n\n<p><a href=\"#algoritmoQcuad\">algoritmo Q_cuad_s_parametros<\/a><\/p>\n<\/div>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\" \/>\n","protected":false},"excerpt":{"rendered":"<p>H(s) polos reales no repetidos grados iguales P y Q polos reales repetidos polos complejos exponencial s \/retraso algoritmo busca_polosceros gr\u00e1fica Q cuadr\u00e1ticos algoritmo Q_cuad_s_parametros 1. H(s) Funci\u00f3n de transferencia Referencia:&nbsp;Lathi ejemplo 4 p330, Hsu literal C. p112 La funci\u00f3n de transferencia H(s) se escribe como P(s)\/Q(s) que es una expresi\u00f3n racional de s. Se [&hellip;]<\/p>\n","protected":false},"author":8043,"featured_media":0,"comment_status":"closed","ping_status":"open","sticky":false,"template":"wp-custom-template-entrada-ss-unidades","format":"standard","meta":{"footnotes":""},"categories":[174],"tags":[],"class_list":["post-326","post","type-post","status-publish","format-standard","hentry","category-ss-u04"],"_links":{"self":[{"href":"https:\/\/blog.espol.edu.ec\/algoritmos101\/wp-json\/wp\/v2\/posts\/326","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/blog.espol.edu.ec\/algoritmos101\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/blog.espol.edu.ec\/algoritmos101\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/blog.espol.edu.ec\/algoritmos101\/wp-json\/wp\/v2\/users\/8043"}],"replies":[{"embeddable":true,"href":"https:\/\/blog.espol.edu.ec\/algoritmos101\/wp-json\/wp\/v2\/comments?post=326"}],"version-history":[{"count":8,"href":"https:\/\/blog.espol.edu.ec\/algoritmos101\/wp-json\/wp\/v2\/posts\/326\/revisions"}],"predecessor-version":[{"id":24397,"href":"https:\/\/blog.espol.edu.ec\/algoritmos101\/wp-json\/wp\/v2\/posts\/326\/revisions\/24397"}],"wp:attachment":[{"href":"https:\/\/blog.espol.edu.ec\/algoritmos101\/wp-json\/wp\/v2\/media?parent=326"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/blog.espol.edu.ec\/algoritmos101\/wp-json\/wp\/v2\/categories?post=326"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/blog.espol.edu.ec\/algoritmos101\/wp-json\/wp\/v2\/tags?post=326"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}