3.3.1 LTI CT – Respuesta a impulso unitario h(t) con Sympy-Python

La respuesta al impulso reutiliza el algoritmo de para encontrar la solución homogenea de la ecuación diferencial lineal. Se reutiliza la función respuesta_ZIR() de la sección anterior.

Respuesta a Impulso: [Desarrollo Analítico]  [Sympy-Python]  [SciPy-Python]  [Runge-Kutta]  [Simulador]


.. ..


Ejemplo 1. Respuesta a impulso de un sistema RLC

Referencia: Lathi 1.8-1 p111. Ejercicio 2.1.a p 155. Oppenheim problema 2.61c p164, Ejemplo 9.24 p700.

Encontrar la Respuesta al impulso h(t), del sistema en el ejemplo 1 Modelo entrada-salida,
representado por el circuito y la ecuación diferencial lineal expresada desde el termino de mayor orden:

\frac{d^2}{dt^2}y(t) +3\frac{d}{dt}y(t) + 2y(t) = \frac{d}{dt}x(t)

La expresión en operadores D es:

(D^2 + 3D +2)y(t) = Dx(t)

Siguiendo el método simplificado al emparejar impulsos, las condiciones iniciales, dado que el orden de las derivadas de la izquierda es 2, se establece como y'(0)=1, y(0)=0.

N = 1 yn(0) = 1
N = 2 yn(0) = 0, y’n(0) = 1
N = 3 yn(0) = 0, y’n(0) = 0, y"n(0) = 1
N = 4

Siendo N el grado mayor de las derivadas de y(t) o lado izquierdo LHS y M el grado de mayor orden de las derivadas para x(t) o lado derecho RHS.

Si N>M, se tiene que b0=0. Si N=M el valor de b0 es el coeficiente de la derivada de mayor grado para x(t).

Desarrollo del algoritmo en Python

Se empieza buscando el orden N, para y(t) de las derivadas de la ecuación diferencial lineal. Con N se crea un vector ceros para condiciones de inicio y se escribe el valor de 1 a la primera casilla qu representa la posición de mayor orden de derivada .

# Método simplificado al emparejar impulsos
N = sym.ode_order(ecuacion.lhs,y)
M = sym.ode_order(ecuacion.rhs,x)

# Condiciones iniciales para respuesta a impulso
cond_inicio    = [0]*N # lista de ceros tamano N
cond_inicio[0] = 1     # condicion de mayor orden

Se debe buscar el coeficiente b0, que es el del término de mayor orden de la derivada para el lado derecho de la ecuación.

En la ecuacion parte derecha eq_RHS, se busca cada término hasta encontrar el de orden M. Se extrae el coeficiente del término encontrado. es decir todas las partes que no contienen el término de la derivada, ejemplo 3π.

# coeficiente de derivada de x(t) de mayor orden
b0 = sym.nan
if N>M:  # orden de derivada diferente
    b0 = 0
if N==M: # busca coeficiente de orden mayor
    eq_RHS = sym.expand(ecuacion.rhs)
    term_suma = sym.Add.make_args(eq_RHS)
    for term_k in term_suma:
        # coeficiente derivada mayor
        if (M == sym.ode_order(term_k,x)): 
            b0 = 1 # para separar coeficiente
            factor_mul = sym.Mul.make_args(term_k)
            for factor_k in factor_mul:
                if not(factor_k.has(sym.Derivative)):
                    b0 = b0*factor_k

Con el valor de b0 y las cond_inicio se usa el algoritmo respuesta_ZIR() realizado para encontrar la respuesta a entrada cero a partir de la ecuación homogenea.

\frac{d^2}{dt^2}y(t) +3\frac{d}{dt}y(t) + 2y(t) = 0

Con la ecuación homogenea  y con las condiciones iniciales, y'(0)=1, y(0)=0, de una entrada impulso, se obtiene como respuesta:

y(t) = C_1 e^{-t} + C_2 e^{-2t} y(t) = 1 e^{-t} -1 e^{-2t}

A partir de la solución homogénea, se crea la función h(t) aplicando la expresión:

h(t)=b_0 \delta (t)+ [P(D)y_n (t)] \mu (t)

y dado que para el ejercicio N>M, el orden de las derivadas de la izquierda es mayor que el orden de las derivadas de la derecha, se tiene que b0=0

h(t)=0 \delta (t) + [D y_n (t)] \mu (t)
# ecuacion homogenea x(t)=0, entrada cero y
# condiciones de impulso unitario
sol_ht  = fcnm.respuesta_ZIR(ecuacion,cond_inicio)

# Respuesta a impulso h(t)
P_y = ecuacion.rhs.subs(x(t),sol_ht['ZIR']).doit()
h = P_y*u + b0*sym.DiracDelta(t)
# h = sym.expand(h)

con lo que se llega a la respuesta de h(t),

h(t)= (-e^{-t} + 2e^{-2t})\mu (t)

La respuesta del algoritmo en Python es:

clasifica EDO:
  factorable
  nth_linear_constant_coeff_variation_of_parameters
  nth_linear_constant_coeff_variation_of_parameters_Integral
homogenea :
                        2          
           d           d           
2*y(t) + 3*--(y(t)) + ---(y(t)) = 0
           dt           2          
                      dt           
general :
           -t       -2*t
y(t) = C1*e   + C2*e    
eq_condicion :
0 = C1 + C2
1 = -C1 - 2*C2
constante : {C1: 1, C2: -1}
ZIR :
 -t    -2*t
e   - e  
h :
/   -t      -2*t\             
\- e   + 2*e    /*Heaviside(t)
>>>

y con gráfica:

respuesta impulso 01 Sympy h(t)

Instrucciones en Python

# Respuesta a impulso h(t) con Sympy-Python
# http://blog.espol.edu.ec/telg1001/lti-ct-respuesta-al-impulso-con-sympy-python/
# Lathi 2.1.a pdf 155, (D^2+ 3D + 2)y = Dx
import numpy as np
import matplotlib.pyplot as plt
import sympy as sym
equivalentes = [{'DiracDelta': lambda x: 1*(x==0)},
                {'Heaviside': lambda x,y: np.heaviside(x, 1)},
                'numpy',]
import telg1001 as fcnm

# INGRESO
t = sym.Symbol('t', real=True)
y = sym.Function('y')
x = sym.Function('x')
h = sym.Function('h')
u = sym.Heaviside(t)
d = sym.DiracDelta(t)

# ecuacion: lado izquierdo = lado derecho
#           Left Hand Side = Right Hand Side
LHS = sym.diff(y(t),t,2) + 3*sym.diff(y(t),t,1) + 2*y(t)
RHS = sym.diff(x(t),t,1,evaluate=False)
ecuacion = sym.Eq(LHS,RHS)

# cond_inicial con Método simplificado
# de emparejar impulsos

# Grafica: intervalo tiempo [t_a,t_b]
t_a = 0 ; t_b = 5 
muestras = 51

# PROCEDIMIENTO
# Método simplificado al emparejar términos
N = sym.ode_order(ecuacion,y)
M = sym.ode_order(ecuacion,x)

# coeficiente de derivada de x(t) de mayor orden
b0 = sym.nan
if N>M:  # orden de derivada diferente
    b0 = 0
if N==M: # busca coeficiente de orden mayor
    eq_RHS = sym.expand(ecuacion.rhs)
    term_suma = sym.Add.make_args(eq_RHS)
    for term_k in term_suma:
        # coeficiente derivada mayor
        if (M == sym.ode_order(term_k,x)): 
            b0 = 1 # para separar coeficiente
            factor_mul = sym.Mul.make_args(term_k)
            for factor_k in factor_mul:
                if not(factor_k.has(sym.Derivative)):
                    b0 = b0*factor_k

# Condiciones iniciales para respuesta a impulso
cond_inicio    = [0]*N # lista de ceros tamano N
cond_inicio[0] = 1     # condicion de mayor orden

# ecuacion homogenea x(t)=0, entrada cero y
# condiciones de impulso unitario
sol_yc = fcnm.respuesta_ZIR(ecuacion,cond_inicio)
yc = sol_yc['ZIR']

# Respuesta a impulso h(t)
P_y = ecuacion.rhs.subs(x(t),yc).doit()
h = P_y*u + b0*d
sol_yc['h'] = h

edo_tipo = sym.classify_ode(ecuacion, y(t))

# SALIDA
print('clasifica EDO:')
for elemento in edo_tipo:
    print(' ',elemento)
fcnm.print_resultado_dict(sol_yc)

# GRAFICA ------------------
# Para graficar la Salida
figura_h = fcnm.graficar_ft(h,t_a,t_b,muestras,'h')
plt.show()

Respuesta a Impulso: [Desarrollo Analítico]  [Sympy-Python]  [SciPy-Python]  [Runge-Kutta]  [Simulador]

..


Ejemplo 2. Ecuación diferencial lineal con Orden N=M

Referencia: Lathi. Ejercicio 2.4.a p167

Determine la respuesta al impulso de un sistema LTI C descrito por la siguiente ecuación diferencial ordinaria:

(D+2)y(t) = (3D+5) x(t)

El orden N=M=1, por lo que aplican las condiciones iniciales de t0=0, y(0)=1, y'(0)=0 para resolver usando el algoritmo de respuesta a entrada cero para obtener y(t) y aplicar luego la expresión:

h(t)=b_0 \delta (t)+ [P(D)y_n (t)] \mu (t)

siendo b0=3, que es el coeficiente de la derivada de mayor grado para el lado derecho de la expresión.

clasifica EDO:
  1st_linear
  almost_linear
  nth_linear_constant_coeff_variation_of_parameters
  1st_linear_Integral
  almost_linear_Integral
  nth_linear_constant_coeff_variation_of_parameters_Integral
homogenea :
         d           
2*y(t) + --(y(t)) = 0
         dt          
general :
           -2*t
y(t) = C1*e    
eq_condicion :
1 = C1
constante : {C1: 1}
ZIR :
 -2*t
e    
N : 1
M : 1
b0 : 3
h :
                   -2*t             
3*DiracDelta(t) - e    *Heaviside(t)
>>>

respuesta impulso 02 Sympy h(t)

Instrucciones en Python

El ejercicio se desarrolla creando la función edo_resp_impulso() para ser incluida en telg1001.py y así simplificar el algoritmo para el próximo ejercicio.

# Respuesta a impulso h(t) con Sympy-Python
# http://blog.espol.edu.ec/telg1001/lti-ct-respuesta-al-impulso-con-sympy-python/
# Lathi 2.1.a pdf 155, (D+2)y = (3D+5)x
import numpy as np
import matplotlib.pyplot as plt
import sympy as sym
equivalentes = [{'DiracDelta': lambda x: 1*(x==0)},
                {'Heaviside': lambda x,y: np.heaviside(x, 1)},
                'numpy',]
import telg1001 as fcnm

# INGRESO
t = sym.Symbol('t', real=True)
y = sym.Function('y')
x = sym.Function('x')
h = sym.Function('h')
u = sym.Heaviside(t)
d = sym.DiracDelta(t)

# ecuacion: lado izquierdo = lado derecho
#           Left Hand Side = Right Hand Side
LHS = sym.diff(y(t),t,1) + 2*y(t)
RHS = 3*sym.diff(x(t),t,1,evaluate=False)+5*x(t)
ecuacion = sym.Eq(LHS,RHS)

# cond_inicial con Método simplificado
# de emparejar impulsos

# Grafica: intervalo tiempo [t_a,t_b]
t_a = 0 ; t_b = 5 
muestras = 51

# PROCEDIMIENTO
def respuesta_impulso_h(ecuacion,t0=0,
                        y = sym.Function('y'),
                        x = sym.Function('x')):
    ''' respuesta a impulso h(t) de un
        sistema con Ecuacion Diferencial lineal
    '''
    # Método simplificado al emparejar términos
    N = sym.ode_order(ecuacion,y)
    M = sym.ode_order(ecuacion,x)

    # coeficiente de derivada de x(t) de mayor orden
    b0 = sym.nan
    if N>M:  # orden de derivada diferente
        b0 = 0
    if N==M: # busca coeficiente de orden mayor
        eq_RHS = sym.expand(ecuacion.rhs)
        term_suma = sym.Add.make_args(eq_RHS)
        for term_k in term_suma:
            # coeficiente derivada mayor
            if (M == sym.ode_order(term_k,x)): 
                b0 = 1 # para separar coeficiente
                factor_mul = sym.Mul.make_args(term_k)
                for factor_k in factor_mul:
                    if not(factor_k.has(sym.Derivative)):
                        b0 = b0*factor_k
    
    # Condiciones iniciales para respuesta a impulso
    cond_inicio    = [0]*N # lista de ceros tamano N
    cond_inicio[0] = 1     # condicion de mayor orden

    # ecuacion homogenea x(t)=0, entrada cero y
    # condiciones de impulso unitario
    sol_yc = fcnm.respuesta_ZIR(ecuacion,cond_inicio)
    yc = sol_yc['ZIR']

    # Respuesta a impulso h(t)
    P_y = ecuacion.rhs.subs(x(t),yc).doit()
    h = P_y*u + b0*d

    sol_yc['N'] = N
    sol_yc['M'] = M
    sol_yc['cond_inicio'] = cond_inicio
    sol_yc['b0'] = b0
    sol_yc['h'] = h
    return(sol_yc)

edo_tipo = sym.classify_ode(ecuacion, y(t))
# Respuesta a impulso h(t)
sol_h = respuesta_impulso_h(ecuacion)
h = sol_h['h']

# SALIDA
print('clasifica EDO:')
for elemento in edo_tipo:
    if 'linear' in  elemento.split('_'):
        print(' ',elemento)
fcnm.print_resultado_dict(sol_h)

# GRAFICA ------------------
# Para graficar la Salida
figura_h = fcnm.graficar_ft(h,t_a,t_b,muestras,'h')
plt.show()

Respuesta a Impulso: [Desarrollo Analítico]  [Sympy-Python]  [SciPy-Python]  [Runge-Kutta]  [Simulador]

..


Ejemplo 3. Ecuación diferencial lineal con Orden de N>M

Referencia: Lathi. Ejercicio 2.4.b p167

Determine la respuesta al impulso de un sistema LTI C descrito por la siguiente ecuación:

D(D+2)y(t) = (D+4) x(t)

El orden N>M, por lo que aplican las condiciones iniciales de t0=0, y(0)=0, y'(0)=1 para resolver usando el algoritmo de respuesta a entrada cero para obtener y(t) y aplicar luego la expresión:

h(t)=b_0 \delta (t)+ [P(D)y_n (t)] \mu (t)

siendo b0=0, que es el coeficiente de la derivada de mayor grado para el lado derecho de la expresión.

clasifica EDO:
  nth_linear_constant_coeff_variation_of_parameters
  nth_linear_constant_coeff_variation_of_parameters_Integral
homogenea :
               2          
  d           d           
2*--(y(t)) + ---(y(t)) = 0
  dt           2          
             dt           
general :
                -2*t
y(t) = C1 + C2*e    
eq_condicion :
0 = C1 + C2
1 = -2*C2
constante : {C1: 1/2, C2: -1/2}
ZIR :
     -2*t
1   e    
- - -----
2     2  
N : 2
M : 1
cond_inicio :  [ 1   0 ]
b0 : 0
h :
/     -2*t\             
\2 - e    /*Heaviside(t)
>>>

respuesta impulso 03 Sympy

Instrucciones en Python

# Respuesta a impulso h(t) con Sympy-Python
# http://blog.espol.edu.ec/telg1001/lti-ct-respuesta-al-impulso-con-sympy-python/
# Lathi. Ejercicio 2.4.b p167 D(D+2)y(t) = (D+4)x(t)
import numpy as np
import matplotlib.pyplot as plt
import sympy as sym
equivalentes = [{'DiracDelta': lambda x: 1*(x==0)},
                {'Heaviside': lambda x,y: np.heaviside(x, 1)},
                'numpy',]
import telg1001 as fcnm

# INGRESO
t = sym.Symbol('t', real=True)
y = sym.Function('y')
x = sym.Function('x')
h = sym.Function('h')
u = sym.Heaviside(t)
d = sym.DiracDelta(t)

# ecuacion: lado izquierdo = lado derecho
#           Left Hand Side = Right Hand Side
LHS = sym.diff(y(t),t,2) + 2*sym.diff(y(t),t,1)
RHS = sym.diff(x(t),t,1,evaluate=False)+4*x(t)
ecuacion = sym.Eq(LHS,RHS)

# cond_inicial con Método simplificado de emparejar impulsos

# Grafica: intervalo tiempo [t_a,t_b]
t_a = 0 ; t_b = 5 
muestras = 51

# PROCEDIMIENTO
edo_tipo = sym.classify_ode(ecuacion, y(t))
# Respuesta a impulso h(t)
sol_h = fcnm.respuesta_impulso_h(ecuacion)
h = sol_h['h']

# SALIDA
print('clasifica EDO:')
for elemento in edo_tipo:
    if 'linear' in  elemento.split('_'):
        print(' ',elemento)
fcnm.print_resultado_dict(sol_h)

# GRAFICA ------------------
figura_h = fcnm.graficar_ft(h,t_a,t_b,muestras,'h')
plt.show()

Respuesta a Impulso: [Desarrollo Analítico]  [Sympy-Python]  [SciPy-Python]  [Runge-Kutta]  [Simulador]

3.3 LTI CT – Respuesta a impulso unitario h(t) – Desarrollo analítico

Referencia: Lathi 2.3 p163, Ejemplo 2.4 p159, Oppenheim problema 2.2.2 p97, Hsu 2.5.E p61

La respuesta de un sistema al impulso h(t), se obtiene al aplicar un impulso unitario δ(t) en la entrada x(t), semejante a un destello durante un tiempo muy pequeño.

El impulso es semejante a tomar una foto con flash en una habitación oscura, con todo tranquilo, sin movimientos. Luego del flash, a pesar que ya no exista más la luz, todos las personas o seres vivos reaccionan al destello de luz durante un tiempo y visualizaron el contenido de la habitación, ésta es la respuesta al impulso del sistema.

La respuesta del sistema se puede conformar como la suma de una señal contínua generada mediante una secuencia de impulsos cuando el tiempo entre impulsos tiende a cero (dt→0).

Respuesta
total
= respuesta a
entrada cero
+ respuesta a
estado cero
ZSR = h(t) ⊗ x(t)

Respuesta a Impulso: [Desarrollo Analítico]  [Sympy-Python]  [SciPy-Python]  [Runge-Kutta]  [Simulador]

..


1. Respuesta a impulso h(t): Desarrollo Analítico

Un sistema de orden 2 se describe con la expresión de operadores D como:

Q(D)y(t) = P(D) x(t) (a_0 D^2+a_1 D + a_2)y(t)=(b_0 D^2 + b_1 D + b_2) x (t)

para disminuir la cantidad de variables se hace a0=1, al dividir la ecuación en ambos lados para a0. El resultado como aún tiene variables desconocidas, se mantiene la nomenclatura, que de forma simplificada se presenta como:

( D^2+a_1 D + a_2)y(t)=(b_0 D^2 + b_1 D + b_2) x (t)

La respuesta de un sistema al impulso unitario δ(t) aplicada en t=0, con todas las condiciones iniciales en cero en t=0-, se conoce como h(t).

(D^2+a_1 D + a_2)h(t)=(b_0 D^2 + b_1 D + b_2) \delta (t)

Para el análisis se consideran dos intervalos:

– Para t≥0+ donde x(t)=0, cuya respuesta es conocida como los términos de modos característicos o respuesta homogenea desarrollada en respuesta entrada cero ZIR

(D^2+a_1 D + a_2)h(t)=0, t \ge 0

h(t) = términos de modos característicos

– Para t=0 donde existe x(t)=δ(t), que suma a la respuesta anterior una constante A0 por un impulso.

h(t) = (términos de modos característicos) + A0 δ(t)

que al insertar esta ecuación en la expresión original tenemos:

(D^2+a_1 D + a_2)(A_0 \delta(t) + \text{terminos modos caracteristicos}) = =(b_0 D^2 + b_1 D + b_2) \delta (t)

que al multiplicar la parte de la izquierda, y comparando términos de ambos lados se determina que A0 = b0

que es como expresar

h(t) = b_0 \delta (t) + \text{modos caracteristicos}

y si el orden del lado derecho M es menor que el del izquierdo N, b0=0.

h(t)=b_0 \delta (t)+ [P(D)y_n (t)] \mu (t)

Revisar Lathi 2.3 pdf 163 para una descripción más detallada del método.


Método simplificado al emparejar impulsos

Referencia: Lathi 2.3 p165

El método permite reducir el procedimiento para determinar h(t) de un sistema LTIC.

h(t) = b_0 \delta (t) + [P(D) y_n(t)] \mu (t)

donde yn(t) es una combinación de modos característicos del sistema sujeto a las condiciones iniciales siguientes:

y_n(0) = y'_n(0) = y''_n(0) = y_n^{(N-2)}(0) = 0 y_n^{(N-1)}(0) = 1

Donde y(k)n(0) es el valor de la k-ésima derivada de yn(t) para t=0.

Si orden de P(D) es menor que el orden de Q(D) entonces b0=0 y el término del impulso b0δ(t) en h(t) es cero.

N = 1 yn(0) = 1
N = 2 yn(0) = 0, y’n(0) = 1
N = 3 yn(0) = 0, y’n(0) = 0, y"n(0) = 1
N = 4

Ejemplo 1. Respuesta al impulso de una ecuación diferencial lineal de 2do orden

Referencia: Lathi Ejemplo 2.6 p166, Oppenheim 2.2.2 p94

Un sistema se describe con la ecuación mostrada y se pide determinar la respuesta al impulso unitario h(t).

( D^2 + 3D +2 ) y(t) = Dx(t) ( D^2 + 3D +2 ) y(t) = (D+0)x(t)

Desarrollo Analítico

Semejante al análisis realizado para respuesta a entrada cero ZIR, el problema tiene un sistema se segundo orden con polinomio característico:

\lambda ^2 + 3\lambda +2 = (\lambda +1)(\lambda + 2)
Raíces características Modos característicos
λ1 = -1 e-t
λ2 = -2 e-2t

con lo que la solución general tienen la forma:

y_0 (t) = c_1 e^{-t} + c_2 e^{-2t}

se toman las condiciones iniciales de la tabla del método simplificado para emparejar impulsos para N=2, por ser un sistema de segundo orden

y(0) = 0 , y'(0) = 1

y se aplican en la solución general:

y_0 (t) = c_1 e^{-t} + c_2 e^{-2t} y'_0 (t)= -c_1 e^{-t} -2c_2 e^{-2t}

al sustituir los valores iniciales en la solución general con t=0, se obtienen los valores de las constantes,

0 =  c1 + c2 
1 = -c1 - 2c2 

c1 = 1 
c2 = -1

obteniendo como solución de la ecuación homogenea:

y_n (t) = 1 e^{-t} - 1e^{-2t}

De la ecuación del problema, se tiene que del lado derecho de la ecuación, P(D)=D, entonces:

P(D)y_n (t) = Dy_n (t) = y'_n (t) = -e^{-t} + 2e^{-2t}

Dado el caso que en la ecuacion, el orden de la derivadas de la derecha M es menor que el orden de derivadas de la izquierda N, (N>M), el término de segundo orden no se encuentra en P(D), entonces: b0=0

h(t) = b_0 \delta (t) + [P(D) y_n(t)] \mu (t) h(t)= 0\delta (t) + [-e^{-t} + 2e^{-2t}] \mu (t) h(t)= (-e^{-t} + 2e^{-2t})\mu (t)

LTIC Ejercicio 01 ht Sympy

Respuesta a Impulso: [Desarrollo Analítico]  [Sympy-Python]  [SciPy-Python]  [Runge-Kutta]  [Simulador]

3.2.1 LTI CT – Respuesta a entrada cero ZIR con Sympy-Python

Para encontrar la  Respuesta a entrada cero del sistema lineal del Modelo entrada-salida, circuito RLC ejemplo respuesta impulsorepresentado por un circuito, se plantea la ecuación diferencial lineal escrita desde el termino de mayor orden. Por ejemplo:

\frac{d^2}{dt^2}y(t) +3\frac{d}{dt}y(t) + 2y(t) = \frac{d}{dt}x(t)

Luego se se simplifica haciendo x(t)=0, obteniendo ecuación complementaria relacionada a la forma homogénea de la ecuación diferencial.

\frac{d^2}{dt^2}y(t) +3\frac{d}{dt}y(t) + 2y(t) = 0
.. ..


Ejemplo 1. Respuesta a entrada cero ZIR para un sistema LTI CT – Desarrollo analítico con Sympy

Referencia: Lathi Ejemplo 2.1.a p155, Oppenheim 2.4.1 p117, ejemplo 1 de Modelo entrada-salida, Sympy ODE solver

El circuito que representa la respuesta a entrada cero tiene x(t)=0 como se muestra en la figura.

La ecuación diferencial con operadores D es:

(D^2 + 3D +2)y(t) = 0

Adicionalmente, para el desarrollo se indican las condiciones iniciales y'(0)=-5, y(0)=0.

La librería Sympy-Python permite usar expresiones de derivadas en forma simbólica y resolverlas siguiendo los pasos seguidos en la solución analítica.

Para iniciar el algoritmo, se define la variable independiente t como un símbolo y las función matemática y(t) para la salida y x(t) para la entrada.

La ecuación diferencial se escribe siguiendo el orden de los lados de expresión denominados para la parte izquierda, LHS, y la parte derecha, RHS.

import sympy as sym

# INGRESO
t = sym.Symbol('t', real=True)
y = sym.Function('y')
x = sym.Function('x')

# ecuacion EDO: lado izquierdo = lado derecho
#               Left Hand Side = Right Hand Side
LHS = sym.diff(y(t),t,2) + 3*sym.diff(y(t),t,1) + 2*y(t)
RHS = sym.diff(x(t),t,evaluate=False)
ecuacion_edo = sym.Eq(LHS,RHS)

# condiciones iniciales [y'(t0),y(t0)]
t0 = 0
cond_inicio = [-5,0]

Las condiciones iniciales y’(0)=-5, y(0)=0 , se agrupan en una lista cond_inicio=[y'(t0),y(t0)] siguiendo el orden descendente de derivada, semejante al orden seguido al escribir la ecuación diferencial. El orden usado facilita la compatibilidad con las soluciones numéricas a realizar con Scipy-Python.

Solución general de la ecuación diferencial lineal homogénea

Se obtiene la ecuación homogénea aplicando x(t)=0 al lado derecho de la ecuación diferencial (RHS).

La solución general de la EDO se obtiene mediante la instrucción sym.dsolve() aplicada a la ecuación, indicando que se busca resolver para y(t). Para facilitar el procesamiento con Sympy, las ecuaciones se expresan con  términos mas simples de sumas, aplicando la instrucción sym.expand().

# ecuacion homogenea x(t)=0, entrada cero
RHSx0 = ecuacion.rhs.subs(x(t),0).doit()
LHSx0 = ecuacion.lhs.subs(x(t),0).doit()
homogenea = LHSx0 - RHSx0

# solucion general entrada cero
general = sym.dsolve(homogenea, y(t))
general = general.expand()

Con lo que se obtiene la solución general mostrada con sym.pprint():

           -t       -2*t
y(t) = C1*e   + C2*e    

Las condiciones iniciales se aplican a la solución general para encontrar la solución homogenea o ZIR. Para aplicar cada condición inicial se usa el lado derecho (.rhs )de la ecuación general, por ejemplo:

y'_0 (0) = -5 y'(t)\Big|_{t=0} = \frac{d}{dt}\Big[ c_1 e^{-t} + c_2 e^{-2t})\Big]\Big|_{t=0} =\Big[ -c_1 e^{-t} -2c_2 e^{-2}\Big] \Big|_{t=0} = -c_1 e^{-0} -2c_2 e^{-2(0)} -c_1 -2c_2 = -5

Se realiza lo mismo para y(0)=0

Cada condición inicial genera una ecuación que se agrupa en un sistema de ecuaciones, eq_condicion=[]. El sistema de ecuaciones se resuelve con la instrucción sym.solve(), que entrega las constantes para las incógnitas C1 y C2 en un dicionario.

# aplica condiciones iniciales 
N = sym.ode_order(LHS,y) # orden Q(D)
eq_condicion = []
for k in range(0,N,1):
    ck   = cond_inicio[(N-1)-k]
    dyk  = general.rhs.diff(t,k)
    dyk  = dyk.subs(t,t0)
    eq_k = sym.Eq(ck,dyk)
    eq_condicion.append(eq_k)
    
constante = sym.solve(eq_condicion)

El resultado de eq_condicion y las constantes obtenidas se muestra a continuación

 0 =  C1 +   C2
-5 = -C1 - 2*C2
{C1: -5, C2: 5}

La solución homogénea o  ZIR de la ecuación diferencial se obtiene al sustituir las constantes encontradas en la ecuación general.

# reemplaza las constantes en general
y_c = general
for Ci in constante:
    y_c = y_c.subs(Ci, constante[Ci])
# ecuacion complementaria o respuesta a entrada cero ZIR
ZIR = y_c.rhs

obteniendo solución a la ecuación homogena ‘y‘, o respuesta a entrada cero ZIR, mostrada con sym.pprint(y_homogenea). Para ZIR se toma el dado derecho de y_homogenea.

            -t      -2*t
y(t) = - 5*e   + 5*e
y(t) = -5 e^{-t} + 5 e^{-2t}

resultado del algoritmo:

ecuación diferencial a resolver: 
                        2                 
           d           d          d       
2*y(t) + 3*--(y(t)) + ---(y(t)) = --(x(t))
           dt           2         dt      
                      dt                  
clasifica EDO:
  factorable
  nth_linear_constant_coeff_variation_of_parameters
  nth_linear_constant_coeff_variation_of_parameters_Integral
ecuación diferencial homogenea: 
                        2          
           d           d           
2*y(t) + 3*--(y(t)) + ---(y(t)) = 0
           dt           2          
                      dt           

Solución general: 
           -t       -2*t
y(t) = C1*e   + C2*e    

Ecuaciones de condiciones iniciales:
0 = C1 + C2
-5 = -C1 - 2*C2
constantes en solucion general:  {C1: -5, C2: 5}
ZIR(t):
     -t      -2*t
- 5*e   + 5*e       
>>> 

Instrucciones en Python

# Respuesta a entrada cero ZIR con Sympy
# Lathi 2.1.a pdf 155, (D^2+ 3D + 2)y = Dx
import sympy as sym
equivalentes = [{'DiracDelta': lambda x: 1*(x==0)},
                {'Heaviside': lambda x,y: np.heaviside(x, 1)},
                'numpy',]

# INGRESO
t = sym.Symbol('t', real=True)
y = sym.Function('y')
x = sym.Function('x')

# ecuacion: lado izquierdo = lado derecho
#           Left Hand Side = Right Hand Side
LHS = sym.diff(y(t),t,2) + 3*sym.diff(y(t),t,1) + 2*y(t)
RHS = sym.diff(x(t),t,1,evaluate=False)
ecuacion = sym.Eq(LHS,RHS)

# condiciones iniciales [y'(t0),y(t0)]
t0 = 0
cond_inicio = [-5,0]

# PROCEDIMIENTO
edo_tipo = sym.classify_ode(ecuacion, y(t))

# ecuación homogénea x(t)=0, entrada cero
RHSx0 = ecuacion.rhs.subs(x(t),0).doit()
LHSx0 = ecuacion.lhs.subs(x(t),0).doit()
homogenea = LHSx0 - RHSx0

# solucion general de ecuación homogénea
general = sym.dsolve(homogenea, y(t))
general = general.expand()

# aplica condiciones iniciales 
N = sym.ode_order(ecuacion,y(t)) # orden Q(D)
eq_condicion = []
for k in range(0,N,1):
    ck   = cond_inicio[(N-1)-k]
    dyk  = general.rhs.diff(t,k)
    dyk  = dyk.subs(t,t0)
    eq_k = sym.Eq(ck,dyk)
    eq_condicion.append(eq_k)
    
constante = sym.solve(eq_condicion)

# reemplaza las constantes en general
y_c = general
for Ci in constante:
    y_c = y_c.subs(Ci, constante[Ci])
# respuesta a entrada cero ZIR
ZIR = y_c.rhs

# SALIDA
print('ecuación diferencial a resolver: ')
sym.pprint(ecuacion)

print('clasifica EDO:')
for elemento in edo_tipo:
    print(' ',elemento)

print('ecuación diferencial homogenea: ')
sym.pprint(homogenea)

print('\nSolución general: ')
sym.pprint(general)

print('\nEcuaciones de condiciones iniciales:')
for eq_k in eq_condicion:
    sym.pprint(eq_k)
print('constantes en solucion general: ', constante)
print('\nZIR(t):')
sym.pprint(ZIR)

Gráfica de respuesta a entrada cero ZIR

respuesta Entrada Cero 01 Sympy ZIR

Adicionalmente se realiza la gráfica, convirtiendo la ecuación de forma simbólica a forma numérica numpy con sym.lambdify(t,ZIR,'numpy').

Se establece el intervalo de observación entre t_a=0 y t_b=5 para evaluar la función y se envia a graficar, con el suficiente número de muestras para que la gráfica se muestre suave.

Se añaden las siguientes instrucciones al algoritmo anterior:

# GRAFICA ------------------
import numpy as np
import matplotlib.pyplot as plt

# INGRESO
t_a = 0 ; t_b = 5 # intervalo tiempo [t_a,t_b]
muestras = 51

# PROCEDIMIENTO
yt = sym.lambdify(t,ZIR, modules=equivalentes) 
ti = np.linspace(t_a,t_b,muestras)
yi = yt(ti)

# Grafica
plt.plot(ti,yi, color='orange', label='ZIR(t)')
untitulo = 'ZIR(t)=$'+ str(sym.latex(ZIR))+'$'
plt.title(untitulo)
plt.xlabel('t')
plt.ylabel('ZIR(t)')
plt.legend()
plt.grid()
plt.show()

Respuesta entrada cero: [Desarrollo Analítico]  [Sympy-Python]  [Scipy-Python ]  [Runge-Kutta d2y/dx2]  [Simulador]

..


Ejemplo 2. Respuesta a entrada cero ZIR con raíces características repetidas

Referencia: Lathi Ejemplo 2.1.b p155

Encontrar y0(t), la respuesta a entrada cero para un sistema LTI CT descrito  por la ecuación diferencial lineal de orden 2:

(D^2 + 6D +9)y(t) = (3D+5)x(t)

con las condiciones iniciales y(0) = 3, y'(0)=-7

El sistema tiene un polinomio característico de raíces repetidas. El resultado usando el algoritmo se muestra a continuación:

clasifica EDO:
  factorable
  nth_linear_constant_coeff_variation_of_parameters
  nth_linear_constant_coeff_variation_of_parameters_Integral
homogenea :
                        2          
           d           d           
9*y(t) + 6*--(y(t)) + ---(y(t)) = 0
           dt           2          
                      dt           
general :
           -3*t         -3*t
y(t) = C1*e     + C2*t*e    
eq_condicion :
3 = C1
-7 = -3*C1 + C2
constante : {C1: 3, C2: 2}
ZIR :
     -3*t      -3*t
2*t*e     + 3*e        

respuesta Entrada Cero 02 Sympy ZIR

Instrucciones en Python

Se reordena el algoritmo del ejercicio anterior para disponer de funciones que simplifiquen las instrucciones principales para obtener las respuestas de los ejercicios. Se crean las funciones respuesta_ZIR() y graficar_ft() que luego pasarán a ser parte de los algoritmos del curso en telg1001.py.

Para las definiciones de RHS y LHS dentro de la función se usa ecuación.rhs y ecuacion.lhs.

En el diccionario solución, se incorpora la respuesta en la entrada 'ZIR'.

# Respuesta a entrada cero ZIR con Sympy-Python
# http://blog.espol.edu.ec/telg1001/lti-ct-respuesta-entrada-cero-con-sympy-python/
# Lathi 2.1.b pdf 155, (D^2+ 6D + 9)y = (3D+5)x
import numpy as np
import matplotlib.pyplot as plt
import sympy as sym
equivalentes = [{'DiracDelta': lambda x: 1*(x==0)},
                {'Heaviside': lambda x,y: np.heaviside(x, 1)},
                'numpy',]
import telg1001 as fcnm

# INGRESO
t = sym.Symbol('t', real=True)
y = sym.Function('y')
x = sym.Function('x')

# ecuacion: lado izquierdo = lado derecho
#           Left Hand Side = Right Hand Side
LHS = sym.diff(y(t),t,2) + 6*sym.diff(y(t),t,1) + 9*y(t)
RHS = 3*sym.diff(x(t),t,1,evaluate=False)+5*x(t)
ecuacion = sym.Eq(LHS,RHS)

# condiciones iniciales [y'(t0),y(t0)]
t0 = 0
cond_inicio = [-7,3]

# Grafica: intervalo tiempo [t_a,t_b]
t_a = 0 ; t_b = 5
muestras = 51

# PROCEDIMIENTO
def respuesta_ZIR(ecuacion,cond_inicio=[],t0,
                y = sym.Function('y'),x = sym.Function('x')):
    ''' Sympy: ecuacion: diferencial en forma(LHS,RHS),
        condiciones de inicio t0 y [y'(t0),y(t0)]
        cond_inicio en orden descendente derivada
    '''
    # ecuacion homogenea x(t)=0, entrada cero
    RHSx0 = ecuacion.rhs.subs(x(t),0).doit()
    LHSx0 = ecuacion.lhs.subs(x(t),0).doit()
    homogenea = LHSx0 - RHSx0

    # solucion general entrada cero
    general = sym.dsolve(homogenea,y(t))
    general = general.expand()

    # aplica condiciones iniciales 
    N = sym.ode_order(ecuacion,y(t)) # orden Q(D)
    eq_condicion = []
    for k in range(0,N,1):
        ck   = cond_inicio[(N-1)-k]
        dyk  = general.rhs.diff(t,k)
        dyk  = dyk.subs(t,t0)
        eq_k = sym.Eq(ck,dyk)
        eq_condicion.append(eq_k)
        
    constante = sym.solve(eq_condicion)

    # reemplaza las constantes en general
    y_c = general
    for Ci in constante:
        y_c = y_c.subs(Ci, constante[Ci])
    # respuesta a entrada cero ZIR
    ZIR = y_c.rhs
    
    sol_ZIR = {'homogenea'   : sym.Eq(homogenea,0),
               'general'     : general,
               'eq_condicion': eq_condicion,
               'constante'   : constante,
               'ZIR' : ZIR,}
    return(sol_ZIR)

edo_tipo = sym.classify_ode(ecuacion, y(t))
# Respuesta entrada cero ZIR
sol_ZIR = respuesta_ZIR(ecuacion,cond_inicio,t0)
ZIR = sol_ZIR['ZIR']

# SALIDA
print('clasifica EDO:')
for elemento in edo_tipo:
    print(' ',elemento)
fcnm.print_resultado_dict(sol_ZIR)

# GRAFICA ------------------
figura_ZIR = fcnm.graficar_ft(ZIR,t_a,t_b,muestras,'ZIR')
plt.show()

Respuesta entrada cero: [Desarrollo Analítico]  [Sympy-Python]  [Scipy-Python ]  [Runge-Kutta d2y/dx2]  [Simulador]
..


Ejemplo 3. EDO y respuesta a entrada cero ZIR con raíces complejas

Referencia: Lathi Ejemplo 2.1.c p155

Encontrar y0(t), la respuesta a entrada cero para un sistema LTI CT descrito  por la ecuación diferencial ordinaria de orden 2:

(D^2 + 4D +40)y(t) = (D+2)x(t)

con condiciones iniciales y(0) = 2, y'(0)=16.78

Tarea: Use el algoritmo del ejercicio anterior y modifique lo necesario para realizar el ejercicio. Realice el desarrollo analítico en papel y lápiz y compare. En caso de ser necesario, proponga mejoras al algoritmo presentado.

Los resultados con el algoritmo son:

ecuación diferencial a resolver: 
                         2                          
            d           d                   d       
40*y(t) + 4*--(y(t)) + ---(y(t)) = 2*x(t) + --(x(t))
            dt           2                  dt      
                       dt                           
ecuación diferencial homogenea: 
                         2          
            d           d           
40*y(t) + 4*--(y(t)) + ---(y(t)) = 0
            dt           2          
                       dt           

Solución general: 
           -2*t                -2*t         
y(t) = C1*e    *sin(6*t) + C2*e    *cos(6*t)

Ecuaciones de condiciones iniciales:
2 = C2
16.78 = 6*C1 - 2*C2
constantes en solución general:  {C1: 3.46333333333333, C2: 2.00000000000000}

Solución ZIR:
                  -2*t                 -2*t         
3.46333333333333*e    *sin(6*t) + 2.0*e    *cos(6*t)
>>>

respuesta Entrada Cero 03 Sympy ZIR
Instrucciones con Python

# Respuesta a entrada cero ZIR con Sympy-Python
# http://blog.espol.edu.ec/telg1001/lti-ct-respuesta-entrada-cero-con-sympy-python/
# Lathi 2.1.c pdf 155, (D^2+ 4D + 40)y = (D+2)x
import numpy as np
import matplotlib.pyplot as plt
import sympy as sym
equivalentes = [{'DiracDelta': lambda x: 1*(x==0)},
                {'Heaviside': lambda x,y: np.heaviside(x, 1)},
                'numpy',]
import telg1001 as fcnm

# INGRESO
t = sym.Symbol('t', real=True)
y = sym.Function('y')
x = sym.Function('x')

# ecuacion: lado izquierdo = lado derecho
#           Left Hand Side = Right Hand Side
LHS = sym.diff(y(t),t,2) + 4*sym.diff(y(t),t,1) + 40*y(t)
RHS = sym.diff(x(t),t,1,evaluate=False)+2*x(t)
ecuacion = sym.Eq(LHS,RHS)

# condiciones iniciales [y'(t0),y(t0)]
t0 = 0
cond_inicio = [16.78,2]

# Grafica: intervalo tiempo [t_a,t_b]
t_a = 0 ; t_b = 5
muestras = 51

# PROCEDIMIENTO
edo_tipo = sym.classify_ode(ecuacion, y(t))
# Respuesta entrada cero ZIR
sol_ZIR = fcnm.respuesta_ZIR(ecuacion,cond_inicio,t0)
ZIR = sol_ZIR['ZIR']

# SALIDA
print('clasifica EDO:')
for elemento in edo_tipo:
    print(' ',elemento)
fcnm.print_resultado_dict(sol_ZIR)

# GRAFICA ------------------
figura_ZIR = fcnm.graficar_ft(ZIR,t_a,t_b,muestras,'ZIR')
plt.show()

Resumen de funciones de Señales y Sistemas telg1001.py

Las funciones desarrolladas para uso posterior se agrupan en un archivo resumen telg1001.py.

Use una copia del archivo como telg1001.py en el directorio de trabajo, e incorpore las funciones  con import y use en el algoritmo llamando a la funcion con fcnm.funcion().

iimport telg1001 as fcnm

respuesta = fcnm.funcion(parametros)

Al desarrollar más funciones en cada unidad, se incorporan al archivo del curso de Señales y Sistemas.

Mostrar el resultado del diccionario según el tipo de entrada

Para mostrar los resultados de una forma más fácil de leer, se usará sym.pprint() para las ecuaciones, y print() para los demás elementos del resultado

def print_resultado_dict(resultado):
    ''' print de diccionario resultado
        formato de pantalla
    '''
    eq_sistema = ['ZIR','h','ZSR','xh']
    for entrada in resultado:
        tipo = type(resultado[entrada])
        cond = (tipo == sym.core.relational.Equality)
        cond = cond or (entrada in eq_sistema)
        if cond:
            print(entrada,':')
            sym.pprint(resultado[entrada])
        elif tipo==list or tipo==tuple:
            tipoelem = type(resultado[entrada][0])
            if tipoelem==sym.core.relational.Equality:
                print(entrada,':')
                for fila in resultado[entrada]:
                    sym.pprint(fila)
            else:
                print(entrada,':')
                for fila in resultado[entrada]:
                    print(' ',fila)
        else:
            print(entrada,':',resultado[entrada])
    return()

 

3.2 LTI CT – Respuesta a entrada cero ZIR – Desarrollo analítico

Referencia: Lathi 2.1 p151, Hsu 2.5.B p60, Oppenheim 2.14 p118

La respuesta a entrada cero de un sistema se obtiene aplicando x(t)=0 en la ecuación diferencial lineal, es decir no se le aplica una señal de entrada. La respuesta a entrada cero, Zero Input Response (ZIR), también es conocida como la solución a la ecuación diferencial homogénea, en la que x(t)=0.

Respuesta
total
= respuesta a
entrada cero ZIR
+ respuesta a
estado cero ZSR

La respuesta a entrada cero permite observar las condiciones internas del sistema, cargas en capacitores o corrientes en inductores como energía residual de los estados anteriores al de observación.

La ecuación diferencial lineal homogénea se obtiene también hacer x(t)=0, de una forma:

a_0 \frac{d^2}{dt^2}y(t) +a_1\frac{d}{dt}y(t) + a_2y(t) = 0

..


Ejemplo 1. Respuesta a entrada cero ZIR para un sistema LTI CT – Desarrollo analítico

Referencia: Lathi Ejemplo 2.1.a p155, Oppenheim ej2.14 p118, ejemplo 1 de Modelo entrada-salida

Encuentre la respuesta a entrada cero (ZIR) para el sistema LTI CT del circuito RLC, descrito por la ecuación diferencial lineal:

\frac{d^{2}y(t)}{dt^{2}} + 3\frac{dy(t)}{dt} + 2y(t) = \frac{dx(t)}{dt} (D^2 + 3D +2)y(t) = Dx(t)

con las condiciones o valores iniciales descritos por:

y0(t) =0
y’0(t) =-5

La entrada cero del circuito, x(t)=0 convierte la ecuación lineal en homogénea. Para entrada cero se usa x(t)=0, se quita la fuente y se cierra el circuito para observar lo que hace el sistema sin señal de entrada.

\frac{d^{2}y(t)}{dt^{2}} + 3\frac{dy(t)}{dt} + 2y(t) = 0 (D^2 + 3D +2)y(t) = 0

Siendo el sistema LTI descrito por los polinomios de operadores D descritos como Q(D) y P(D), la ecuación se simplifica al eliminar P(D):

Q(D) y(t) = P(D) x(t) (D^2 + 3D +2)y(t) = 0

Q(D) es la ecuación característica o auxiliar del sistema:

\lambda ^2 + 3\lambda +2 = 0

Al buscar las raíces de λ, se escribe la ecuación en sus factores y se puede buscar los modos característicos,

(\lambda +1)(\lambda + 2) = 0
Raíces características Modos característicos
λ1 = -1 e-t
λ2 = -2 e-2t

Con los modos característicos se plantea la solución general y0(t) como la suma de los modos característicos con coeficientes aún por determinar.

y_0 (t) = c_1 e^{-t} + c_2 e^{-2t}

Para determinar los valores de las constantes c1 y c2 se aplican las condiciones iniciales para t0=0. Del enunciado del ejercicio se tiene que No hay señal en la salida al tiempo cero y(0)=0, además que la variación es negativa y'(0)=-5:

Las restricciones indicadas también son conocidas como condiciones auxiliares, solo cuando estas condiciones son dadas para t=0 se denominan condiciones iniciales o valores iniciales (Lathi p161).

En la primera condición con t=0, la salida:

y_0 (0) = 0 y(t)\Big|_{t=0} = c_1 e^{-0} + c_2 e^{-2(0)} c_1+c_2 = 0

en el caso para la condición de primera derivada:

y'_0 (0) = -5 y'_0(t)\Big|_{t=0} = \frac{d}{dt}\Big[ c_1 e^{-t} + c_2 e^{-2t}\Big]\Big|_{t=0} =\Big[ -c_1 e^{-t} -2c_2 e^{-2t}\Big] \Big|_{t=0} = -c_1 e^{-0} -2c_2 e^{-2(0)} -c_1 -2c_2 = -5

Con lo que con la evaluación de las condiciones iniciales se tiene que:

\begin{cases} c_1 + c_2 = 0\\ -c_1 - 2c_2 = -5 \end{cases}

se resuelve obteniendo:  c1 = -5 ; c2 = 5,
que al sustituir en la ecuación anterior, se encuentra la respuesta a entrada cero ZIR:

y_0(t) = -5e^{-t} +5e^{-2t}

La gráfica muestra el sentido de la corriente, usando la carga residual del capacitor dentro del circuito, a pesar de no tener señal de entrada a partir del tiempo 0 hasta 5:

LTIC Ejercicio 01 ZIR Sympy

Cálculos numéricos con Python

Para determinar los valores de las constantes, se puede usar algunas instrucciones sencillas con Numpy. Para las raíces del polinomio se usan solo los coeficientes de operadores D, ordenados de grado mayor a menor.

D^2 + 3D +2 = 0
import numpy as np
>>> np.roots([1,3,2])
array([-2., -1.])

Para los coeficientes se plantean las ecuaciones de la forma matricial Ax=B:

\begin{cases} c_1 + c_2 = 0\\ -c_1 - 2c_2 = -5 \end{cases}
>>> A = [[ 1, 1],
	 [-1,-2]]
>>> B =  [ 0,-5]
>>> np.linalg.solve(A,B)
array([-5.,  5.])
>>>

Respuesta entrada cero: [Desarrollo Analítico]  [Sympy-Python]  [Scipy-Python]  [Runge-Kutta d2y/dx2]  [Simulador]


Solución general de ecuación auxiliar ay»+by’+c =0

Referencia: Stewart James.  Cálculo de varias variables. 17.1 p1147 pdf544

Raíces de la ecuación característica solución general
raices reales y distintas \lambda_1 , \lambda_2 y=c_1 e^{\lambda_1 t}+c_2 e^{\lambda_2 t}
raíces iguales \lambda_1 = \lambda_2 = \lambda y=c_1 e^{\lambda t}+c_2 t e^{\lambda t}
raíces complejas \alpha \pm i\beta y= e^{\alpha t}(c_1 \cos{\beta t}+c_2 \sin{\beta t})

 

3.1 LTI CT – Modelo entrada-salida para circuitos RLC y ecuaciones diferenciales

Referencia: Lathi 1.8 p111, Schaum/Hsu 2.5.B p60, Oppenheim 2.56.d p160, p700

La descripción de un sistema en términos de las mediciones en los extremos se denomina Modelo de entrada-salida.

Una forma es describir la relación entre salida/entrada se expresa usando operadores de diferenciación D:

\frac{y(t)}{x(t)} = \frac{P(D)}{Q(D)}

La respuesta de un sistema lineal puede también ser expresada como la suma de dos componentes: respuesta a entrada cero ZIR y respuesta a estado cero ZSR.

Respuesta
total
= respuesta a
entrada cero
+ respuesta a
estado cero

Para el caso de un circuito eléctrico RLC, el modelo inicia con la descripción de la ecuación diferencial lineal que relaciona el voltaje x(t) de entrada y la corriente de salida y(t).


Ejemplo 1. Corriente en circuito RLC y Ecuaciones Diferenciales Lineales de 2do orden

Referencia: Lathi 1.8-1 p111. Oppenheim problema 2.61c p164 Ejemplo 9.24 p700

Para el ejemplo, se plantea determinar la corriente de lazo y(t) del circuito mostrado en la imagen. FIEC05058_RLC

Usando la ley de voltajes en lazo se tiene que:

vL(t) + vR(t) +vC(t) = x(t)

que con las leyes de corriente para cada elemento (inductor, resistor y capacitor) se traducen en la ecuación integro-diferencial:

\frac{dy(t)}{dt} +3 y(t) + 2\int_{-\infty}^t y(\tau)d\tau = x(t)

Para tener todo expresado con un solo operador, se derivan ambos lados de la ecuación:

\frac{d^{2}y(t)}{dt^{2}} + 3\frac{dy(t)}{dt} + 2y(t) = \frac{dx(t)}{dt}

que es la relación de «entrada-salida» del sistema con la entrada x(t) y la salida y(t) que permitirá analizar el sistema que representa al circuito.


Notación D para derivadas y 1/D para integrales

Por conveniencia, para usar una notación más compacta de la ecuación diferencial, el operador dy/dt se cambia por la notación D.

\frac{d}{dt}y(t) = Dy(t) \frac{d^2}{dt^2} y(t) = D^{2}y(t)

Que convierte la ecuación de entrada-salida a la expresión:

(D^2 + 3D +2)y(t) = Dx(t)

que es identica a la expresión de entrada y salida que describe al circuito.

El operador diferencial D también se interpreta con la notación para integrales,

\int_{-\infty}^t y(\tau)d\tau = \frac{1}{D}y(t)

por lo que la expresión integro-diferencial del circuito,

\frac{d}{dt}y(t) +3 y(t) + 2\int_{-\infty}^t y(\tau)d\tau = x(t)

también se puede escribir en notación D como:

D y(t) + 3 y(t)+ \frac{2}{D} y(t) = x(t)

Al multiplicar ambos lados por el operador D se convierte nuevamente en una expresión sin denominadores D, semejante a la expresión que usa solo diferenciales.

\Big( D^2 + 3D + 2 \Big) y(t) = D x(t)

Recuerde: la expresión con operadores D, NO ES una ecuación algebraica, pues la expresión de operadores D aplican solo a y(t).

En adelante, para el sistema o circuito descrito por ecuaciones diferenciales se usa el operador D=\frac{d}{dt}, por ejemplo:

a_2 \frac{d^2}{dt^2}y(t) + a_1 \frac{d}{dt}y(t) + a_0 y(t) = b_1\frac{d}{dt}x(t) + b_0x(t) a_2 D^ 2y(t) + a_1 Dy(t) + a_0y(t) = b_1Dx(t) + b_0 x(t) (a_2 D^ 2 + a_1 D + a_0)y(t) = (b_1D + b_0 )x(t)

las expresiones de los operadores D de cada lado se conocen también como P(D) y Q(D)

Q(D) y(t) = P(D) x(t) P(D) = b_1D + b_0 Q(D) = a_2 D^ 2 + a_1 D + a_0

La relación de salida/entrada del sistema se expresa como:

\frac{y(t)}{x(t)} = \frac{b_1D + b_0}{a_2 D^ 2 + a_1 D + a_0}


Ejercicio 2. Voltaje de un Circuito RC como una Ecuación Diferencial Lineal de 1er Orden

Referencia: Lathi Ejemplo 1.17 p113.

Usando la notación del operador D, encuentre la relación de salida/entrada para el circuito RC.  Para ésto defina i(t) como la corriente del circuito y como y(t) el voltaje del capacitor.

La corriente del lazo i(t) del circuito:

R i(t) +\frac{1}{C} \int_{-\infty}^{t} i(\tau) \delta \tau = x(t)

cambiando al operador D

R i(t) +\frac{1}{C} \frac{1}{D} i(t) = x(t) R D i(t) +\frac{1}{C} i(t) = D x(t) \Big(R D +\frac{1}{C}\Big) i(t) = D x(t)

Conociendo que la corriente i(t) en el capacitor depende de la variación de voltaje y(t) y la capacitancia C

i(t) = C \frac{\delta}{\delta t} y(t) = CD y(t)

se sustituye i(t) en la ecuación,

(R D +\frac{1}{C}) CD y(t) = D x(t)

simplificando un operador D

(R D +\frac{1}{C}) C y(t) = x(t) (RC D + 1 ) y(t) = x(t)

Para mostrar la relación de salida/entrada se reordena la expresión:

\frac{y(t)}{x(t)} = \frac{1}{RC D +1} \frac{y(t)}{x(t)} = \frac{\frac{1}{RC}}{D +\frac{1}{RC}}

Expresando con P(D) y Q(D)

Q(D) y(t) = P(D) x(t) P(D) = \frac{1}{RC} Q(D) = D +\frac{1}{RC}

Formas de encontrar una solución

Se pueden plantear varias formas de desarrollo para la solución de la ecuación diferencial lineal, usando los conceptos analíticos y numéricos:

1. Desarrollo analítico, que es el tradicional con papel y lápiz.

2. Desarrollo usando algoritmos en Python:

2.1  desarrollo analítico con fórmulas simbólicas en Sympy-Python
2.2 desarrollo numérico con funciones en Scipy-Python para LTI
2.3 desarrollo numérico con Runge-Kutta d2y/dx2  para EDO del curso  Métodos Numéricos.

3. Desarrollo usando un simulador con:

3.1 usando  diagrama de bloques
3.2 usando un diagrama de circuito

Respuesta entrada cero: [Desarrollo Analítico]  [Sympy-Python]  [Scipy-Python]  [Runge-Kutta d2y/dx2]  [Simulador]

2.7 Sistemas – Interconexión serie, paralelo, retroalimentado

Referencia: Oppenheim 1.5.2 p41, Hsu 1.5.I p19, Lathi 4.5 p386

Los sistemas pueden crearse a partir de subsistemas más sencillos. La interconexión entre los sistemas permite resolver por partes los problemas de mayor complejidad y luego integrar sus respuestas.

La interconexión de dos sistemas puede ser realizada de varias formas:

1. Interconexión en serie (cascada)
2. Interconexión en paralelo
3. Interconexión en serie-paralelo
4. Interconexión con retroalimentación

Para ilustrar las formas de interconexión de forma gráfica se usan los diagramas de bloques, al interconectar las salidas y entradas entre bloques.

Interconexión en serie

sistema interconexión en serie, diagrama de bloques

El diagrama de bloques representa la conexión de subsistemas en forma secuencial usando la salida a una entrada del siguiente..

Ejemplo: la salida de video de la computadora hacia la entrada de video del proyector en el aula de clases, usada para proyectar el contenido del curso.

Interconexión en Paralelo

sistemas en paralelo interconexión diagrama de bloques

El diagrama de bloques muestra que la señal de entrada se aplica de forma simultánea o en paralelo a dos los subsistemas, el símbolo ‘+’ expresa que el resultado es la suma de los resultados de los sistemas h1(t) y h2(t).

Interconexión serie-paralelo

Se añade el diagrama de bloques para la conexión en paralelo de un subsistema en serie h1(t) y h2(t), en paralelo con un subsistema h3(t)

sistemas en serie y paralelo, interconexión diagrama de bloques

Interconexión con retroalimentación

sistema retroalimentado ejemplo, interconexión diagrama de bloques

Los sistemas retroalimentados permiten «regular» la salida «observando» una parte de la misma

2.6 Sistemas contínuos y discretos, analógicos y digitales

Referencia: Oppenheim 1.5 p38, Hsu 1.5.B p17, Lathi 1.7-5 p107

Sistemas contínuos

En un sistema contínuo las señales contínuas de entrada son transformadas en señales contínuas de salida.

x(t) \rightarrow y(t)

fiec05058Sistema01

Por ejemplo el «audio» de una voz cantando en un micrófono es una entrada contínua, que al pasar por el sistema de amplificadores se obtiene una señal contínua eléctrica de salida hacia los parlantes.

Archivo de audio: muestra_Invernal01.wav
Archivos de Audio.wav – Abrir, extraer una porción en Curso de Fundamentos de Programación.

Sistema Discreto

Cuando las entradas de tiempo son muestras discretas se transforman en salidas de tiempo discreto, al sistema se denomina «sistema discreto«.

Simbólicamente se representa como:

x[n] \rightarrow y[n]

fiec05058Sistema02

 

Por ejemplo un filoscopio, flipbook o libro animado usa entradas y salidas de tiempo discretas.


Sistemas Analógicos y Digitales

Referencia: Lathi 1.7-6 p79, 1.3-2 p78

Un sistema con señales de entradas y salidas analógicas o contínuas se lo denomina» sistema analógico».

De forma semejante, un sistema cuyas entradas y salidas son digitales es un sistema digital, como una computadora, aunque también se conoce como un sistema discreto en el tiempo.

2.5 Sistemas Causales y No causales con Sympy-Python

Referencia: Lathi 1.7-4 p104, Oppenheim 1.6.3 p46

Un sistema es CAUSAL (no-anticipativo o físico) si la salida y(t) en un valor arbitrario de tiempo t=t0 depende solo de la entrada x(t) para t ≤ t0 , es decir depende solo de los valores presentes y/o pasados de la entrada; no depende de valores futuros.

No es posible obtener una salida antes que se aplique la entrada.


Ejemplos 1. desplazamiento en tiempo, retraso

Referencia: Hsu 1.5.D p17

y(t) = x(t - 1)

señal causal 01 animado

Para observar mejor el sistema del ejemplo, se inicia con un desplazamiento negativo. Si t es en segundos, la salida depende de los valores de x hace un segundo atrás (t-1)

Usando como entrada:

x(t) = e^{-t} \mu (t)
      1 - t                 
yf = e     *Heaviside(t - 1)
                       1 - t                    
yw = 2.11700001661267*e     *Heaviside(t - 1.75)

Considere los eventos de interés mundial que se transmiten con un retraso de segundos para corregir «fallos» o por seguridad, se puede aún editar lo que los espectadores en televisión pueden observar, en tiempo «casi real»

Por ejemplo:

» La cadena de televisión NBC transmitirá la ceremonia de apertura de los Juegos Olímpicos de Río de Janeiro 2016 con una hora de retraso …  eso permitirá a los productores «curar» la cobertura para proporcionar un contexto adecuado.»

12-Julio-2016

http://www.hoylosangeles.com/deportes/rio2016/hoyla-rio2016-nbc-transmitira-inauguracion-demora-story.html

«In radio and television, broadcast delay is an intentional delay when broadcasting live material. Such a delay may be short (often seven seconds) to prevent mistakes or unacceptable content from being broadcast.»

https://en.wikipedia.org/wiki/Broadcast_delay


En el caso contrario, los sistemas NO CAUSALES muestran una salida anticipada a la señal de entrada. ¿es posible? ¿cómo?

Ejemplo 2. desplazamiento en tiempo, adelanto

Referencia: Hsu 1.5.D p17

y(t) = x(t + 1)

señal no causal 02 animado

si t es en minutos o años, la salida depende de los valores que x(t) tendría un minuto o año después o (t+1).

Si t es en días, la situación se vuelve complicada de realizar, es como decir: para determinar el valor de la variable y(t) HOY, necesitamos conocer el valor de x(t+1) que es MAÑANA.

https://www.elcomercio.com/guaifai/volver-futuro-tecnologia-futurologia.html

Los sistemas no-casuales por tener variable independiente referenciada a tiempo futuro, no se pueden implementar en tiempo real. Sin embargo si los sistemas no causales se realizan con variables diferentes al tiempo, por ejemplo «espacio» se podrían implementar.

Usando como entrada, la misma que el ejemplo anterior

x(t) = e^{-t} \mu (t)
      -t - 1                 
yf = e      *Heaviside(t + 1)
                       -t - 1                    
yw = 2.11700001661267*e      *Heaviside(t + 0.25)

Aunque si considera que los datos de tiempo registrado para un evento, el análisis se puede realizar en un rango donde los no-causales aún se podrían analizar o procesar aunque no en tiempo real.

«No, la lluvia no hace que te duelan las rodillas» – AS.com. 25-feb-2017. https://as.com/deporteyvida/2017/02/25/portada/1488041024_696949.html


Ejemplo 3. Sistema con amplitud variable en tiempo (AM)

Referencia: Oppenheim Ejemplo 1.12 p47

Considere el sistema dado por:

y(t) = x(t) \cos(t+1)

señal causal 03 animado

En este sistema, la salida en cualquier tiempo t es igual a la entrada en el mismo tiempo t multiplicada por un número que varia en el tiempo. Usando q(t) = cos(t+1) que es una función variante en el tiempo,  el sistema puede escribirse como

y(t) = x(t) q(t)

Se observa que solo el valor actual de la entrada x(t) influye en el valor de salida  de y(t). Se concluye que el sistema es causal y también sin memoria.

Usando como entrada

x(t) = e^{-t} \mu (t)

resultados con algoritmo:

      -t                        
yf = e  *cos(t + 1)*Heaviside(t)
                       -t                               
yw = 2.71828182845905*e  *cos(t + 1)*Heaviside(t - 1.0)

Ejemplo 4. Adelanto e Inversión en tiempo

y(t) = x(-(t+2))

aeñal causal 04 animado

Suponga que x(t) = cos(t) μ(t) para hacer notar el inicio de la señal de entrada


Ejemplo 5. desplazamiento e inversión en tiempo

y(t) = x(t)+x(5-t)

Suponga que x(t) = cos(t) μ(t) para hacer notar el inicio de la señal de entrada

Usando como entrada

x(t) = \cos(t) \mu (t)
yf = cos(t)*Heaviside(t) + cos(t - 5)*Heaviside(5 - t)
yw = cos(t - 4.25)*Heaviside(4.25 - t) + cos(t - 0.75)*Heaviside(t - 0.75)

Descripción a ser aplicada a TeneT:

 


Ejercicios:

a) y(t) = x(t-1)
b) y(t) = x(-t)
c) y(t) = x(t)+x(5-t)
d) otra


Instrucciones en Python

Ejemplo 1. desplazamiento en tiempo, retraso

El sistema se aplica sustituyendo la variable t por t-1 en la entrada x, con la instrucción y = sym.Subs(x,t,t-1,evaluate=False)

# entradas desplazadas en t, revisar salida
# Sistemas Causales y NO causales en tiempo
# Hsu 1.5.D p17
import numpy as np
import sympy as sym
import matplotlib.pyplot as plt
equivalentes = [{'DiracDelta': lambda x: 1*(x==0)},
                'numpy']

# INGRESO
t = sym.Symbol('t', real=True)
x = sym.Symbol('x', real=True)

t0 = 0.75 
# señales de entrada
f = sym.exp(-t)*sym.Heaviside(t)
w = f.subs(t,t-t0)

# sistema
y = sym.Subs(x,t,t-t0,evaluate=False)

# intervalo de t[a,b] para graficar
a = 0
b = 2*np.pi
muestras = 101

# PROCEDIMIENTO
# Sistema sobre señal de entrada
yf = y.subs(x,f).doit()
yw = y.subs(x,w).doit()

# Para gráfica
ti = np.linspace(a,b,muestras)
# señales de entrada
ft = sym.lambdify(t,f)
wt = sym.lambdify(t,w)

# señales de salida
yft = sym.lambdify(t,yf,modules=equivalentes)
ywt = sym.lambdify(t,yw,modules=equivalentes)

# evalua entradas ti
fi = ft(ti)
wi = wt(ti)
# evalua salidas ti
yfi = yft(ti)
ywi = ywt(ti)

# SALIDA
print('yf:')
sym.pprint(yf)
print('yw:')
sym.pprint(yw)

# grafica
plt.subplot(211) # entradas
plt.plot(ti,fi,'--', label='f(t)')
plt.plot(ti,wi,'--',color='green',
         label='w(t)=f(t-t0)')
plt.axhline(0)
plt.axvline(0,color='red')
plt.xlabel('ti')
plt.ylabel('entradas')
plt.title('Sistema y='+str(y)+ '  ¿Causal?')
plt.legend()
plt.grid()

plt.subplot(212) # salidas
plt.plot(ti,yfi,'--',label='yf=y[f(t)]')
plt.plot(ti,ywi,'--',color='green',
         label='yw=y[w(t)]')
plt.axhline(0)
plt.axvline(0,color='red')
plt.xlabel('ti')
plt.ylabel('salidas')
plt.legend()
plt.grid()

plt.show()

Ejemplo 2. desplazamiento en tiempo, adelanto

lo mismo que el anterior pero con desplazamiento t+1 e intervalo ampliado en la parte izquierda del plano.

# Sistema sobre señal de entrada
y = x.subs(t,t+1)
 # intervalo de t[a,b] para graficar
a = -2
b = 2*np.pi
muestras = 101

Ejemplo 3. Sistema con amplitud variable en tiempo (AM)

y(t) = x(t) \cos(t+1)
# entradas desplazadas en t, revisar salida
# Sistemas Causales y NO causales en tiempo
# Oppenheim 1.12 p47 pdf78
import numpy as np
import sympy as sym
import matplotlib.pyplot as plt
equivalentes = [{'DiracDelta': lambda x: 1*(x==0)},
                'numpy']

# INGRESO
t = sym.Symbol('t', real=True)
x = sym.Symbol('x', real=True)

t0 = 1.0 
# señales de entrada
f = sym.exp(-t)*sym.Heaviside(t)
w = f.subs(t,t-t0)

# sistema
y = x*sym.cos(t+1)

# intervalo de t[a,b] para graficar
a = 0
b = 2*np.pi
muestras = 101

# PROCEDIMIENTO
# Sistema sobre señal de entrada
yf = y.subs(x,f).doit()
yw = y.subs(x,w).doit()

# Para gráfica
ti = np.linspace(a,b,muestras)
# señales de entrada
ft = sym.lambdify(t,f)
wt = sym.lambdify(t,w)

# señales de salida
yft = sym.lambdify(t,yf,modules=equivalentes)
ywt = sym.lambdify(t,yw,modules=equivalentes)

# evalua entradas ti
fi = ft(ti)
wi = wt(ti)
# evalua salidas ti
yfi = yft(ti)
ywi = ywt(ti)

# SALIDA
print('yf:')
sym.pprint(yf)
print('yw:')
sym.pprint(yw)

# grafica
plt.subplot(211) # entradas
plt.plot(ti,fi,'--', label='f(t)')
plt.plot(ti,wi,'--',color='green',
         label='w(t)=f(t-t0)')
plt.axhline(0)
plt.axvline(0,color='red')
plt.xlabel('ti')
plt.ylabel('entradas')
plt.title('Sistema y='+str(y)+ '  ¿Causal?')
plt.legend()
plt.grid()

plt.subplot(212) # salidas
plt.plot(ti,yfi,'--',label='yf=y[f(t)]')
plt.plot(ti,ywi,'--',color='green',
         label='yw=y[w(t)]')
plt.axhline(0)
plt.axvline(0,color='red')
plt.xlabel('ti')
plt.ylabel('salidas')
plt.legend()
plt.grid()

plt.show()

Ejemplo 4. desplazamiento e inversión en tiempo

# entradas desplazadas en t, revisar salida
# Sistemas Causales y NO causales en tiempo
# Hsu 1.5.C p17
import numpy as np
import sympy as sym
import matplotlib.pyplot as plt
equivalentes = [{'DiracDelta': lambda x: 1*(x==0)},
                'numpy']

# INGRESO
t = sym.Symbol('t', real=True)
x = sym.Symbol('x', real=True)

t0 = 0.75 
# señales de entrada
f = sym.cos(t)*sym.Heaviside(t)
w = f.subs(t,t-t0)

# sistema
y = x + sym.Subs(x,t,(5-t),evaluate=False)

# intervalo de t[a,b] para graficar
a = -2*np.pi
b = 2*np.pi
muestras = 101

# PROCEDIMIENTO
# Sistema sobre señal de entrada
yf = y.subs(x,f).doit()
yw = y.subs(x,w).doit()

# Para gráfica
ti = np.linspace(a,b,muestras)
# señales de entrada
ft = sym.lambdify(t,f)
wt = sym.lambdify(t,w)

# señales de salida
yft = sym.lambdify(t,yf,modules=equivalentes)
ywt = sym.lambdify(t,yw,modules=equivalentes)

# evalua entradas ti
fi = ft(ti)
wi = wt(ti)
# evalua salidas ti
yfi = yft(ti)
ywi = ywt(ti)

# SALIDA
print('yf:')
sym.pprint(yf)
print('yw:')
sym.pprint(yw)

# grafica
plt.subplot(211) # entradas
plt.plot(ti,fi,'--', label='f(t)')
plt.plot(ti,wi,'--',color='green',
         label='w(t)=f(t-t0)')
plt.axhline(0)
plt.axvline(0,color='red')
plt.xlabel('ti')
plt.ylabel('entradas')
plt.title('Sistema y='+str(y)+ '  ¿Causal?')
plt.legend()
plt.grid()

plt.subplot(212) # salidas
plt.plot(ti,yfi,'--',label='yf=y[f(t)]')
plt.plot(ti,ywi,'--',color='green',
         label='yw=y[w(t)]')
plt.axhline(0)
plt.axvline(0,color='red')
plt.xlabel('ti')
plt.ylabel('salidas')
plt.legend()
plt.grid()

plt.show()

2.4 Sistemas con memoria o sin memoria

Referencia: Oppenheim 1.6.1 p44 pdf75 , Lathi 1.7-3 p103, Hsu 1.5.C p17

Si la salida de un sistema depende solo del valor aplicado en la entrada para un tiempo cualquiera, se dice que el sistema es sin memoria.

Resistor01El ejemplo más común es un sistema con un resistor:

y(t) = Rx(t)

Por otra parte, si el sistema depende de los valores anteriores de la entrada, se lo considera sistema con memoriacapacitor01

Tal es el caso de un capacitor, cuyo valor de salida depende de lo acumulado desde el tiempo -∞ hasta t.

y(t) =\frac{1}{C} \int_{-\infty}^{t} x(\tau) d\tau

Los sistemas sin memoria también se conocen como instantaneos, que son un caso particular de los sistemas dinámicos (con memoria).

Un sistema  cuya respuesta en t está determinada por los anteriores T segundos, es decir el intervalo (tT), se lo conoce como «sistema con memoria finita»

 

2.3 Sistemas Invariantes y Variantes en el tiempo con Sympy-Python

Referencia: Oppenheim 1.6.5 p50, Lathi 1.7-2 p102, Hsu 1.5.F p18

Si el comportamiento de un sistema y sus parámetros no cambian en el tiempo, se los denomina sistemas invariantes en el tiempo.

Por ejemplo, para un circuito RC, los valores de la resistencia y capacitor fijos no varian si se realiza un experimento o medición hoy o mañana.

Expresando lo mismo como:
Un sistema es invariante en el tiempo si, ante un desplazamiento de tiempo en la señal de entrada, se ocasiona el mismo desplazamiento en el tiempo en la señal de salida. El resultado se repite si el desplazamiento del tiempo se aplica a la salida del sistema en lugar de la entrada.

x(t) \rightarrow y(t) x(t-t_0) \rightarrow y(t-t_0)

Ejemplo 1. Sistema con comportamiento senoidal

Referencia: Oppenheim 1.14 p51

Para muestra de lo indicado, considere un sistema definido como:

y(t) = \sin[x(t)]

Para revisar si es invariante en el tiempo, se debe determinar si sus propiedades de mantienen para cualquier entrada ante cualquier desplazamiento t0.

y_1 (t) = \sin[x(t - t_0)] y_2(t) = y(t - t_0)

Suponga x1(t)= e(-t)u(t) la señal bajo prueba, siendo x2(t)= e(-(t-t0))u(t-t0) la entrada x1(t) desplazada en t0. Haciendo t0=1, se puede observar en la gráfica si al aplicar el retraso antes o después del sistema tienen resultados iguales.

y_1 (t) = y_2(t)

En éste caso se observa que la señal de salida se mantiene invariante en su forma y desplazada en sincronía con la señal de entrada. Por lo que el sistema es INVARIANTE en el tiempo.

La gráfica y el siguiente resultado se realizaron con el algoritmo desarrollado a partir del tema anterior sobre sistemas lineales. El algoritmo se adjunta al final.

        / -t             \
yf = sin\e  *Heaviside(t)/
        /                  -t                   \
yw = sin\2.71828182845905*e  *Heaviside(t - 1.0)/
              /                  -t                   \
yf(t-t0) = sin\2.71828182845905*e  *Heaviside(t - 1.0)/

Por otro lado, si la respuesta de la señal se modifica en el tiempo, el sistema será VARIANTE en el tiempo.


Ejemplo 2. Sistema comprime en tiempo

Referencia: Oppenheim 1.16 p52.Hsu ejercicio 1.39 p48

Considere el sistema que tiene escalamiento en el tiempo.:

y(t) = x(2t)

y(t) es una versión comprimida en tiempo de x(t) en un factor de 2.
Los desplazamientos en el tiempo de la señal de entrada  al pasar por el sistema también se «comprimen» por un factor de 2.

Haciendo f(t) = μ(t+2)-μ(t-2) una señal rectangular centrada en el origen con color azul en la gráfica.
Si la entrada w(t) = f(t-2)= μ(t)-μ(t-4) es una real rectangular desplazada en 2 (en color verde), su resultado en la salida se encuentra centrado en 1.

Al desplazar el resultado de la señal de entrada en su forma original en azul, por t0 se obtiene la señal de salida en color rojo. Claramente los resultados de aplicar un retraso antes o después del sistema son diferentes.

Por lo que, por ésta razón el sistema NO es invariante en el tiempo.

yf = -Heaviside(2*t - 2) + Heaviside(2*t + 2)
yw = Heaviside(2*t) - Heaviside(2*t - 4.0)
yft0 = -Heaviside(2*t - 6.0) + Heaviside(2*t - 2.0)

Siguiendo las indicaciones en el problema presentado, donde T se conoce como el «operador lineal«. El sistema tiene una relación de entrada-salida dada por:

y(t) = T{x(t)} = x(2t)

y t0 es un desplazamiento en el tiempo.

Sea y2(t) la respuesta a x2(t) = x(t-t0) entonces:

y2(t) = T{x2(t)} = x2(2t) = x(2t-t0)

Si se desplaza el resultado de la señal de salida sin desplazar se tiene:

y(t-t0) = x(2(t-t0)) = x(2t-2t0))

y(t-t0) ≠ y2(t)

por lo que el sistema no es invariante en el tiempo.
El sistema x(2t) se conoce como compresor, pues crea una secuencia de salida cada 2 valores de la secuencia de entrada.


Ejemplo 3. Sistema multiplica por tiempo

Referencia: Oppenheim 1.13 p49, Oppenheim 1.17 p54, Hsu ejercicio 1.38 p47

Considere el siguiente sistema, cuya salida depende del intervalo de tiempo evaluado. Los desplazamientos afectan a la señal de salida.

y(t) = t x(t)

Desarrollar semejante al ejercicio anterior, en forma analítica y usando Python, para la entrada:

x(t) = \sin (t)

yf = t*sin(t)
yw = t*sin(t - 2.0)
yf(t-t0) = (t - 2.0)*sin(t - 2.0)

Para el sistema dado, al depender su magnitud de la variable t, la salida tiende a crecer con el tiempo, por lo que se puede intuir que el sistema es inestable.

Observando los resultados y la gráfica se tiene que el sistema NO es invariante en el tiempo.

Ejemplo 4. Sistema deriva la entrada

Referencia: Lathi 1.11 p103

Determine la invariabilidad de tiempo del siguiente sistema

y(t) = \frac{d}{dt} x(t) ,

Suponga x1(t)= e(-t)u(t), semejante a lo usado en el ejercicio 1.

El desarrollo con el algoritmo muestra que el sistema resulta invariante en el tiempo.

      -t                  -t             
yf = e  *DiracDelta(t) - e  *Heaviside(t)
                       -t                                         -t               
yw  = 2.71828182845905*e  *DiracDelta(t - 1.0) - 2.71828182845905*e  *Heaviside(t - 1.0)
                             -t                                         -t               
yf(t-t0) = 2.71828182845905*e  *DiracDelta(t - 1.0) - 2.71828182845905*e  *Heaviside(t - 1.0)

En este caso, dado que la señal de entrada tiene una función escalón, sympy no presenta inconvenientes en realizar la derivada. Sin embargo, la operacion de conversión con Lambdify será necesario añadir la equivalencia de DiracDelta en numpy. Por lo que la instrucción de Lambdify se le añade el parámetro para considerar los modulos equivalentes.

equivalentes = [{'DiracDelta': lambda x: 1*(x==0)},
                'numpy']

Instrucciones en Python

Desarrollado a partir del algoritmo usado para sistemas lineales y no lineales

Ejemplo 1. Sistema con comportamiento senoidal

# entradas desplazadas en t, revisar salida
# Revisa Invarianza en tiempo
# Oppenheim 1.14 p51 pdf82
import numpy as np
import sympy as sym
import matplotlib.pyplot as plt

# INGRESO
t = sym.Symbol('t', real=True)
x = sym.Symbol('x', real=True)

t0 = 1.0 
# señales de entrada
f = sym.exp(-t)*sym.Heaviside(t)
w = f.subs(t,t-t0) # desplaza f

# sistema
y = sym.sin(x)

# intervalo de t[a,b] para graficar
a = 0
b = 2*np.pi
muestras = 101

# PROCEDIMIENTO
# Sistema sobre señal de entrada
yf = y.subs(x,f).doit()
yw = y.subs(x,w).doit()
yf0 = yf.subs(t,t-t0).doit()

# Para gráfica
ti = np.linspace(a,b,muestras)
# señales de entrada
ft = sym.lambdify(t,f)
wt = sym.lambdify(t,w)

# señales de salida
yft = sym.lambdify(t,yf)
ywt = sym.lambdify(t,yw)
yf0t = sym.lambdify(t,yf0)

# evalua entradas ti
fi = ft(ti)
wi = wt(ti)
# evalua salidas ti
yfi = yft(ti)
ywi = ywt(ti)
yfi0 = yf0t(ti)

# SALIDA
print('yf:')
sym.pprint(yf)
print('yw:')
sym.pprint(yw)
print('yf(t-t0):')
sym.pprint(yf0)

# grafica
plt.subplot(211) # entradas
plt.plot(ti,fi,'--', label='f(t)')
plt.plot(ti,wi,'--',color='green',
         label='w(t)=f(t-t0)')
plt.axhline(0)
plt.xlabel('ti')
plt.ylabel('entradas')
plt.title('Sistemas Invariante: y='+str(y))
plt.legend()
plt.grid()

plt.subplot(212) # salidas
plt.plot(ti,yfi,'--',label='yf=y[f(t)]')
plt.plot(ti,ywi,'--',color='green',
         label='yw=y[w(t)]')
plt.plot(ti,yfi0,'.',color='red', 
         label='yft0=yf[t-t0]')
plt.axhline(0)
plt.xlabel('ti')
plt.ylabel('salidas')
plt.legend()
plt.grid()

plt.show()

Ejemplo 2. Sistema comprime en tiempo

Para aplicar cambios en la variable tiempo, en el algoritmo se sustituye en la expresión de la señal de entrada la variable t por 2t.

# entradas desplazadas en t, revisar salida
# Revisa Invarianza en tiempo
# Oppenheim 1.16 p52.Hsu ejercicio 1.39 p48
import numpy as np
import sympy as sym
import matplotlib.pyplot as plt

# INGRESO
t = sym.Symbol('t', real=True)
x = sym.Symbol('x', real=True)

t0 = 2.0
# señales de entrada
f = sym.Heaviside(t+2)-sym.Heaviside(t-2)
w = f.subs(t,t-t0) # desplaza f

# sistema
y = sym.Subs(x,t,2*t,evaluate=False)

# intervalo de t[a,b] para graficar
a = -5
b = 5
muestras = 101

# PROCEDIMIENTO
# Sistema sobre señal de entrada
yf = y.subs(x,f).doit()
yw = y.subs(x,w).doit()
yf0 = yf.subs(t,t-t0).doit()

# Para gráfica
ti = np.linspace(a,b,muestras)
# señales de entrada
ft = sym.lambdify(t,f)
wt = sym.lambdify(t,w)

# señales de salida
yft = sym.lambdify(t,yf)
ywt = sym.lambdify(t,yw)
yf0t = sym.lambdify(t,yf0)

# evalua entradas ti
fi = ft(ti)
wi = wt(ti)
# evalua salidas ti
yfi = yft(ti)
ywi = ywt(ti)
yfi0 = yf0t(ti)

# SALIDA
print('yf:')
sym.pprint(yf)
print('yw:')
sym.pprint(yw)
print('yf(t-t0):')
sym.pprint(yf0)

# grafica
plt.subplot(211) # entradas
plt.plot(ti,fi,'--', label='f(t)')
plt.plot(ti,wi,'--',color='green',
         label='w(t)=f(t-t0)')
plt.axhline(0)
plt.xlabel('ti')
plt.ylabel('entradas')
plt.title('Sistemas Invariante: y='+str(y))
plt.legend()
plt.grid()

plt.subplot(212) # salidas
plt.plot(ti,yfi,'--',label='yf=y[f(t)]')
plt.plot(ti,ywi,'--',color='green',
         label='yw=y[w(t)]')
plt.plot(ti,yfi0,'--',color='red', 
         label='yft0=yf[t-t0]')
plt.axhline(0)
plt.xlabel('ti')
plt.ylabel('salidas')
plt.legend()
plt.grid()

plt.show()

Ejemplo 3. Sistema multiplica por tiempo

# entradas desplazadas en t, revisar salida
# Revisa Invarianza en tiempo
# Oppenheim 1.13 p49.Hsu ejercicio 1.38 p47
import numpy as np
import sympy as sym
import matplotlib.pyplot as plt

# INGRESO
t = sym.Symbol('t', real=True)
x = sym.Symbol('x', real=True)

t0 = 2.0
# señales de entrada
f = sym.sin(t)
w = f.subs(t,t-t0) # desplaza f

# sistema
y = t*x

# intervalo de t[a,b] para graficar
a = 0
b = 3*np.pi
muestras = 101

# PROCEDIMIENTO
# Sistema sobre señal de entrada
yf = y.subs(x,f).doit()
yw = y.subs(x,w).doit()
yf0 = yf.subs(t,t-t0).doit()

# Para gráfica
ti = np.linspace(a,b,muestras)
# señales de entrada
ft = sym.lambdify(t,f)
wt = sym.lambdify(t,w)

# señales de salida
yft = sym.lambdify(t,yf)
ywt = sym.lambdify(t,yw)
yf0t = sym.lambdify(t,yf0)

# evalua entradas ti
fi = ft(ti)
wi = wt(ti)
# evalua salidas ti
yfi = yft(ti)
ywi = ywt(ti)
yfi0 = yf0t(ti)

# SALIDA
print('yf:')
sym.pprint(yf)
print('yw:')
sym.pprint(yw)
print('yf(t-t0):')
sym.pprint(yf0)

# grafica
plt.subplot(211) # entradas
plt.plot(ti,fi,'--', label='f(t)')
plt.plot(ti,wi,'--',color='green',
         label='w(t)=f(t-t0)')
plt.axhline(0)
plt.xlabel('ti')
plt.ylabel('entradas')
plt.title('Sistemas Invariante: y='+str(y))
plt.legend()
plt.grid()

plt.subplot(212) # salidas
plt.plot(ti,yfi,'--',label='yf=y[f(t)]')
plt.plot(ti,ywi,'--',color='green',
         label='yw=y[w(t)]')
plt.plot(ti,yfi0,'--',color='red', 
         label='yft0=yf[t-t0]')
plt.axhline(0)
plt.xlabel('ti')
plt.ylabel('salidas')
plt.legend()
plt.grid()

plt.show()

Ejemplo 4. Sistema deriva la entrada

# entradas desplazadas en t, revisar salida
# Revisa Invarianza en tiempo
# Lathi 1.11 p103
import numpy as np
import sympy as sym
import matplotlib.pyplot as plt
equivalentes = [{'DiracDelta': lambda x: 1*(x==0)},
                'numpy']

# INGRESO
t = sym.Symbol('t', real=True)
x = sym.Symbol('x', real=True)

t0 = 1.0 
# señales de entrada
f = sym.exp(-t)*sym.Heaviside(t)
w = f.subs(t,t-t0) # desplaza f

# sistema
y = sym.diff(x,t,evaluate=False)

# intervalo de t[a,b] para graficar
a = 0
b = 2*np.pi
muestras = 101

# PROCEDIMIENTO
# Sistema sobre señal de entrada
yf = y.subs(x,f).doit()
yw = y.subs(x,w).doit()
yf0 = yf.subs(t,t-t0).doit()

# Para gráfica
ti = np.linspace(a,b,muestras)
# señales de entrada
ft = sym.lambdify(t,f)
wt = sym.lambdify(t,w)

# señales de salida
yft = sym.lambdify(t,yf,modules=equivalentes)
ywt = sym.lambdify(t,yw,modules=equivalentes)
yf0t = sym.lambdify(t,yf0,modules=equivalentes)

# evalua entradas ti
fi = ft(ti)
wi = wt(ti)
# evalua salidas ti
yfi = yft(ti)
ywi = ywt(ti)
yfi0 = yf0t(ti)

# SALIDA
print('yf:')
sym.pprint(yf)
print('yw:')
sym.pprint(yw)
print('yf(t-t0):')
sym.pprint(yf0)

# grafica
plt.subplot(211) # entradas
plt.plot(ti,fi,'--', label='f(t)')
plt.plot(ti,wi,'--',color='green',
         label='w(t)=f(t-t0)')
plt.axhline(0)
plt.xlabel('ti')
plt.ylabel('entradas')
plt.title('Sistemas Invariante: y='+str(y))
plt.legend()
plt.grid()

plt.subplot(212) # salidas
plt.plot(ti,yfi,'--',label='yf=y[f(t)]')
plt.plot(ti,ywi,'--',color='green',
         label='yw=y[w(t)]')
plt.plot(ti,yfi0,'.',color='red', 
         label='yft0=yf[t-t0]')
plt.axhline(0)
plt.xlabel('ti')
plt.ylabel('salidas')
plt.legend()
plt.grid()

plt.show()