7.1.5 Transformada z Inversa con Sympy-Python

La Transformada z  inversa, usa la Tabla de Pares f[n] y F[z] y los algoritmos para buscar una expresión semejante F.match() en conjunto con la tabla de propiedades y los algoritmos desarrollados en la sección anterior. El resultado se integra desde telg1001.py y se muestra en los siguientes ejemplos:

Ejemplo 1.  Transformada z inversa de una fracción X[1/z]

Referencia: Oppenheim Ejemplo 10.13 p761, Lathi Ejemplo 5.1 p490

Continuando con el ejercicio presentado para convertir x[n] a X[z], se tiene que:

X[z] = \frac{1}{1-a z^{-1}}\text{ , } |z|>|a| X[z] = \frac{z}{z-a}\text{ , } \Big|z|>|a|

siendo la expresión de ingreso al algoritmo:

F = z/(z - 2)

el resultado es:

f[n] : (2**n*Heaviside(n), Abs(z) > 2, True)
>>> 

Ejemplo 1a. Instrucciones Python

# transformada z propiedades con Sympy
# aplicar luego de buscar en tabla de pares
import sympy as sym
import telg1001 as fcnm

# INGRESO
n = sym.Symbol('n', real=True)
z = sym.Symbol('z')
u = sym.Heaviside(n)

# (a**n)*f[n] <--> F(z/a)
F = z/(z - 2)  #f = (2**n)*u

# PROCEDIMIENTO
fn = fcnm.inverse_z_transform(F,z,n)

# SALIDA
print('f[n] :',fn)

El algoritmo presentado puede ser tomado como punto de partida para los siguientes ejercicios. Realizado para explicación conceptual.

Ejemplo 2. Transformada z inversa usando expansión en fracciones parciales

Referencia: Lathi 5.3 a

Encuentre la transformada z inversa para:

F[z] = \frac{8z-19}{(z-2)(z-3)}

el ingreso para el algoritmo del ejercicio anterior es:

F = (8*z-19)/((z-2)*(z-3))

con el resultado siguiente:

f[n] : (9*2**n + 10*3**n)*Heaviside(n)/6 - 19*DiracDelta(n)/6

activando la variable sym.SYMPY_DEBUG=True, se observa el proceso de fracción parcial modificada, la búsqueda en la tabla, y aplicación de una propiedad de la transformada z.

inverse_z_transform(F,z,n): (8*z - 19)/((z - 3)*(z - 2))

apart_z(F) : (8*z - 19)/((z - 3)*(z - 2))
_simplify_z: (8*z - 19)/((z - 3)*(z - 2))
  P_leadcoef: 8  ; P_zc: 1  ; P: z - 19/8
  _simplify_z k_sign: 1  ; k: 8  ; P_zc: 1  ; Q_zc: 1
    F[z]: (z - 19/8)/((z - 3)*(z - 2))
_simplify_z: (z - 19/8)/(z*(z - 3)*(z - 2))
  P_leadcoef: 8  ; P_zc: 1  ; P: z - 19/8
  Q_leadcoef: 8  ; Q_zc: z  ; Q: (z - 3)*(z - 2)
  _simplify_z k_sign: 1  ; k: 1  ; P_zc: 1  ; Q_zc: z
    F[z]: (z - 19/8)/((z - 3)*(z - 2))
  P: (8*z - 19)/8 
  Q: (z - 3)*(z - 2) 
  P_degree: 1  ; P_zeros: {19/8: 1} 
  Q_degree: 3  ; Q_poles: {3: 1, 2: 1, 0: 1}
  apart(F/z): 3/(16*(z - 2)) + 5/(24*(z - 3)) - 19/(48*z)
  ma_Qk: {a_: 48, b_: 0, c_: 1}  ; ma_Qk2: {b_: 48, a_: 0, c_: 0}
_simplify_z: -19/(48*z)
  P_leadcoef: -19  ; P_zc: 1  ; P: 1
  Q_leadcoef: 48  ; Q_zc: z  ; Q: 1
  _simplify_z k_sign: -1  ; k: 19/48  ; P_zc: 1  ; Q_zc: z
    F[z]: 1
  ma_Qk: {a_: 16, b_: -32, c_: 1}  ; ma_Qk2: {b_: 16, c_: -32, a_: 0}
_simplify_z: 3/(16*(z - 2))
  P_leadcoef: 3  ; P_zc: 1  ; P: 1
  Q_leadcoef: 16  ; Q_zc: 1  ; Q: z - 2
  _simplify_z k_sign: 1  ; k: 3/16  ; P_zc: 1  ; Q_zc: 1
    F[z]: 1/(z - 2)
  ma_Qk: {a_: 24, b_: -72, c_: 1}  ; ma_Qk2: {b_: 24, c_: -72, a_: 0}
_simplify_z: 5/(24*(z - 3))
  P_leadcoef: 5  ; P_zc: 1  ; P: 1
  Q_leadcoef: 24  ; Q_zc: 1  ; Q: z - 3
  _simplify_z k_sign: 1  ; k: 5/24  ; P_zc: 1  ; Q_zc: 1
    F[z]: 1/(z - 3)

 apart z*(Fz/z)  : 3*z/(2*(z - 2)) + 5*z/(3*(z - 3)) - 19/6 

 apart_z(F) as partial fractions: (-19/6, 3*z/(2*(z - 2)), 5*z/(3*(z - 3)))
  term_k[z]: -19/6
[0] _z_pairs_prop_inverse ----
_simplify_z: -19/6
  P_leadcoef: -19  ; P_zc: 1  ; P: 1
  Q_leadcoef: 6  ; Q_zc: 1  ; Q: 1
  _simplify_z k_sign: -1  ; k: 19/6  ; P_zc: 1  ; Q_zc: 1
    F[z]: 1
 _z_pairs_table match: 
  F: 1
  z_pair F[z]: 1  ; ma_z: {}
  z_pair f[n]: DiracDelta(n)
  try,check  : True -> True
[0]   pair f[n]: (-19*DiracDelta(n)/6, True, True)
  term_k[n]: (-19*DiracDelta(n)/6, True, True)
  term_k[z]: 3*z/(2*(z - 2))
[0] _z_pairs_prop_inverse ----
_simplify_z: 3*z/(2*(z - 2))
  P_leadcoef: 3  ; P_zc: 1  ; P: z
  Q_leadcoef: 2  ; Q_zc: 1  ; Q: z - 2
  _simplify_z k_sign: 1  ; k: 3/2  ; P_zc: 1  ; Q_zc: 1
    F[z]: z/(z - 2)

[1] z_properties_inverse_z_transform
  P: z 
  Q: z - 2 
  P_degree: 1  ; P_zeros: {0: 1} 
  Q_degree: 1  ; Q_poles: {2: 1}
  ma_P1 (a*z+ b):    {a_: 1, b_: 0}
  ma_Q1 (a*z-b)**c : {a_: 1, b_: 2, c_: 1}

 _z_property multiply (a**n)*f[n] <--> F(z/a) 
 k_sign: 1 ; k: 3/2  ; k_b: 2
 F[z]: z/(z - 1)
[2] _z_pairs_prop_inverse ----
_simplify_z: z/(z - 1)
    F[z]: z/(z - 1)
 _z_pairs_table match: 
  F: z/(z - 1)
  z_pair F[z]: z/(z - 1)  ; ma_z: {}
  z_pair f[n]: Heaviside(n)
  try,check  : True -> True
[2]   pair f[n]: (Heaviside(n), Abs(z) > 1, True)

  _z_property multiply (a**n)*f[n]:
  (3*2**n*Heaviside(n)/2, Abs(z) > 2, True)
[1]  _z_properties_inverse f[n]: (3*2**n*Heaviside(n)/2, Abs(z) > 2, True)
[0]   prop f[n]: (3*2**n*Heaviside(n)/2, Abs(z) > 2, True)
  term_k[n]: (3*2**n*Heaviside(n)/2, Abs(z) > 2, True)
  term_k[z]: 5*z/(3*(z - 3))
[0] _z_pairs_prop_inverse ----
_simplify_z: 5*z/(3*(z - 3))
  P_leadcoef: 5  ; P_zc: 1  ; P: z
  Q_leadcoef: 3  ; Q_zc: 1  ; Q: z - 3
  _simplify_z k_sign: 1  ; k: 5/3  ; P_zc: 1  ; Q_zc: 1
    F[z]: z/(z - 3)

[1] z_properties_inverse_z_transform
  P: z 
  Q: z - 3 
  P_degree: 1  ; P_zeros: {0: 1} 
  Q_degree: 1  ; Q_poles: {3: 1}
  ma_P1 (a*z+ b):    {a_: 1, b_: 0}
  ma_Q1 (a*z-b)**c : {a_: 1, b_: 3, c_: 1}

 _z_property multiply (a**n)*f[n] <--> F(z/a) 
 k_sign: 1 ; k: 5/3  ; k_b: 3
 F[z]: z/(z - 1)
[2] _z_pairs_prop_inverse ----
_simplify_z: z/(z - 1)
    F[z]: z/(z - 1)
 _z_pairs_table match: 
  F: z/(z - 1)
  z_pair F[z]: z/(z - 1)  ; ma_z: {}
  z_pair f[n]: Heaviside(n)
  try,check  : True -> True
[2]   pair f[n]: (Heaviside(n), Abs(z) > 1, True)

  _z_property multiply (a**n)*f[n]:
  (5*3**n*Heaviside(n)/3, Abs(z) > 3, True)
[1]  _z_properties_inverse f[n]: (5*3**n*Heaviside(n)/3, Abs(z) > 3, True)
[0]   prop f[n]: (5*3**n*Heaviside(n)/3, Abs(z) > 3, True)
  term_k[n]: (5*3**n*Heaviside(n)/3, Abs(z) > 3, True)

 f[n]: 3*2**n*Heaviside(n)/2 + 5*3**n*Heaviside(n)/3 - 19*DiracDelta(n)/6
 f[n]: (9*2**n + 10*3**n)*Heaviside(n)/6 - 19*DiracDelta(n)/6
f[n] : (9*2**n + 10*3**n)*Heaviside(n)/6 - 19*DiracDelta(n)/6
>>>