1. Transformada z - referencias para desarrollo con Sympy
Referencia: Tabla de transformadas z: Lathi Tabla 5.1 Transformada z p492. Oppenheim tabla 10.2 p776, Schaum Hsu Tabla 4-1 p170. Propiedades: Schaum Hsu Tabla 4-2 p173. Lathi Tabla 5.2 p509. Oppenheim Tabla 10.3 p793
Usando los algoritmos presentados para transformadas z a partir de la tabla y propiedades, se incorpora en la instrucción z_transform(f,n,z) incorporada en telg1001.py. Para demostración se desarrollan algunos ejemplos que se desarrollan a partir de la tabla de transformadas z.
Transformada z de impulso unitario δ(t)
>>> import sympy as sym
>>> import telg1001_z as fcnm
>>> n = sym.Symbol('n', real=True)
>>> z = sym.Symbol('z')
>>> d = sym.DiracDelta(n)
>>> f = d
>>> fcnm.z_transform(f,n,z)
1
>>>
Transformada z de impulso unitario desplazado δ(t-2) y δ(t+2)
>>> fcnm.z_transform(f.subs(n,n-2),n,z)
z**(-2)
>>> fcnm.z_transform(f.subs(n,n+2),n,z)
z**2
>>>
Para comprobar las transformadas de los algoritmos presentados e integrados en telg1001.py, se crea una tabla con expresiones f[n] de prueba en el dominio n de tiempo discreto.
Al resultado se aplica la inversa de F[z] que muestra que la expresión es invertible usando la transformada z unilateral.
El resultado del algoritmo se muestra a continuación y luego el algoritmo.
z_transform : 0
f[n]: DiracDelta(n)
F[z]: (1, 0, True)
f[n]: DiracDelta(n)
z_transform : 1
f[n]: DiracDelta(n - 2)
F[z]: (z**(-2), 0, True)
f[n]: DiracDelta(n - 2)
z_transform : 2
f[n]: DiracDelta(n + 2)
F[z]: (z**2, 0, True)
f[n]: DiracDelta(n + 2)
z_transform : 3
f[n]: 3*DiracDelta(n + 2)
F[z]: (3*z**2, 0, True)
f[n]: 3*DiracDelta(n + 2)
z_transform : 4
f[n]: -3*DiracDelta(n + 2)
F[z]: (-3*z**2, 0, True)
f[n]: -3*DiracDelta(n + 2)
z_transform : 5
f[n]: Heaviside(n)
F[z]: (z/(z - 1), Abs(z) > 1, True)
f[n]: Heaviside(n)
z_transform : 6
f[n]: Heaviside(n - 2)
F[z]: (1/(z*(z - 1)), Abs(z) > 1, True)
f[n]: Heaviside(n - 2)
z_transform : 7
f[n]: Heaviside(n + 2)
F[z]: (z**3/(z - 1), Abs(z) > 1, True)
f[n]: DiracDelta(n + 1) + DiracDelta(n + 2) + Heaviside(n)
z_transform : 8
f[n]: 3*Heaviside(n + 2)
F[z]: (3*z**3/(z - 1), Abs(z) > 1, True)
f[n]: 3*DiracDelta(n + 1) + 3*DiracDelta(n + 2) + 3*Heaviside(n)
z_transform : 9
f[n]: n*Heaviside(n)
F[z]: (z/(z - 1)**2, Abs(z) > 1, True)
f[n]: n*Heaviside(n)
z_transform : 10
f[n]: n**2*Heaviside(n)
F[z]: (z*(z + 1)/(z - 1)**3, Abs(z) > 1, True)
f[n]: n**2*Heaviside(n)
z_transform : 11
f[n]: n**3*Heaviside(n)
F[z]: (z*(z**2 + 4*z + 1)/(z - 1)**4, Abs(z) > 1, True)
f[n]: n**3*Heaviside(n)
z_transform : 12
f[n]: 0.5**n*Heaviside(n)
F[z]: (z/(z - 0.5), Abs(z) > 2, True)
f[n]: 0.5**n*Heaviside(n)
z_transform : 13
f[n]: 0.5**n*Heaviside(n)
F[z]: (z/(z - 0.5), Abs(z) > 2, True)
f[n]: 0.5**n*Heaviside(n)
z_transform : 14
f[n]: Heaviside(n)/4**n
F[z]: (z/(z - 1/4), Abs(z) > 4, True)
f[n]: Heaviside(n)/4**n
z_transform : 15
f[n]: -0.5**n*Heaviside(-n - 1)
F[z]: (z/(z - 0.5), Abs(z) < 2, True)
f[n]: 0.5**n*Heaviside(n)
z_transform : 16
f[n]: 0.5**(n - 1)*Heaviside(n - 1)
F[z]: (1/(z - 1/2), Abs(z) > 2, True)
f[n]: 2*Heaviside(n - 1)/2**n
z_transform : 17
f[n]: 0.25**(n - 1)*Heaviside(n - 1)
F[z]: (1/(z - 1/4), Abs(z) > 4, True)
f[n]: 4*Heaviside(n - 1)/4**n
z_transform : 18
f[n]: 0.5**n*n*Heaviside(n)
F[z]: (0.5*z/(z - 0.5)**2, Abs(z) > 2, True)
f[n]: 0.5**n*n*Heaviside(n)
z_transform : 19
f[n]: -0.5**n*n*Heaviside(-n - 1)
F[z]: (0.5*z/(z - 0.5)**2, Abs(z) < 2, True)
f[n]: 0.5**n*n*Heaviside(n)
z_transform : 20
f[n]: 0.5**n*(n + 1)*Heaviside(n)
F[z]: z/(z - 0.5) + 0.5*z/(z - 0.5)**2
f[n]: 0.5**n*(n + 1)*Heaviside(n)
z_transform : 21
f[n]: 0.5**n*n**2*Heaviside(n)
F[z]: (0.5*z*(z + 0.5)/(z - 0.5)**3, Abs(z) > 2, True)
f[n]: 0.5**n*n**2*Heaviside(n)
z_transform : 22
f[n]: 1.33333333333333*0.5**n*n*(n - 2)*(n - 1)*Heaviside(n)
F[z]: 1.33333333333333*z/(z - 0.5)**2 - 2*z*(z + 0.5)/(z - 0.5)**3 + 1.33333333333333*z*(0.5*z**2 + z + 0.125)/(z - 0.5)**4
f[n]: 4*0.5**n*n*(n - 2)*(n - 1)*Heaviside(n)/3
z_transform : 23
f[n]: cos(2*n)*Heaviside(n)
F[z]: (z*(z - cos(2))/(z**2 - 2*z*cos(2) + 1), Abs(z) > 1, True)
f[n]: cos(2*n)*Heaviside(n)
z_transform : 24
f[n]: 0.5**n*cos(2*n)*Heaviside(n)
F[z]: (z*(z - 0.5*cos(2))/(z**2 - z*cos(2) + 0.25), Abs(z) > 2, True)
f[n]: 0.5**n*cos(2*n)*Heaviside(n)
z_transform : 25
f[n]: sin(2*n)*Heaviside(n)
F[z]: (z*sin(2)/(z**2 - 2*z*cos(2) + 1), Abs(z) > 1, True)
f[n]: sin(2*n)*Heaviside(n)
z_transform : 26
f[n]: 0.5**n*sin(2*n)*Heaviside(n)
F[z]: (0.5*z*sin(2)/(z**2 - z*cos(2) + 0.25), Abs(z) > 2, True)
f[n]: 0.5**n*sin(2*n)*Heaviside(n)
z_transform : 27
f[n]: cos(2*n + 0.25)*Heaviside(n)
F[z]: (z*(0.968912421710645*z + 0.178246055649492)/(z**2 - 2*z*cos(2) + 1), Abs(z) > 1, True)
f[n]: cos(2*n + 0.25)*Heaviside(n)
z_transform : 28
f[n]: 3*0.5**n*cos(2*n + 0.25)*Heaviside(n)
F[z]: (2.90673726513193*z*(z + 0.0919825423100641)/(z**2 - z*cos(2) + 0.25), Abs(z) > 2, True)
f[n]: 3*0.5**n*cos(2*n + 0.25)*Heaviside(n)
2. Algoritmo en Python
Las intrucciones se pueden modificar para observar una expresión en detalle si se activa la variable sym.SYMPY_DEBUG=True. Por la extensión del resultado se recomienda activarla para una expresión.
import sympy as sym
import telg1001 as fcnm
sym.SYMPY_DEBUG = False
# INGRESO
n = sym.Symbol('n')
z = sym.Symbol('z')
u = sym.Heaviside(n)
d = sym.DiracDelta(n)
a0 = sym.Rational(1,4).limit_denominator(100)
tabla = [
d,
d.subs(n,n-2),
d.subs(n,n+2),
3*d.subs(n,n+2),
-3*d.subs(n,n+2),
u,
u.subs(n,n-2),
u.subs(n,n+2),
3*u.subs(n,n+2),
n*u,
(n**2)*u,
(n**3)*u,
0.5**n*u,((1/2)**n)*u,(a0**n)*u,
-(0.5**n)*u.subs(n,-n-1),
(0.5**(n-1))*u.subs(n,n-1),
((1/4)**(n-1))*u.subs(n,n-1),
n*(0.5**n)*u,
-n*(0.5**n)*u.subs(n,-n-1),
(n+1)*(0.5**n)*u,
n**2*(0.5**n)*u,
n*(n-1)*(n-2)*(0.5**n)*u/((0.5**3)*6),
sym.cos(2*n)*u,
(0.5**n)*sym.cos(2*n)*u,
sym.sin(2*n)*u,
(0.5**n)*sym.sin(2*n)*u,
sym.cos(2*n+0.25)*u,
3*(0.5**n)*sym.cos(2*n+0.25)*u
]
# seleccionar revisar
revisar = tabla[:]
# revisa detalle de una transformada y la inversa
if len(revisar)<2:
sym.SYMPY_DEBUG = True
else:
sym.SYMPY_DEBUG = False
# PROCEDIMIENTO
for i in range(0,len(revisar),1):
f = revisar[i]
# SALIDA
print('\nz_transform : ', i)
print(' f[n]:',f)
Fz = fcnm.z_transform(f,n,z)
print(' F[z]:',Fz)
if type(Fz)==tuple:
fn = fcnm.inverse_z_transform(Fz[0],z,n)
else:
fn = fcnm.inverse_z_transform(Fz,z,n)
print(' f[n]:',fn)