6.1.3 Sistema LTI DT – Solución iterativa con Python

El ejercicio planteado en Sistema Discreto – Solución iterativa, se desarrolla con un algoritmo en Python.


Ejercicio 1

Referencia: Lathi ejemplo 3.11 p266

Un sistema LTID tiene la siguiente expresión:

y[n] - 0.5 y[n-1] = x[n]

con condiciones iniciales y[-1]=16 y entrada causal x[n] = n2 ,para n≥0.


El algoritmo tiene el siguiente resultado:

LTI DT Solución iterativaEj01

muestras:  10
[[  n,  xi,  yi]]
[[ -1.     0.    16.  ]
 [  0.     0.     8.  ]
 [  1.     1.     5.  ]
 [  2.     4.     6.5 ]
 [  3.     9.    12.25]
 [  4.    16.    22.12]
 [  5.    25.    36.06]
 [  6.    36.    54.03]
 [  7.    49.    76.02]
 [  8.    64.   102.01]
 [  9.    81.   132.  ]]
>>> 

Algoritmo en Python

Las condiciones iniciales se ingresan como un vector con valores de posición ascendente. También es necesario indicar el número de muestras a observar. esto permite construir el vector de salida yi.

Las fórmulas de entrada y salida se muestran en la sección «calcula los siguientes valores»

# Sistema LTID. Solución iterativa
# Ejercicio Lathi ejemplo 3.11 p266
import numpy as np
import matplotlib.pyplot as plt

# INGRESO
muestras = 10
# condiciones iniciales ascendente ...,y[-2],y[-1]
y0  = [16.]

# PROCEDIMIENTO
m0 = len(y0)
m  = muestras + m0
# vectores
n  = np.arange(-m0,muestras,1)
xi = np.zeros(m, dtype=float)
yi = np.zeros(m, dtype=float)

# añade condiciones iniciales
xi[0:m0] = 0
yi[0:m0] = y0

# calcula los siguientes valores
for k in range(m0,m,1):
    xi[k] = n[k]**2
    yi[k] = 0.5*yi[k-1]+xi[k]

# tabla de valores
tabla = np.concatenate([[n],[xi],[yi]], axis=0)
tabla = np.transpose(tabla)
# SALIDA
np.set_printoptions(precision=2)
print('muestras: ', muestras)
print('[[  n,  xi,  yi]]')
print(tabla)

# Gráfica
plt.subplot(211)
plt.stem(n,xi,label='x[n]=n**2')
plt.xlabel('n')
plt.ylabel('x[n]')
plt.axvline(0,color='gray')
plt.legend()
plt.grid()

plt.subplot(212)
plt.stem(n,yi,label='y[n]=0.5y[n-1]+x[n]',
         markerfmt='go',
         linefmt='green')
plt.xlabel('n')
plt.ylabel('y[n]')
plt.axvline(0,color='gray')
plt.legend()
plt.grid()
plt.show()

Ejercicio 2

Se aplica el mismo algoritmo a otro ejercicio para comparar resultados con lo realizado en forma analítica.

Referencia: Lathi ejemplo 3.12 p267

Resolver de forma iterativa,

y[n+2] - y[n+1] +0.24y[n] = x[n+2] - 2x[n+1]

con las condiciones iniciales de y[-1] = 2, y[-2] =1 y entrada causal x[n]=n que inicia en n=0

Para usar la ecuación en el algoritmo, se desplaza dos posiciones en ambos lados de la ecuacion para despejar y[n]

y[n] - y[n-1] +0.24y[n-2] = x[n0] - 2x[n-1] y[n] = y[n-1] -0.24y[n-2] + x[n0] - 2x[n-1]

LTI DT Sol iterativa Ej02

muestras:  10
[[  n,  xi,  yi]]
[[ -2.     0.     1.  ]
 [ -1.     0.     2.  ]
 [  0.     0.     1.76]
 [  1.     1.     2.28]
 [  2.     2.     1.86]
 [  3.     3.     0.31]
 [  4.     4.    -2.14]
 [  5.     5.    -5.21]
 [  6.     6.    -8.7 ]
 [  7.     7.   -12.45]
 [  8.     8.   -16.36]
 [  9.     9.   -20.37]]
>>> 

Algoritmo en Python

# Sistema LTID. Solución iterativa
# Ejercicio Lathi ejemplo 3.12 p267
import numpy as np
import matplotlib.pyplot as plt

# INGRESO
muestras = 10
# condiciones iniciales ascendente ...,y[-2],y[-1]
y0  = [1,2]

# PROCEDIMIENTO
m0 = len(y0)
m  = muestras + m0
# vectores
n  = np.arange(-m0,muestras,1)
xi = np.zeros(m, dtype=float)
yi = np.zeros(m, dtype=float)

# añade condiciones iniciales
xi[0:m0] = 0
yi[0:m0] = y0

# calcula los siguientes valores
for k in range(m0,m,1):
    xi[k] = n[k]
    yi[k] = yi[k-1]-0.24*yi[k-2]+xi[k]-2*xi[k-1]

# tabla de valores
tabla = np.concatenate([[n],[xi],[yi]], axis=0)
tabla = np.transpose(tabla)
# SALIDA
np.set_printoptions(precision=2)
print('muestras: ', muestras)
print('[[  n,  xi,  yi]]')
print(tabla)

# Gráfica
plt.subplot(211)
plt.stem(n,xi,label='x[n]=n')
plt.xlabel('n')
plt.ylabel('x[n]')
plt.axvline(0,color='gray')
plt.legend()
plt.grid()

plt.subplot(212)
plt.stem(n,yi,label='y[n]=yi[k-1]-0.24*yi[k-2]+xi[k]-2*xi[k-1]',
         markerfmt='go',
         linefmt='green')
plt.xlabel('n')
plt.ylabel('y[n]')
plt.axvline(0,color='gray')
plt.legend()
plt.grid()
plt.show()