{"id":17812,"date":"2017-08-15T09:00:29","date_gmt":"2017-08-15T14:00:29","guid":{"rendered":"http:\/\/blog.espol.edu.ec\/telg1001\/?p=2479"},"modified":"2026-04-12T16:14:51","modified_gmt":"2026-04-12T21:14:51","slug":"transformada-z-sumatoria-sympy","status":"publish","type":"post","link":"https:\/\/blog.espol.edu.ec\/algoritmos101\/ss-u07\/transformada-z-sumatoria-sympy\/","title":{"rendered":"7.1 Transformada z - Sumatoria con Sympy"},"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=\"#concepto\">Transformada z<\/a><\/p>\n\n\n\n<p><a href=\"#ejemplocausal\">ejemplo causal<\/a><\/p>\n\n\n\n<p><a href=\"#analitico\">anal\u00edtico<\/a><\/p>\n\n\n\n<p><a href=\"#algoritmo\">algoritmo<\/a><\/p>\n\n\n\n<p><a href=\"#grafica\">gr\u00e1fica<\/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=\"concepto\">1. Transformada z<\/h2>\n\n\n\n<p><strong>Referencia<\/strong>: Lathi 5.1 p488, Oppenheim 10.1 p741<\/p>\n\n\n\n<p>Se define como X[z] a la transformada z de una se\u00f1al x[n] como<\/p>\n\n\n<span class=\"wp-katex-eq katex-display\" data-display=\"true\"> X[z] = \\sum_{n=-\\infty}^{\\infty} x[n] z^{-n}<\/span>\n\n\n\n<p>Por razones semejantes a las descritas en la unidad 4 para <a href=\"https:\/\/blog.espol.edu.ec\/algoritmos101\/ss-u04\/transformada-laplace-integral-sympy\/\" data-type=\"post\" data-id=\"350\">transformadas de Laplace<\/a>, es conveniente considerar la <strong>transformada z unilateral<\/strong>. Dado que muchos de los sistemas y se\u00f1ales son causales, en la pr\u00e1ctica se considera que las se\u00f1ales inician en n=0 (se\u00f1al causal), la definici\u00f3n de la<strong> transformada z unilateral<\/strong> es la misma que la bilateral. excepto por los limites de la sumatoria que son [0,\u221e]<\/p>\n\n\n<span class=\"wp-katex-eq katex-display\" data-display=\"true\"> X[z] = \\sum_{n=0}^{\\infty} x[n] z^{-n}<\/span>\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=\"#concepto\">Transformada z<\/a><\/p>\n\n\n\n<p><a href=\"#ejemplocausal\">ejemplo causal<\/a><\/p>\n\n\n\n<p><a href=\"#analitico\">anal\u00edtico<\/a><\/p>\n\n\n\n<p><a href=\"#algoritmo\">algoritmo<\/a><\/p>\n\n\n\n<p><a href=\"#grafica\">gr\u00e1fica<\/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=\"ejemplocausal\">2. Ejemplo. Transformada z de exponencial causal<\/h2>\n\n\n\n<p><strong>Referencia<\/strong>: Lathi ejemplo 5.1 p490, Oppenheim ejemplo 10.1 p743<\/p>\n\n\n\n<p>Encuentre la Transformada z y la correspondiente ROC para la se\u00f1al x[n]<\/p>\n\n\n<span class=\"wp-katex-eq katex-display\" data-display=\"true\"> x[n] = a ^{n} \\mu[n] <\/span>\n\n\n\n<figure class=\"wp-block-image aligncenter size-full\"><img loading=\"lazy\" decoding=\"async\" width=\"563\" height=\"441\" src=\"http:\/\/blog.espol.edu.ec\/algoritmos101\/files\/2017\/08\/TransformadaZ_Ej01xn.png\" alt=\"TransformadaZ_Ej01xn\" class=\"wp-image-20485\" \/><\/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=\"#concepto\">Transformada z<\/a><\/p>\n\n\n\n<p><a href=\"#ejemplocausal\">ejemplo causal<\/a><\/p>\n\n\n\n<p><a href=\"#analitico\">anal\u00edtico<\/a><\/p>\n\n\n\n<p><a href=\"#algoritmo\">algoritmo<\/a><\/p>\n\n\n\n<p><a href=\"#grafica\">gr\u00e1fica<\/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=\"analitico\">3. Desarrollo anal\u00edtico<\/h2>\n\n\n\n<p>por definici\u00f3n<\/p>\n\n\n<span class=\"wp-katex-eq katex-display\" data-display=\"true\"> X[z] = \\sum_{n=0}^{\\infty} a ^{n} \\mu[n] z^{-n}<\/span>\n\n\n\n<p>dado que \u03bc[n]=1 para todo n\u22650,<\/p>\n\n\n<span class=\"wp-katex-eq katex-display\" data-display=\"true\"> X[z] = \\sum_{n=0}^{\\infty} \\Big( a^n \\Big) \\Big(\\frac{1}{z} \\Big)^{n} = \\sum_{n=0}^{\\infty} \\Big(\\frac{a}{z} \\Big)^{n} <\/span>\n\n\n<span class=\"wp-katex-eq katex-display\" data-display=\"true\"> =1 + \\Big(\\frac{a}{z} \\Big)^{1}+\\Big(\\frac{a}{z} \\Big)^{2}+\\Big(\\frac{a}{z} \\Big)^{3}+\\text{...}<\/span>\n\n\n\n<p>revisando la progresi\u00f3n geom\u00e9trica,<\/p>\n\n\n<span class=\"wp-katex-eq katex-display\" data-display=\"true\"> 1+x+x^2+x^3+\\text{...} = \\frac{1}{1+x} \\text{ , }|x|&lt;1<\/span>\n\n\n\n<p>y aplicando en la expresi\u00f3n del problema, se tiene:<\/p>\n\n\n<span class=\"wp-katex-eq katex-display\" data-display=\"true\"> X[z] = \\frac{1}{1-\\frac{a}{z}}\\text{ , } \\Big|\\frac{a}{z}\\Big| &lt;1<\/span>\n\n\n<span class=\"wp-katex-eq katex-display\" data-display=\"true\"> X[z] = \\frac{z}{z-a}\\text{ , } |z|&gt;|a|<\/span>\n\n\n\n<p>observe que X[z] existe solo si |z|&gt;|a|. Para |z|&lt;|a| la sumatoria no converge y tiende al infinito. Por lo que, la Regi\u00f3n de Convergencia ROC de X[z] es la regi\u00f3n sombreada de un c\u00edrculo de radio |a| centrado en el origen en el plano z.<\/p>\n\n\n\n<figure class=\"wp-block-image aligncenter size-full\"><img loading=\"lazy\" decoding=\"async\" width=\"640\" height=\"480\" src=\"http:\/\/blog.espol.edu.ec\/algoritmos101\/files\/2017\/08\/TransformadaZ_Ej01Roc.png\" alt=\"Transformada Z Ej01 Roc\" class=\"wp-image-20486\" \/><\/figure>\n\n\n\n<p>Luego se puede mostrar que la transformada z de la se\u00f1al -a<sup>n<\/sup> u[-(n+1)] tambi\u00e9n es z\/(z-a). Sin embargo la regi\u00f3n de convergencia en \u00e9ste caso es |z|&lt;|a|. Se observa que la transformada z inversa no es \u00fanica, sin embargo,al restringir la transformada inversa a causal, entonces la transformada inversa es \u00fanica como la mostrada.<\/p>\n\n\n\n<figure class=\"wp-block-image aligncenter size-full\"><img loading=\"lazy\" decoding=\"async\" width=\"566\" height=\"451\" src=\"http:\/\/blog.espol.edu.ec\/algoritmos101\/files\/2017\/08\/TransformadaZ_Ej01Xz.png\" alt=\"Transformada Z Ej01 Xz\" class=\"wp-image-20487\" \/><\/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=\"#concepto\">Transformada z<\/a><\/p>\n\n\n\n<p><a href=\"#ejemplocausal\">ejemplo causal<\/a><\/p>\n\n\n\n<p><a href=\"#analitico\">anal\u00edtico<\/a><\/p>\n\n\n\n<p><a href=\"#algoritmo\">algoritmo<\/a><\/p>\n\n\n\n<p><a href=\"#grafica\">gr\u00e1fica<\/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=\"algoritmo\">4. Algoritmo con Sympy-Python - Transformada z <\/h2>\n\n\n\n<p>En Sympy de Python existe la funci\u00f3n <code>sym.summation()<\/code>, que se usa para generar la expresi\u00f3n del resultado para la transformada z.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>f&#091;n]: \n n\na \n\n F&#091;z] desde sumatoria:\n\u239b   1     \u2502a\u2502    \u239e\n\u239c\u2500\u2500\u2500\u2500\u2500\u2500\u2500, \u2502\u2500\u2502 &lt; 1\u239f\n\u239c  a      \u2502z\u2502    \u239f\n\u239c- \u2500 + 1         \u239f\n\u239d  z             \u23a0\n\n F&#091;z] simplificada\n  z   \n\u2500\u2500\u2500\u2500\u2500\u2500\n-a + z\n\n ROC: \n\u2502a\u2502    \n\u2502\u2500\u2502 &lt; 1\n\u2502z\u2502    \n\n {Q_polos:veces}: {a: 1}\n {P_ceros:veces}: {0: 1}\n&gt;&gt;&gt; <\/code><\/pre>\n\n\n\n<p>Algoritmo en Python<\/p>\n\n\n<div class=\"wp-block-syntaxhighlighter-code alignwide\"><pre class=\"brush: python; title: ; notranslate\" title=\"\">\n# transformada z de x&#x5B;n]u&#x5B;n]\nimport sympy as sym\n\n# INGRESO\nz = sym.symbols('z')\nn = sym.symbols('n', integer=True, positive=True)\na = sym.symbols('a')\nu = sym.Heaviside(n)\n\nfn = (a**n)*u\n\n# valor a como racional en dominio 'ZZ' enteros\na_k = sym.Rational(1\/2).limit_denominator(100)\nm   = 7        # T\u00e9rminos a graficar\nmuestras = 101 # dominio z\n\n# PROCEDIMIENTO\nfnz = fn*(z**(-n)) # f(n,z) para sumatoria\n# sumatoria transformada z\nFz_sum = sym.summation(fnz,(n,0,sym.oo))\nFz_eq  = Fz_sum.args&#x5B;0]  # primera ecuacion e intervalo\nFz = Fz_eq&#x5B;0].simplify() # solo expresion\n\nROC = Fz_eq&#x5B;1]  # condicion ROC\n\n# polos y ceros de Fz\n&#x5B;P,Q] = Fz.as_numer_denom()\nP = sym.poly(P,z)\nQ = sym.poly(Q,z)\nP_ceros = sym.roots(P)\nQ_polos = sym.roots(Q)\n\n# SALIDA\nprint('f&#x5B;n]: ')\nsym.pprint(fn)\nprint('\\n F&#x5B;z] desde sumatoria:')\nsym.pprint(Fz_eq)\nprint('\\n F&#x5B;z] simplificada')\nsym.pprint(Fz)\nprint('\\n ROC: ')\nsym.pprint(ROC)\nprint('\\n {Q_polos:veces}:',Q_polos)\nprint(' {P_ceros:veces}:',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=\"#concepto\">Transformada z<\/a><\/p>\n\n\n\n<p><a href=\"#ejemplocausal\">ejemplo causal<\/a><\/p>\n\n\n\n<p><a href=\"#analitico\">anal\u00edtico<\/a><\/p>\n\n\n\n<p><a href=\"#algoritmo\">algoritmo<\/a><\/p>\n\n\n\n<p><a href=\"#grafica\">gr\u00e1fica<\/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=\"grafica\">5. Gr\u00e1fica en Python<\/h2>\n\n\n\n<p>La secci\u00f3n contin\u00faa luego del algoritmo anterior.<\/p>\n\n\n\n<p>Ser requiere dar valor a la constante '<code>a<\/code>' y se sustituye en las funciones con <code>a_k=1\/2<\/code>. <\/p>\n\n\n\n<p>Para actualizar los polos, repite el c\u00e1lculo respectivo, la gr\u00e1fica de polos y ceros para z, se sustituye la variable z por |z| seg\u00fan lo indicado en |z|&lt;|a|.<\/p>\n\n\n\n<p>La parte gr\u00e1fica se desarrolla reutilizando algunas funciones de los <a href=\"https:\/\/blog.espol.edu.ec\/algoritmos101\/senales\/ss-algoritmos-telg1001-py\/\" data-type=\"page\" data-id=\"17852\">algoritmos telg1001.py<\/a><\/p>\n\n\n\n<p> Lo mismo se aplica a la gr\u00e1fica de la transformada F[z] y los resultados son los mostrados.<\/p>\n\n\n<div class=\"wp-block-syntaxhighlighter-code alignwide\"><pre class=\"brush: python; title: ; notranslate\" title=\"\">\n# GRAFICA  -----------\nimport numpy as np\nimport matplotlib.pyplot as plt\nimport telg1001 as ss\n\ndef graficar_Fz_polos(Fz,Q_polos={},P_ceros={},\n                z_a=1,z_b=0,muestras=101,f_nombre='F',\n                solopolos=False):\n    ''' polos y ceros plano z imaginario\n    '''\n    fig_zROC, graf_ROC = plt.subplots()\n    # limite con radio 1\n    radio1 = plt.Circle((0,0),1,color='lightsalmon',\n                        fill=True)\n    radio2 = plt.Circle((0,0),1,linestyle='dashed',\n                        color='red',fill=False)\n    graf_ROC.add_patch(radio1)\n    for unpolo in Q_polos.keys():\n        &#x5B;r_real,r_imag] = unpolo.as_real_imag()\n        unpolo_radio = np.abs(unpolo)\n        unpolo_ROC = plt.Circle((0,0),unpolo_radio,\n                          color='lightgreen',fill=True)\n        graf_ROC.add_patch(unpolo_ROC)\n    graf_ROC.add_patch(radio2) # borde r=1\n    graf_ROC.axis('equal')\n    # marcas de r=1 y polos\n    for unpolo in Q_polos.keys():\n        x_polo = sym.re(unpolo)\n        y_polo = sym.im(unpolo)\n        etiqueta = 'polo: '+str(unpolo)\n        graf_ROC.scatter(x_polo,y_polo,marker='x',\n                        color='red',label = etiqueta)\n        etiqueta = &quot;(&quot;+str(float(x_polo)) + ','\n        etiqueta = etiqueta + str(float(y_polo))+&quot;)&quot;\n        plt.annotate(etiqueta,(x_polo,y_polo), rotation=45)\n    # marcas de ceros\n    for uncero in P_ceros.keys():\n        x_cero = sym.re(uncero)\n        y_cero = sym.im(uncero)\n        etiqueta = 'cero: '+str(uncero)\n        graf_ROC.scatter(x_cero,y_cero,marker='o',\n                        color='blue',label = etiqueta)\n        etiqueta = &quot;(&quot;+str(float(x_cero)) + ','\n        etiqueta = etiqueta + str(float(y_cero))+&quot;)&quot;\n        plt.annotate(etiqueta,(x_cero,y_cero), rotation=45)\n    # limita radio 1\n    graf_ROC.plot(1,0,'o',color='red',\n                 label ='radio:'+str(1))\n    graf_ROC.axhline(0,color='grey')\n    graf_ROC.axvline(0,color='grey')\n    graf_ROC.grid()\n    graf_ROC.legend()\n    graf_ROC.set_xlabel('Re&#x5B;z]')\n    graf_ROC.set_ylabel('Imag&#x5B;z]')\n    untitulo = r'ROC '+f_nombre+'&#x5B;z]=$'\n    untitulo = untitulo+str(sym.latex(Fz))+'$'\n    graf_ROC.set_title(untitulo)\n    return(fig_zROC)\n\n# PROGRAMA -------------------------\n# a tiene valor a_k\nfn = fn.subs(a,a_k) \nFz = Fz.subs(a,a_k)\ns = sym.Symbol('s')\n\n# polos y ceros de Fz, con a_k actualizado\n&#x5B;P,Q] = Fz.as_numer_denom()\nP = sym.poly(P,z)\nQ = sym.poly(Q,z)\nP_ceros = sym.roots(P)\nQ_polos = sym.roots(Q)\n\n# estima intervalo para z\nz_a = list(Q_polos.keys())\nz_a.append(1) # comparar con radio 1\nz_a = 2*int(max(z_a))\n\nfig_ROC = graficar_Fz_polos(Fz,Q_polos,P_ceros,\n                      muestras=101,f_nombre='X')\n\nFzabs =Fz.subs(z,abs(z))\nfig_Fz = ss.graficar_Fs(Fzabs,Q_polos,P_ceros,\n                     -z_a,z_a,muestras=101,\n                     f_nombre='X')\n\n# para graficar f&#x5B;n]\nf_n = sym.lambdify(n,fn)\nki  = np.arange(0,m,1)\nfi  = f_n(ki)\n\n# entrada x&#x5B;n]\nfig_fn, grafxn = plt.subplots()\nplt.axvline(0,color='grey')\nplt.stem(ki,fi)\nplt.grid()\nplt.xlabel('n')\nplt.ylabel('x&#x5B;n]')\netiqueta = r'x&#x5B;n]= $'+str(sym.latex(fn))+'$'\nplt.title(etiqueta)\n\nplt.show()\n<\/pre><\/div>\n\n\n<p><em><strong>Referencia<\/strong><\/em>: The z-transform.dynamics-and-control. https:\/\/dynamics-and-control.readthedocs.io\/en\/latest\/1_Dynamics\/9_Sampled_systems\/The%20z%20transform.html<\/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=\"#concepto\">Transformada z<\/a><\/p>\n\n\n\n<p><a href=\"#ejemplocausal\">ejemplo causal<\/a><\/p>\n\n\n\n<p><a href=\"#analitico\">anal\u00edtico<\/a><\/p>\n\n\n\n<p><a href=\"#algoritmo\">algoritmo<\/a><\/p>\n\n\n\n<p><a href=\"#grafica\">gr\u00e1fica<\/a><\/p>\n<\/div>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\" \/>\n","protected":false},"excerpt":{"rendered":"<p>Transformada z ejemplo causal anal\u00edtico algoritmo gr\u00e1fica 1. Transformada z Referencia: Lathi 5.1 p488, Oppenheim 10.1 p741 Se define como X[z] a la transformada z de una se\u00f1al x[n] como Por razones semejantes a las descritas en la unidad 4 para transformadas de Laplace, es conveniente considerar la transformada z unilateral. Dado que muchos de [&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":[177],"tags":[],"class_list":["post-17812","post","type-post","status-publish","format-standard","hentry","category-ss-u07"],"_links":{"self":[{"href":"https:\/\/blog.espol.edu.ec\/algoritmos101\/wp-json\/wp\/v2\/posts\/17812","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=17812"}],"version-history":[{"count":10,"href":"https:\/\/blog.espol.edu.ec\/algoritmos101\/wp-json\/wp\/v2\/posts\/17812\/revisions"}],"predecessor-version":[{"id":24207,"href":"https:\/\/blog.espol.edu.ec\/algoritmos101\/wp-json\/wp\/v2\/posts\/17812\/revisions\/24207"}],"wp:attachment":[{"href":"https:\/\/blog.espol.edu.ec\/algoritmos101\/wp-json\/wp\/v2\/media?parent=17812"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/blog.espol.edu.ec\/algoritmos101\/wp-json\/wp\/v2\/categories?post=17812"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/blog.espol.edu.ec\/algoritmos101\/wp-json\/wp\/v2\/tags?post=17812"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}