Los siguientes ejercicios de LTI Discretos muestran los desarrollos cuando el denominador de la función de transferencia tiene:
1. raíces reales diferentes (No repetidas)
2. raíces reales repetidas
3. raíces con números complejos
Ejercicio 1. Raíces reales diferentes
Referencia: Lathi Ejemplo 3.13 p271
Para un sistema LTID descrito por la ecuación de diferencias mostrada,
encuentre la respuesta a entrada cero y0[n] del sistema dadas las condiciones iniciales y[-1]=0, y[-2] =25/4, ante una entrada
(El componente de estado cero se calcula en la sección correspondiente)
Para realizar el diagrama, se desplaza la ecuación en dos unidades
Para respuesta a entrada cero se usa x[n] = 0
1.1 Desarrollo analítico
La ecuación del sistema en notación de operador E es:
que para entrada cero tiene x[n]=0,
tiene el polinomio característico,
con raíces características γ1=-0.2 y γ2=0.8, obtenidas con instrucciones con Python:
raices: [ 0.8 -0.2] coeficientes: [0.8 0.2]
la repuesta a entrada cero tiene la forma
se usan las condiciones iniciales para determinar las constantes c1 y c2 aplicadas como:
se tiene el sistema de ecuaciones
resolviendo se encuentra que: c1 = 0.2 c2 = 0.8
con lo que la solución tiene la expresión basado en la sumatoria de ci ϒn, para n≥0
Instrucciones en Python
import numpy as np coeficientes = [1.,-0.6,-0.16] raiz = np.roots(coeficientes) print('raices:') print(raiz) A = np.array([[raiz[0]**(-1) , raiz[1]**(-1)], [raiz[0]**(-2) , raiz[1]**(-2)]]) B = np.array([0., 25/4]) ci = np.linalg.solve(A,B) print('coeficientes:') print(ci)
1.2 Desarrollo con Python
El algoritmo requiere los coeficientes de la ecuación de diferencias Q(E) y P(E) junto a las condiciones iniciales.
QE = [1., -0.6, -0.16] PE = [5., 0., 0.] inicial = [25/4, 0.]
que da como resultado:
respuesta entrada cero: raices: [ 0.8 -0.2] Matriz: [[ 1.5625 25. ] [ 1.25 -5. ]] Ci: [0.8 0.2] y0: n n 0.2*-0.2 + 0.8*0.8
Instrucciones en Python
# Sistema LTID. Respuesta entrada cero # resultado con raices Reales # ejercicio Lathi ejemplo 3.13 p271 import numpy as np import sympy as sym import matplotlib.pyplot as plt # INGRESO # coeficientes E con grado descendente QE = [1., -0.6, -0.16] PE = [5., 0., 0.] # condiciones iniciales ascendente ...,y[-2],y[-1] inicial = [25/4, 0.] # PROCEDIMIENTO # Respuesta a ENTRADA CERO # raices, revisa numeros complejos gamma = np.roots(QE) revisaImag = np.iscomplex(gamma) escomplejo = np.sum(revisaImag) # coeficientes de ecuacion m_q = len(QE)-1 Ac = np.zeros(shape=(m_q,m_q),dtype=float) if escomplejo == 0: for i in range(0,m_q,1): for j in range(0,m_q,1): Ac[i,j] = gamma[j]**(-m_q+i) ci = np.linalg.solve(Ac,inicial) # ecuacion y0 n = sym.Symbol('n') y0 = 0 if escomplejo == 0: for i in range(0,m_q,1): y0 = y0 + ci[i]*(gamma[i]**n) # SALIDA print('respuesta entrada cero: ') print('raices: ', gamma) if escomplejo == 0: print('Matriz: ') print(Ac) print('Ci: ', ci) print('y0:') sym.pprint(y0) else: print(' existen raices con números complejos.') print(' usar algoritmo de la sección correspondiente.')
Raíces: [reales No repetidas] [reales repetidas] [números complejos]
2. Raíces repetidas
Referencia: Lathi Ejemplo 3.15 p274
con las condiciones iniciales y0[-1] = -1/3 y y0[-2] = -2/9
Para realizar el diagrama de bloques, se desplaza ambos lados de la ecuación en 2 unidades. Luego se despeja y[n]
2.1 Desarrollo analítico
siguiendo los mismos pasos que en los ejercicios anteriores
Para entrada cero se tiene x[n] = 0
de donde se muestra una raiz repetida γ=3, donde los modos característicos hacen que la expresión sea:
siguiendo el procedimiento realizado para raíces reales se puede determinar los valores de c1=4 y c2=3, con lo que se obtiene la solución:
los resultados obtenidos con el algoritmo en Python son
respuesta entrada cero: raices: [-3. -3.] Raices repetidas: 1 Matriz: [[ 0.11111111 -0.22222222] [-0.33333333 0.33333333]] Ci: [4. 3.] y0: n -3.0 *(3.0*n + 4.0) >>>
2.2 Instrucciones en Python, integrando raices reales únicas y repetidas
# Sistema LTID. Respuesta entrada cero # QE con raices Reales NO repetidas Lathi ejemplo 3.13 pdf271 # QE con raices Reales Repetidas Lathi ejemplo 3.15 p274 # blog.espol.edu.ec/telg1001 import numpy as np import sympy as sym import matplotlib.pyplot as plt # INGRESO # coeficientes E con grado descendente QE = [1., 6., 9.] PE = [2., 6., 0.] # condiciones iniciales ascendente ...,y[-2],y[-1] inicial = [-2/9, -1/3] tolera = 1e-6 # casi_cero # PROCEDIMIENTO # Respuesta a ENTRADA CERO # raices, revisa numeros complejos gamma = np.roots(QE) revisaImag = np.iscomplex(gamma) escomplejo = np.sum(revisaImag) # coeficientes de ecuacion m_q = len(QE)-1 Ac = np.zeros(shape=(m_q,m_q),dtype=float) # revisa si parte compleja <tolera o casi_cero if escomplejo>0: for i in range(0,m_q,1): if np.imag(gamma[i]) < tolera: gamma[i] = float(np.real(gamma[i])) sumaj = np.sum(np.imag(gamma)) if sumaj <tolera: gamma = np.real(gamma) escomplejo = 0 # revisa repetidos unicoscuenta = np.unique(gamma,return_counts=True) repetidas = np.sum(unicoscuenta[1]-1) # raices Reales no repetidas if escomplejo == 0 and repetidas==0: for i in range(0,m_q,1): for j in range(0,m_q,1): Ac[i,j] = gamma[j]**(-m_q+i) ci = np.linalg.solve(Ac,inicial) # raices Reales repetidas if escomplejo == 0 and repetidas > 0: for i in range(0,m_q,1): for j in range(0,m_q,1): Ac[i,j] = ((-m_q+i)**j)*gamma[j]**(-m_q+i) ci = np.linalg.solve(Ac,inicial) # ecuacion y0 entrada cero n = sym.Symbol('n') y0 = 0*n if escomplejo == 0 and repetidas==0: for i in range(0,m_q,1): y0 = y0 + ci[i]*(gamma[i]**n) if escomplejo == 0 and repetidas > 0: for i in range(0,m_q,1): y0 = y0 + ci[i]*(n**i)*(gamma[i]**n) y0 = y0.simplify() # SALIDA print('respuesta entrada cero: ') print('raices: ', gamma) if escomplejo == 0: if repetidas>0: print('Raices repetidas: ', repetidas) print('Matriz: ') print(Ac) print('Ci: ', ci) print('y0:') sym.pprint(y0) else: print(' existen raices con números complejos.') print(' usar algoritmo de la sección correspondiente.')
Raíces: [reales No repetidas] [reales repetidas] [números complejos]
Ejercicio 3. Raices con números complejos
Referencia: Lathi Ejemplo 3.16 p275
Para el caso de tener raíces con números complejos se muestra el siguiente ejemplo:
con condiciones iniciales y0[-1]=2 y y0[-2]=1
Para realizar el diagrama de bloques, se desplaza ambos lados de la ecuación en 2 unidades. Luego se despeja y[n]
3.1 Desarrollo analítico
La expresión usando operador E:
para entrada cero se hace x[n] = 0
por lo que, el polinomio característico es,}
con raíces de números complejos
la raíz también se puede escribir como:
obtenida mediante:
raices: [0.78+0.44899889j 0.78-0.44899889j] magnitud: [0.9 0.9] angulo: [ 0.52231482 -0.52231482] >>>
Se puede escribir la solución como:
Luego aplicando oas condiciones iniciales se encuentra que
Otra manera de desarrollo permite encontrar la solución usando la forma real de la solución, conociendo que la solución esta dada por la expresión:
con lo que se puede crear el sistema de ecuaciones aplicando las condiciones iniciales, ademas de considerar que:
Para y0[-2] = 1
Para y0[-1] = 2
con lo que se puede determinar los valores para [c cos(θ)] y [c sin(θ)]
usando una matriz A y vector B a partir de las ecuaciones
al dividir [c sin(θ)]/[c cos(θ)] = tan (θ), con lo que se obtiene el ángulo en radianes.
al sustituir el valor en c cos(θ) = 2.31 se tiene,
con lo que la solución se puede escribir mediante:
para n≥0
Instrucciones de cálculo
import numpy as np coeficientes = [1.,-1.56,0.81] raiz = np.roots(coeficientes) print('raices:') print(raiz) g_magnitud = np.absolute(raiz) g_angulo = np.angle(raiz) print('magnitud: ',g_magnitud) print('angulo: ',g_angulo)
3.2 Algoritmo en Python, integrando raices reales y complejas
usando el algoritmo se obtienen los siguientes resultados:
Respuesta entrada cero: raices : [0.78+0.44899889j 0.78-0.44899889j] raices complejas: 2 magnitud: [0.9 0.9] theta: [ 0.52231482 -0.52231482] Matriz: [[0.62002743 1.06757851] [0.96296296 0.55431961]] Cj: [ 2.31 -0.40490078] Ci: 2.345217397781524 y0: n 2.34521739778152*0.9 *cos(0.522314821806049*n + 0.173519005551295) >>>
Para el caso de raíces complejas, se añade al algoritmo anterior las instrucciones en Python:
# Sistema LTID. Respuesta entrada cero # QE con raices Reales NO repetidas Lathi ejemplo 3.13 pdf271 # QE con raices Reales Repetidas Lathi ejemplo 3.15 p274 # QE con raices Complejas Lathi ejemplo 3.16 p275 # blog.espol.edu.ec/telg1001 import numpy as np import sympy as sym import matplotlib.pyplot as plt # INGRESO # coeficientes E con grado descendente QE = [1.0, -1.56, 0.81] PE = [0., 1., 3.] # condiciones iniciales ascendente ...,y[-2],y[-1] inicial = [1.,2.] tolera = 1e-6 # casi_cero muestras = 10 # para grafica # PROCEDIMIENTO # Respuesta a ENTRADA CERO # raices, revisa numeros complejos gamma = np.roots(QE) revisaImag = np.iscomplex(gamma) escomplejo = np.sum(revisaImag) # coeficientes de ecuacion m_q = len(QE)-1 Ac = np.zeros(shape=(m_q,m_q),dtype=float) # revisa si parte compleja <tolera o casi_cero if escomplejo>0: for i in range(0,m_q,1): valorimag = np.imag(gamma[i]) if np.abs(valorimag)<tolera: gamma[i] = float(np.real(gamma[i])) sumaj = np.sum(np.abs(np.imag(gamma))) if sumaj <tolera: print(sumaj) gamma = np.real(gamma) escomplejo = 0 # revisa repetidos unicoscuenta = np.unique(gamma,return_counts=True) repetidas = np.sum(unicoscuenta[1]-1) # Determina coeficientes ci de Y[n] # raices Reales no repetidas if escomplejo == 0 and repetidas==0: for i in range(0,m_q,1): for j in range(0,m_q,1): Ac[i,j] = gamma[j]**(-m_q+i) ci = np.linalg.solve(Ac,inicial) # raices Reales repetidas if escomplejo == 0 and repetidas > 0: for i in range(0,m_q,1): for j in range(0,m_q,1): Ac[i,j] = ((-m_q+i)**j)*gamma[j]**(-m_q+i) ci = np.linalg.solve(Ac,inicial) # raices Complejas if escomplejo > 0: g_magnitud = np.absolute(gamma) g_angulo = np.angle(gamma) for i in range(0,m_q,1): k = -(m_q-i) a = np.cos(np.abs(g_angulo[i])*(k))*(g_magnitud[i]**(k)) b = -np.sin(np.abs(g_angulo[i])*(k))*(g_magnitud[i]**(k)) Ac[i] = [a,b] Ac = np.array(Ac) cj = np.linalg.solve(Ac,inicial) theta = np.arctan(cj[1]/cj[0]) ci = cj[0]/np.cos(theta) # ecuacion y0 entrada cero n = sym.Symbol('n') y0 = 0*n if escomplejo == 0 and repetidas==0: for i in range(0,m_q,1): y0 = y0 + ci[i]*(gamma[i]**n) if escomplejo == 0 and repetidas > 0: for i in range(0,m_q,1): y0 = y0 + ci[i]*(n**i)*(gamma[i]**n) y0 = y0.simplify() if escomplejo > 0: y0 = ci*(g_magnitud[0]**n)*sym.cos(np.abs(g_angulo[i])*n - theta) # SALIDA print('respuesta entrada cero: ') print('raices: ', gamma) if escomplejo == 0: if repetidas>0: print('Raices repetidas: ', repetidas) print('Matriz: ') print(Ac) print('Ci: ', ci) print('y0:') sym.pprint(y0) if escomplejo > 0: print('raices complejas: ', escomplejo) print('magnitud:',g_magnitud) print('theta:',g_angulo) print('Matriz: ') print(Ac) print('Cj: ', cj) print('Ci: ',ci) print('y0: ') sym.pprint(y0) # grafica datos ki = np.arange(-m_q,muestras,1) y0i = np.zeros(muestras+m_q) # valores iniciales y0i[0:m_q] = inicial[0:m_q] # evaluación de y0[n] y0n = sym.lambdify(n,y0) y0i[m_q:] = y0n(ki[m_q:]) # grafica y[n] ante x[n]=0 plt.stem(ki,y0i) plt.xlabel('ki') plt.ylabel('y0[n]') plt.title('y0[n]='+str(y0)) plt.grid() plt.show()
Raíces: [reales No repetidas] [reales repetidas] [números complejos]