{"id":5249,"date":"2017-08-16T02:53:52","date_gmt":"2017-08-16T07:53:52","guid":{"rendered":"http:\/\/blog.espol.edu.ec\/telg1001\/?p=5249"},"modified":"2026-04-06T06:22:32","modified_gmt":"2026-04-06T11:22:32","slug":"transformada-z-pares-sympy","status":"publish","type":"post","link":"https:\/\/blog.espol.edu.ec\/algoritmos101\/ss-u07\/transformada-z-pares-sympy\/","title":{"rendered":"7.1.1 Transformada z - Pares f[n] y F[z] con match() de 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 pares<\/a><\/p>\n\n\n\n<p><a href=\"#ejerciciopares\">ejercicio<\/a><\/p>\n\n\n\n<p><a href=\"#algoritmopares\">algoritmo<\/a><\/p>\n\n\n\n<p><a href=\"#ejercicioinversa\">ejercicio inversa<\/a><\/p>\n\n\n\n<p><a href=\"#algoritmoinversa\">algoritmo inv<\/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 - Pares<\/h2>\n\n\n\n<p>Para facilitar el uso de la <a href=\"https:\/\/blog.espol.edu.ec\/algoritmos101\/ss-u07\/transformada-z-tabla\/\" data-type=\"post\" data-id=\"1413\"><strong>Transformada z<\/strong> se usa la Tabla de Pares<\/a> <code>f[n]<\/code> y <code>F[z]<\/code>, donde se busca una expresi\u00f3n <em>semejante<\/em> que permite cambiar del <code>dominio_n<\/code> al <code>dominio_z<\/code>. Los Pares se usan en conjunto con la <a href=\"https:\/\/blog.espol.edu.ec\/algoritmos101\/ss-u07\/transformada-z-tabla-de-propiedades\/\" data-type=\"post\" data-id=\"17811\"><strong>tabla de propiedades<\/strong> de la Transformada z<\/a> con lo que se extiende las posibilidades de uso para la tabla.<\/p>\n\n\n\n<p>Se propone primero usar la tabla de pares con Sympy para buscar las expresiones <em>semejantes<\/em>, usando la instrucci\u00f3n '<code>f.match()<\/code>', donde <code>f<\/code> es la funci\u00f3n en el <code>dominio_n<\/code> y <code>F<\/code> es la funci\u00f3n en el <code>domino_z<\/code>. En la siguiente secci\u00f3n se incorpora la tabla de propiedades, para en conjunto realizar una b\u00fasqueda m\u00e1s completa de las transformadas z o de sus inversas.<\/p>\n\n\n\n<p><em><strong>Referencia<\/strong><\/em>: Schaum Hsu Tabla 4-1 p170. Lathi Tabla 5.1 Transformada z p492. Oppenheim tabla 10.2 p776<\/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 pares<\/a><\/p>\n\n\n\n<p><a href=\"#ejerciciopares\">ejercicio<\/a><\/p>\n\n\n\n<p><a href=\"#algoritmopares\">algoritmo<\/a><\/p>\n\n\n\n<p><a href=\"#ejercicioinversa\">ejercicio inversa<\/a><\/p>\n\n\n\n<p><a href=\"#algoritmoinversa\">algoritmo inv<\/a><\/p>\n<\/div>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\" \/>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\" \/>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"ejerciciopares\">2. Ejercicio. Transformada z de f[n] = cos(2n) con f.match() de Sympy<\/h2>\n\n\n\n<p>Revise si existe una expresi\u00f3n para f[n] en una peque\u00f1a lista de pares de transformadas:<\/p>\n\n\n<span class=\"wp-katex-eq katex-display\" data-display=\"true\"> f[n] = \\cos [2n] <\/span>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"algoritmopares\">3. Algoritmo en Python - buscar pares<\/h2>\n\n\n\n<p>El algoritmo inicia con las variables a usar para cada dominio y la expresi\u00f3n de Heaviside como en los ejemplos de las unidades anteriores.<\/p>\n\n\n\n<p>En la tabla se requiere unas variables tipo \"comod\u00edn\" (<code>Wild<\/code>) para buscar la semejanza de las expresiones, se usan como <code>sym.Wild('a', exclude=[n])<\/code> de la que se excluye la variable de tiempo discreto <code>n<\/code>.<\/p>\n\n\n\n<p>Se incluye una peque\u00f1a lista como tabla de pares de transformadas como un ejemplo b\u00e1sico, que luego puede ser ampliada. Los pares se incluyen como tuplas con las expresiones para cada domino.<\/p>\n\n\n\n<p>Para encontrar semejanzas, se recorre cada par de transformadas, comparando las expresiones con <code>f.match(par_nz[0])<\/code>, que para revisar la expresi\u00f3n del domino n, solo toma la primera parte de la tupla. Si existe coincidencia, se crea un diccionario que indica los valores comod\u00edn que hacen que las expresiones sean iguales.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Resultado del algoritmo<\/h3>\n\n\n\n<pre class=\"wp-block-code alignwide\"><code> se encontr\u00f3 expresi\u00f3n similar:\n  f:            cos(2*n)\n  z_pares f&#091;n]: cos(n*a_)\n   similar con: {a_: 2}\n  z_pares F&#091;z]: (z**2 - z*cos(a_))\/(z**2 - 2*z*cos(a_) + 1)\n  Fz:         : (z**2 - z*cos(2))\/(z**2 - 2*z*cos(2) + 1)\n&gt;&gt;&gt; <\/code><\/pre>\n\n\n\n<h3 class=\"wp-block-heading\">Algoritmo en Python<\/h3>\n\n\n<div class=\"wp-block-syntaxhighlighter-code alignwide\"><pre class=\"brush: python; title: ; notranslate\" title=\"\">\n# transformada z con f.match de Sympy\n# expresiones similares o semejantes f.match\nimport sympy as sym\nfrom sympy.core import diff, S\nfrom sympy.functions.elementary.complexes import Abs\nfrom sympy.functions.special.delta_functions import DiracDelta, Heaviside\nfrom sympy.functions.elementary.trigonometric import cos, sin, acos, atan\n \n# INGRESO\nn = sym.Symbol('n', real=True)\nz = sym.Symbol('z')\nu = sym.Heaviside(n)\n \n#f = u\n#f = 5*u\nf = sym.cos(2*n)\n#f = sym.sin(2*n)\n \n# PROCEDIMIENTO\n# para revisar semejanza de expresiones fn y n_dom\na = sym.Wild('a', exclude=&#x5B;n])\nb = sym.Wild('b', exclude=&#x5B;n])\ndco = lambda f: _z_args_collect(f,n)\n# tabla de pares &#x5B;(n_dom, z_dom)]\nz_pares = &#x5B;\n    # impulso unitario d&#x5B;n], DiracDelta\n    (DiracDelta(n),\n     S.One,\n     S.true, S.Zero, dco),\n    (DiracDelta(a*n),\n     S.One,\n     Abs(a)&gt;0, S.Zero, dco),\n    # escalon unitario u&#x5B;n], Heaviside\n    (Heaviside(n),\n     z\/(z-1),\n     S.true, Abs(z) &gt; 1, dco),\n    # cos&#x5B;n], sin&#x5B;n] ,trigonometricas\n    (cos(a*n),\n     (z*(z-cos(a)))\/(z**2-(2*cos(a))*z+1),\n     Abs(a)&gt;0, Abs(z) &gt; 1, dco),\n    (sin(a*n),\n     (sin(a)*z+0)\/(z**2-(2*cos(a))*z+1),\n     Abs(a)&gt;0, Abs(z) &gt; 1, dco),\n    ]\n \nFz = None; f_pares = None # sin similar\nz_pares_len = len(z_pares) ; i=0\nwhile i&lt;z_pares_len and Fz==None:\n    par_nz = z_pares&#x5B;i]\n    n_dom = par_nz&#x5B;0]\n    z_dom = par_nz&#x5B;1]\n    similar = f.match(n_dom)\n    # entrega diccionario de expresion similar\n    # si el diccionario es vacio, es coincidente\n    if similar or similar=={}:\n        f_pares = par_nz\n        f_args = similar\n        Fz_ = z_dom\n        Fz  = z_dom.xreplace(similar)\n    i = i+1 # siguiente par\n \n# SALIDA\nif not(Fz==None):\n    print(' se encontr\u00f3 expresi\u00f3n similar:')\n    print('  f:           ',f)\n    print('  z_pares f&#x5B;n]:',f_pares&#x5B;0])\n    print('   similar con:',f_args)\n    print('  z_pares F&#x5B;z]:',f_pares&#x5B;1])\n    print('  Fz:         :',Fz)\nelse:\n    print(' NO se encontr\u00f3 una expresi\u00f3n similar...')\n\n<\/pre><\/div>\n\n\n<p>El concepto de expresiones similares se prueba con:<\/p>\n\n\n<span class=\"wp-katex-eq katex-display\" data-display=\"true\"> f[n] = \\mu [n] <\/span>\n\n\n\n<p>donde se observa que a respuesta es un diccionario vac\u00edo<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code> se encontr\u00f3 expresi\u00f3n similar:\n  f:            Heaviside(n)\n  z_pares f&#091;n]: Heaviside(n)\n   similar con: {}\n  z_pares F&#091;z]: z\/(z - 1)\n  Fz:         : z\/(z - 1)\n&gt;&gt;&gt; <\/code><\/pre>\n\n\n\n<p>mientras que para una funci\u00f3n que no se encuentra en la tabla, el resultado debe ser <code>Fz=None<\/code><\/p>\n\n\n<span class=\"wp-katex-eq katex-display\" data-display=\"true\"> f[n] = \\sin [2n] <\/span>\n\n\n\n<pre class=\"wp-block-code\"><code> NO se encontr\u00f3 una expresi\u00f3n similar...\n&gt;&gt;&gt; type(Fz)\n&lt;class 'NoneType'&gt;\n&gt;&gt;&gt; <\/code><\/pre>\n\n\n\n<p>El concepto b\u00e1sico del algoritmo se extiende para las tablas de Pares de transformadas que se adjuntan en un archivo de funciones telg1001.py.<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\" \/>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"ejercicioinversa\">4. Ejercicio. Transformada z inversa de F[z] = z\/(z-1) con f.match() de Sympy<\/h2>\n\n\n\n<p>Revisar si existe una expresi\u00f3n para F[z] en una peque\u00f1a lista de pares de transformadas:<\/p>\n\n\n<span class=\"wp-katex-eq katex-display\" data-display=\"true\"> F[z] = \\frac{z}{z-1} <\/span>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"algoritmoinversa\">5. Algoritmo en Python. Transformada z inversa<\/h2>\n\n\n\n<p>Semejante al ejercicio 1 para f[n] a F[z], el algoritmo inicia con las variables a usar para cada dominio y de F[z].<\/p>\n\n\n\n<p>Para encontrar semejanzas, se recorre cada par de transformadas, comparando las expresiones con <code>F.match(par_nz[1])<\/code>, que para revisar la expresi\u00f3n del domino z, solo toma la segunda parte de la tupla. Si existe coincidencia, se crea un diccionario que indica los valores comod\u00edn que hacen que las expresiones sean iguales.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Resultado del algoritmo<\/h3>\n\n\n\n<pre class=\"wp-block-code\"><code> se encontr\u00f3 expresi\u00f3n similar:\n  F:            z\/(z - 1)\n  z_pares F&#091;z]: z\/(z - 1)\n   similar con: {}\n  z_pares f&#091;n]: Heaviside(n)\n  fn:         : Heaviside(n)\n&gt;&gt;&gt; <\/code><\/pre>\n\n\n\n<h3 class=\"wp-block-heading\">Algoritmo en Python<\/h3>\n\n\n<div class=\"wp-block-syntaxhighlighter-code alignwide\"><pre class=\"brush: python; title: ; notranslate\" title=\"\">\n# transformada z inversa con F.match de Sympy\n# expresiones similares o semejantes F.match\nimport sympy as sym\nfrom sympy.core import diff, S\nfrom sympy.functions.elementary.complexes import Abs\nfrom sympy.functions.special.delta_functions import DiracDelta, Heaviside\nfrom sympy.functions.elementary.trigonometric import cos, sin, acos, atan\n \n# INGRESO\nn = sym.Symbol('n', real=True)\nz = sym.Symbol('z')\nu = sym.Heaviside(n)\n \nF = z\/(z-1)\n#F = (z*(z - sym.cos(2)))\/(z**2 - 2*z*sym.cos(2) + 1)\n#F = (z**2 - z*sym.cos(2)))\/(z**2 - 2*z*sym.cos(2) + 1)\n\n \n# PROCEDIMIENTO\n# para revisar semejanza de expresiones fn y n_dom\na = sym.Wild('a', exclude=&#x5B;n])\nb = sym.Wild('b', exclude=&#x5B;n])\ndco = lambda f: _z_args_collect(f,n)\n \n# tabla de pares &#x5B;(n_dom, z_dom)]\nz_pares = &#x5B;\n    # impulso unitario d&#x5B;n], DiracDelta\n    (DiracDelta(n),\n     S.One,\n     S.true, S.Zero, dco),\n    (DiracDelta(a*n),\n     S.One,\n     Abs(a)&gt;0, S.Zero, dco),\n    # escalon unitario u&#x5B;n], Heaviside\n    (Heaviside(n),\n     z\/(z-1),\n     S.true, Abs(z) &gt; 1, dco),\n    # cos&#x5B;n], sin&#x5B;n] ,trigonometricas\n    (cos(a*n),\n     (z*(z-cos(a)))\/(z**2-(2*cos(a))*z+1),\n     Abs(a)&gt;0, Abs(z) &gt; 1, dco),\n    (sin(a*n),\n     (sin(a)*z+0)\/(z**2-(2*cos(a))*z+1),\n     Abs(a)&gt;0, Abs(z) &gt; 1, dco),\n    ]\n \nfn = None; F_pares = None # sin similar\nz_pares_len = len(z_pares) ; i=0\nwhile i&lt;z_pares_len and fn==None:\n    par_nz = z_pares&#x5B;i]\n    n_dom = par_nz&#x5B;0]\n    z_dom = par_nz&#x5B;1]\n    similar = F.match(z_dom)\n    # entrega diccionario de expresion similar\n    # si el diccionario es vacio, es coincidente\n    if similar or similar=={}:\n        F_pares = par_nz\n        F_args = similar\n        fn_ = n_dom\n        fn  = n_dom.xreplace(similar)\n    i = i+1 # siguiente par\n \n# SALIDA\nif not(fn==None):\n    print(' se encontr\u00f3 expresi\u00f3n similar:')\n    print('  F:           ',F)\n    print('  z_pares F&#x5B;z]:',F_pares&#x5B;1])\n    print('   similar con:',F_args)\n    print('  z_pares f&#x5B;n]:',F_pares&#x5B;0])\n    print('  fn:         :',fn)\nelse:\n    print(' NO se encontr\u00f3 una expresi\u00f3n similar...')\n<\/pre><\/div>\n\n\n<p>otros ejercicios realizados con<\/p>\n\n\n<span class=\"wp-katex-eq katex-display\" data-display=\"true\"> F[z] =\\frac{z(z - cos(2))}{z^2 - 2zcos(2) + 1} <\/span>\n\n\n\n<p>resultado del algoritmo<\/p>\n\n\n\n<pre class=\"wp-block-code alignwide\"><code> se encontr\u00f3 expresi\u00f3n similar:\n  F:            z*(z - cos(2))\/(z**2 - 2*z*cos(2) + 1)\n  z_pares F&#091;z]: z*(z - cos(a_))\/(z**2 - 2*z*cos(a_) + 1)\n   similar con: {a_: 2}\n  z_pares f&#091;n]: cos(n*a_)\n  fn:         : cos(2*n)<\/code><\/pre>\n\n\n\n<p>Sin embargo, si en el numerador se multiplica z<\/p>\n\n\n<span class=\"wp-katex-eq katex-display\" data-display=\"true\"> F[z] =\\frac{z^2 - zcos(2)}{z^2 - 2zcos(2) + 1} <\/span>\n\n\n\n<pre class=\"wp-block-code\"><code>NO se encontr\u00f3 una expresi\u00f3n similar\u2026<\/code><\/pre>\n\n\n\n<p>Lo que indica que hay que simplificar las expresiones antes de compararlas en la tabla.<\/p>\n\n\n\n<p>El desarrollo de estas operaciones se incluye y describe en las siguientes secciones<\/p>\n\n\n\n<p><strong><em>Referencias<\/em><\/strong>: Sympy: match(pattern, old=False) <a href=\"https:\/\/docs.sympy.org\/latest\/modules\/core.html?highlight=match#sympy.core.basic.Basic.match\">https:\/\/docs.sympy.org\/latest\/modules\/core.html?highlight=match#sympy.core.basic.Basic.match<\/a><\/p>\n","protected":false},"excerpt":{"rendered":"<p>Transformada z pares ejercicio algoritmo ejercicio inversa algoritmo inv 1. Transformada z - Pares Para facilitar el uso de la Transformada z se usa la Tabla de Pares f[n] y F[z], donde se busca una expresi\u00f3n semejante que permite cambiar del dominio_n al dominio_z. Los Pares se usan en conjunto con la tabla de propiedades [&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-5249","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\/5249","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=5249"}],"version-history":[{"count":6,"href":"https:\/\/blog.espol.edu.ec\/algoritmos101\/wp-json\/wp\/v2\/posts\/5249\/revisions"}],"predecessor-version":[{"id":24036,"href":"https:\/\/blog.espol.edu.ec\/algoritmos101\/wp-json\/wp\/v2\/posts\/5249\/revisions\/24036"}],"wp:attachment":[{"href":"https:\/\/blog.espol.edu.ec\/algoritmos101\/wp-json\/wp\/v2\/media?parent=5249"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/blog.espol.edu.ec\/algoritmos101\/wp-json\/wp\/v2\/categories?post=5249"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/blog.espol.edu.ec\/algoritmos101\/wp-json\/wp\/v2\/tags?post=5249"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}