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ón semejante que permite cambiar del dominio_n al dominio_z. Los Pares se usan en conjunto con la tabla de propiedades de la Transformada z con lo que se extiende las posibilidades de uso para la tabla.
Se propone primero usar la tabla de pares con Sympy para buscar las expresiones semejantes, usando la instrucción 'f.match()', donde f es la función en el dominio_n y F es la función en el domino_z. En la siguiente sección se incorpora la tabla de propiedades, para en conjunto realizar una búsqueda más completa de las transformadas z o de sus inversas.
Referencia: Schaum Hsu Tabla 4-1 p170. Lathi Tabla 5.1 Transformada z p492. Oppenheim tabla 10.2 p776
2. Ejercicio. Transformada z de f[n] = cos(2n) con f.match() de Sympy
Revise si existe una expresión para f[n] en una pequeña lista de pares de transformadas:
f[n] = \cos [2n]3. Algoritmo en Python - buscar pares
El algoritmo inicia con las variables a usar para cada dominio y la expresión de Heaviside como en los ejemplos de las unidades anteriores.
En la tabla se requiere unas variables tipo "comodín" (Wild) para buscar la semejanza de las expresiones, se usan como sym.Wild('a', exclude=[n]) de la que se excluye la variable de tiempo discreto n.
Se incluye una pequeña lista como tabla de pares de transformadas como un ejemplo básico, que luego puede ser ampliada. Los pares se incluyen como tuplas con las expresiones para cada domino.
Para encontrar semejanzas, se recorre cada par de transformadas, comparando las expresiones con f.match(par_nz[0]), que para revisar la expresión del domino n, solo toma la primera parte de la tupla. Si existe coincidencia, se crea un diccionario que indica los valores comodín que hacen que las expresiones sean iguales.
Resultado del algoritmo
se encontró expresión similar:
f: cos(2*n)
z_pares f[n]: cos(n*a_)
similar con: {a_: 2}
z_pares F[z]: (z**2 - z*cos(a_))/(z**2 - 2*z*cos(a_) + 1)
Fz: : (z**2 - z*cos(2))/(z**2 - 2*z*cos(2) + 1)
>>>
Algoritmo en Python
# transformada z con f.match de Sympy
# expresiones similares o semejantes f.match
import sympy as sym
# INGRESO
n = sym.Symbol('n', real=True)
z = sym.Symbol('z')
u = sym.Heaviside(n)
#f = u
#f = 5*u
f = sym.cos(2*n)
#f = sym.sin(2*n)
# PROCEDIMIENTO
# para revisar semejanza de expresiones fn y n_dom
a = sym.Wild('a', exclude=[n])
b = sym.Wild('b', exclude=[n])
# tabla de pares [(n_dom, z_dom)]
z_pares = [
# impulso unitario d[n], DiracDelta
(DiracDelta(n),
S.One,
S.true, S.Zero, dco),
(DiracDelta(a*n),
S.One,
Abs(a)>0, S.Zero, dco),
# escalon unitario u[n], Heaviside
(Heaviside(n),
z/(z-1),
S.true, Abs(z) > 1, dco),
# cos[n], sin[n] ,trigonometricas
(cos(a*n),
(z*(z-cos(a)))/(z**2-(2*cos(a))*z+1),
Abs(a)>0, Abs(z) > 1, dco),
(sin(a*n),
(sin(a)*z+0)/(z**2-(2*cos(a))*z+1),
Abs(a)>0, Abs(z) > 1, dco),
]
Fz = None; f_pares = None # sin similar
z_pares_len = len(z_pares) ; i=0
while i<z_pares_len and Fz==None:
par_nz = z_pares[i]
n_dom = par_nz[0]
z_dom = par_nz[1]
similar = f.match(n_dom)
# entrega diccionario de expresion similar
# si el diccionario es vacio, es coincidente
if similar or similar=={}:
f_pares = par_nz
f_args = similar
Fz_ = z_dom
Fz = z_dom.xreplace(similar)
i = i+1 # siguiente par
# SALIDA
if not(Fz==None):
print(' se encontró expresión similar:')
print(' f: ',f)
print(' z_pares f[n]:',f_pares[0])
print(' similar con:',f_args)
print(' z_pares F[z]:',f_pares[1])
print(' Fz: :',Fz)
else:
print(' NO se encontró una expresión similar...')
El concepto de expresiones similares se prueba con:
f[n] = \mu [n]donde se observa que a respuesta es un diccionario vacío
se encontró expresión similar:
f: Heaviside(n)
z_pares f[n]: Heaviside(n)
similar con: {}
z_pares F[z]: z/(z - 1)
Fz: : z/(z - 1)
>>>
mientras que para una función que no se encuentra en la tabla, el resultado debe ser Fz=None
NO se encontró una expresión similar...
>>> type(Fz)
<class 'NoneType'>
>>>
El concepto básico del algoritmo se extiende para las tablas de Pares de transformadas que se adjuntan en un archivo de funciones telg1001.py.
4. Ejercicio. Transformada z inversa de F[z] = z/(z-1) con f.match() de Sympy
Revisar si existe una expresión para F[z] en una pequeña lista de pares de transformadas:
F[z] = \frac{z}{z-1}5. Algoritmo en Python. Transformada z inversa
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].
Para encontrar semejanzas, se recorre cada par de transformadas, comparando las expresiones con F.match(par_nz[1]), que para revisar la expresión del domino z, solo toma la segunda parte de la tupla. Si existe coincidencia, se crea un diccionario que indica los valores comodín que hacen que las expresiones sean iguales.
Resultado del algoritmo
se encontró expresión similar:
F: z/(z - 1)
z_pares F[z]: z/(z - 1)
similar con: {}
z_pares f[n]: Heaviside(n)
fn: : Heaviside(n)
>>>
Algoritmo en Python
# transformada z inversa con F.match de Sympy
# expresiones similares o semejantes F.match
import sympy as sym
# INGRESO
n = sym.Symbol('n', real=True)
z = sym.Symbol('z')
u = sym.Heaviside(n)
F = z/(z-1)
#F = (z**2 - z*sym.cos(2))/(z**2 - 2*z*sym.cos(2) + 1)
# PROCEDIMIENTO
# para revisar semejanza de expresiones fn y n_dom
a = sym.Wild('a', exclude=[n])
b = sym.Wild('b', exclude=[n])
# tabla de pares [(n_dom, z_dom)]
z_pares = [
# impulso unitario d[n], DiracDelta
(DiracDelta(n),
S.One,
S.true, S.Zero, dco),
(DiracDelta(a*n),
S.One,
Abs(a)>0, S.Zero, dco),
# escalon unitario u[n], Heaviside
(Heaviside(n),
z/(z-1),
S.true, Abs(z) > 1, dco),
# cos[n], sin[n] ,trigonometricas
(cos(a*n),
(z*(z-cos(a)))/(z**2-(2*cos(a))*z+1),
Abs(a)>0, Abs(z) > 1, dco),
(sin(a*n),
(sin(a)*z+0)/(z**2-(2*cos(a))*z+1),
Abs(a)>0, Abs(z) > 1, dco),
]
fn = None; F_pares = None # sin similar
z_pares_len = len(z_pares) ; i=0
while i<z_pares_len and fn==None:
par_nz = z_pares[i]
n_dom = par_nz[0]
z_dom = par_nz[1]
similar = F.match(z_dom)
# entrega diccionario de expresion similar
# si el diccionario es vacio, es coincidente
if similar or similar=={}:
F_pares = par_nz
F_args = similar
fn_ = n_dom
fn = n_dom.xreplace(similar)
i = i+1 # siguiente par
# SALIDA
if not(fn==None):
print(' se encontró expresión similar:')
print(' F: ',F)
print(' z_pares F[z]:',F_pares[1])
print(' similar con:',F_args)
print(' z_pares f[n]:',F_pares[0])
print(' fn: :',fn)
else:
print(' NO se encontró una expresión similar...')
otros ejercicios realizados con
F[z] =\frac{z^2 - zcos(2)}{z^2 - 2zcos(2) + 1}resultado del algoritmo
se encontró expresión similar:
F: (z**2 - z*cos(2))/(z**2 - 2*z*cos(2) + 1)
z_pares F[z]: (z**2 - z*cos(a_))/(z**2 - 2*z*cos(a_) + 1)
similar con: {a_: 2}
z_pares f[n]: cos(n*a_)
fn: : cos(2*n)
>>>
Referencias: Sympy: match(pattern, old=False) https://docs.sympy.org/latest/modules/core.html?highlight=match#sympy.core.basic.Basic.match