El algoritmo integra los casos presentados en los ejercicios anteriores para:
1. raíces reales diferentes
2. raíces con números complejos
3. raíces reales repetidas
Instrucciones en Python
EL detalle de los pasos se encuentra en los ejercicios con Python que se han integrado por caso.
# 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 # 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)