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

https://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()