2.2 Sistemas Lineales y No Lineales con Sympy-Python

Referencia: Oppenheim 1.6.6 p53, Lathi 1.7-1 p97, Hsu 1.5.E p18

En un sistema lineal cumple con el principio de superposición que se compone de la propiedad de aditividad y de la escalabilidad.

sistema lineal ejemplo audio suma
La superposición puede ser un resultado deseado, por ejemplo en un sistema de audio que no añada «distorsiones» a lo que ingresa por un micrófono y se reproduce en los parlantes.

sistema lineal y propiedad de aditividad Un sistema lineal cumple la propiedad de aditividad, si la respuesta a una suma de señales en la entrada es igual a la suma de las salidas de las señales anteriores.

x_1(t) + x_2(t) \rightarrow y_1(t) + y_2(t)

sistema lineal y propiedad de escalabilidad La propiedad de escalabilidad u homogeneidad muestra una relación de «amplificación» o «atenuación» representada por una constante.
Para los ejemplos, las constantes a usar son α y β que podrían ser reales o complejas.

\alpha x_1(t) \rightarrow \alpha y_1(t)

La propiedad de escalabilidad implica que una amplificación o atenuación  puede ser aplicada antes o después del sistema, el resultado debería ser semejante.

La propiedad de superposición se plantea como una combinación de las propiedades anteriores:

en el tiempo contínuo:

\alpha x_1(t) + \beta x_2 (t) \rightarrow \alpha y_1(t) + \beta y_2(t)

sistema lineal y propiedad de superposición

en tiempo discreto:

\alpha x_1[n] + \beta x_2 [n] \rightarrow \alpha y_1[n] + \beta y_2[n]

Nota: De ser necesario, revisar los conceptos para Sympy en el curso de Métodos Numéricos: Fórmulas y funciones simbólicas con Python – Sympy


Ejemplo 1. Un micrófono inductivo, sistema que deriva x(t)

Referencia: Lathi 1.11 b p103.

Para el sistema dado, determine si cumple la propiedad de aditividad y escalabilidad para revisar si es un sistema lineal:

y(t) = \frac{\delta}{\delta t}x(t)

La salida del sistema es solo la derivada de la señal de entrada. Al sumar dos entradas diferentes antes del sistema, representada como w(t), se  produce el mismo resultado que la suma de las salidas del sistema para las señales de entrada individuales.

Suponiendo como entradas las señales f(t) = sin(t), graficada en azul, g(t) = cos(t) en color naranja, al aplicarse cada una al sistema, se obtienen las gráficas de salida usando los mismos colores para facilidad de comparación.

Para el análisis, se añade una entrada adicional w(t) = α f(t) + β g(t) que en la gráfica es de color verde para entrada y salida.
Se obtiene la expresión para el sistema α y[f(t)] + β y[g(t)]  (color rojo) y se observa si son iguales con y[w(t)], de ser iguales, el sistema es lineal.

El desarrollo analítico se encuentra en el libro guía en la referencia, por lo que se adjunta la parte algorítmica para la gráfica con Python, y se obtienen también las expresiones para los resultados correspondientes con Sympy:

yf = cos(t)
yg = -sin(t)
yw  = -3*sin(t) + 2*cos(t)
yfg = -3*sin(t) + 2*cos(t)

Un ejemplo de aplicación para un sistema que deriva una entrada es un micrófono dinámico o de bobina, usado como preferencia por sus propiedades en locución de radio.

Referencia: Micrófonos dinámicos de bobina móvil: la guía detallada. Micrófono Rocks. https://microfono.rocks/microfonos-dinamicos-de-bobina-movil-la-guia-detallada/

Diferencias entre un Micrófono Dinámico y de Condensador – StudioMusic.cl


Ejemplo 2. Sistema con salida (x(t))2

Referencia: Oppenheim 1.18 p54

Para un sistema cuya entrada x(t) y salida y(t) se encuentra relacionada por:

y(t) = x^2(t)

Desarrolle las expresiones para determinar si el sistema es lineal, semejante al ejemplo del texto guía.

Se adjunta el resultado realizado con el algoritmo en Python, modificando las expresiones para y = x**2 mostrando que el sistema es NO lineal.

        2   
yf = sin (t)
        2   
yg = cos (t)
                          2
yw = (2*sin(t) + 3*cos(t)) 

           2           2   
yfg = 2*sin (t) + 3*cos (t)


Ejemplo 3. Sistema t(x(t))

Referencia: Oppenheim 1.17 p54

Considere un sistema cuya entrada x(t) y salida y(t) se encuentra relacionada por:

y(t) = t x(t)

Para determinar si S es o no lineal, se consideran dos entradas arbitrarias iguales a las del ejercicio anterior, haciendo w(t) = α f(t) y β g(t)

Desarrolle las expresiones para determinar si el sistema es lineal

Se adjunta el resultado realizado con el algoritmo en Python, modificando las expresiones para y = t*x mostrando que el sistema es lineal.

yf = t*sin(t)
yg = t*cos(t)
yw = 2*t*sin(t) + 3*t*cos(t)
yfg =2*t*sin(t) + 3*t*cos(t)


Instrucciones con Sympy-Python

Sympy facilita generar las expresiones de las señales de entrada al pasar por el sistema. De ser necesario, revise los conceptos para Sympy en el curso de Métodos Numéricos: Fórmulas y funciones simbólicas con Python – Sympy

En Sympy se puede derivar una expresión usando sym.diff(). Sin embargo para un sistema que aplica derivadas, las expresiones de salida se generan sin aplicar la derivada pues primero se sustituye la variable x con la expresión de la entrada y luego se aplica sym.Derivative(x,t). Para que se ejecute la derivada se tiene la instrucción doit().

En caso que la señal de entrada sea una expresión mas compleja que la de los ejemplos, se recomienda usar la instrucción a la expresión .expand().
expand() genera términos más simples de la expresión que facilitan el análisis por algoritmos con Python.

# Sistema Lineal prueba
# Revisa propiedad de aditividad y escalabilidad
# Lathi ej1.11 p103
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)

# señales de entrada
f = sym.sin(t)
g = sym.cos(t)
alpha = 1
beta  = 1

# sistema, aplica a entrada
#   expresión sin evaluar
y = sym.diff(x,t, evaluate=False)

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

# PROCEDIMIENTO
# señales suma de entradas
w = alpha*f + beta*g

# Sistema sobre señal de entrada
#  se evalua la expresión con doit()
yf = y.subs(x,f).doit()
yg = y.subs(x,g).doit()
yw = y.subs(x,w).doit()
yfg = alpha*yf+ beta*yg

# Para gráfica
ti = np.linspace(a,b,muestras)

# señales de entrada
ft = sym.lambdify(t,f)
gt = sym.lambdify(t,g)
wt = sym.lambdify(t,w)
# señales de salida
yft = sym.lambdify(t,yf)
ygt = sym.lambdify(t,yg)
ywt = sym.lambdify(t,yw)
yfgt = sym.lambdify(t,yfg)

# evalua entradas ti
fi = ft(ti)
gi = gt(ti)
wi = wt(ti)
# evalua salidas ti
yfi = yft(ti)
ygi = ygt(ti)
ywi = ywt(ti)
yfgi = yfgt(ti)

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

# grafica
plt.subplot(211) # entradas
plt.plot(ti,fi,'--', label='f(t)')
plt.plot(ti,gi,'--', label='g(t)')
plt.plot(ti,wi, label='w(t)')
plt.axhline(0)
plt.xlabel('ti')
plt.ylabel('entradas')
untitulo = 'Sistemas Linealidad ' + str(y)
plt.title(untitulo)
plt.legend()
plt.grid()

plt.subplot(212) # salidas
plt.plot(ti,yfi,'--', label='y(f(t))')
plt.plot(ti,ygi,'--', label='y(g(t))')
plt.plot(ti,ywi, label='y(w(t))')
etqLatex = r'$ \alpha y[f(t)]+\beta y[g(t)] $'
plt.plot(ti,yfgi,'.',
         label=etqLatex)

plt.axhline(0)
plt.xlabel('ti')
plt.ylabel('salidas')
plt.legend()
plt.grid()

plt.show()

Referencia: Derivadas con Sympy. Expresión sin evaluar y evaluación de expresión con Derivative. https://docs.sympy.org
Conceptos para Sympy en el curso de Métodos Numéricos: Fórmulas y funciones simbólicas con Python – Sympy