Referencia: Lathi 6.1 pdf406, Chapra 5ed Ejemplo 19.2 p548/pdf572
La serie de Fourier aproxima una señal o función contínua mediante una serie infinita de sinusoides.
f(t) = a_0 + \sum_{k=1}^{\infty}[a_k \cos( k \omega_0 t) + b_k \sin(k \omega_0t)]donde los coeficientes de la ecuación se calculan como:
a_k = \frac{2}{T} \int_0^T f(t) \cos(k \omega_0 t) \delta t b_k = \frac{2}{T} \int_0^T f(t) \sin(k \omega_0 t) \delta tEjemplo
Utilice la serie de Fourier continua para aproximar la función de onda cuadrada o rectangular. Para el cálculo del ejemplo se usará hasta 4 términos de la serie.
f(t) = \begin{cases} -1 && -T/2<t<-T/4 \\ 1 && -T/4<t<T/4 \\ -1 && T/4<t<T/2 \end{cases}Coeficientes ak y bk
Para determinar las expresiones de los coeficientes, en Python se usa la libreria Sympy que nos facilita el desarrollo las fórmulas simbólicas ak y bk.
Si requiere revisar el concepto se adjunta el enlace:
El desarrollo a papel y lápiz se deja como tarea.
Usando Python se obtiene los siguientes resultados:
expresión ak: /1.27323*sin(1.5707*k) - 0.6366*sin(3.1415*k) for And(k > -oo, k < oo, k != 0) |-------------------------------------------- < k | \ 0 otherwise expresión bk: 0
Nota: se han truncado los decimales a 4 para facilitar la lectura en la pantalla.
usando formato latex para la expresión, generado por Sympy se obtiene:
a_k = \begin{cases} \frac{1.2732\sin (1.5707 k) - 0.6366 \sin(3.1415 k )}{k} & \text{for}\: k > -\infty \wedge k < \infty \wedge k \neq 0 \\0 & \text{otherwise} \end{cases} b_k = 0Instrucciones en Python:
# Serie de Fourier, con n coeficientes # Ref.Chapra 5ed Ejemplo 19.2 p548/pdf572 import numpy as np import sympy as sym import matplotlib.pyplot as plt # INGRESO T = 2*np.pi t = sym.Symbol('t') ft = sym.Piecewise((-1,t <-T/2), (-1,t <-T/4), ( 1,t < T/4), (-1,t < T/2), (-1,True),) # intervalo a = -T/2 b = T/2 # número de coeficientes n = 4 # PROCEDIMIENTO k = sym.Symbol('k') w0 = 2*np.pi/T # Términos ak para coseno enintegral = ft*sym.cos(k*w0*t) yaintegrado = sym.integrate(enintegral,(t,a,b)) ak = (2/T)*yaintegrado ak = sym.simplify(ak) # Términos bk para seno enintegral = ft*sym.sin(k*w0*t) yaintegrado = sym.integrate(enintegral,(t,a,b)) bk = (2/T)*yaintegrado bk = sym.simplify(bk) print(' expresión ak:') sym.pprint(ak) print('\n ak formato latex') print(sym.latex(ak)) print('\n expresión bk:') sym.pprint(bk) print('\n bk formato latex') print(sym.latex(bk))
Evaluación de coeficientes
Con las expresiones obtenidas en el bloque anterior, se evaluan los n coeficientes ak y bk.
coeficientes ak: [0, 1.27323954473516, 1.55926873300775e-16, -0.424413181578388] coeficientes bk: [0, 0, 0, 0]
Instrucciones Python
las instrucciones son adicionales al bloque anterior. La evaluación se mantiene usando las expresiones simbólicas usando la instruccion .subs()
# evalua los coeficientes a0 = ak.subs(k,0) b0 = bk.subs(k,0) aki = [a0] bki = [b0] i = 1 while not(i>=n): avalor = ak.subs(k,i) bvalor = bk.subs(k,i) aki.append(avalor) bki.append(bvalor) i = i+1 print('\n coeficientes ak: ') print(aki) print('\n coeficientes bk: ') print(bki)
Expresión de la Serie de Fourier
Encontrados los coeficientes ak y bk, se los usa en la expresión principal
f(t) = a_0 + \sum_{k=1}^{\infty}[a_k \cos( k \omega_0 t) + b_k \sin(k \omega_0t)]obteniendo la siguiente expresión para la serie de Fourier
serie de Fourier fs(t): 1.27323954473516*cos(1.0*t) + 1.55926873300775e-16*cos(2.0*t) - 0.424413181578388*cos(3.0*t)
Instrucciones en Python
# serie de Fourier serieF = a0 + 0*t i = 1 while not(i>=n): serieF= serie + aki[i]*sym.cos(i*w0*t) serie = serie + bki[i]*sym.sin(i*w0*t) i = i+1 # serie = sym.simplify(serie) print('\n serie de Fourier fs(t): ') sym.pprint(serie)
Gráficas de f(t) y Serie de Fourier
Para comparar la función f(t) con la aproximación en series de Fourier, se usa el intervalo [a,b] con una cantidad de muestras
usando la instruccion np.linspace()
y guardando el resultado en ti.
Para evaluar los puntos ti en cada expresión, por simplicidad se convierte la expresión de su forma simbólica a numérica lambda, usando la instrucción sym.lambdify()
Intrucciones en Python
# Para evaluación numérica fsn = sym.lambdify(t,serieF) ftn = sym.lambdify(t,ft) # Evaluación para gráfica muestras = 41 ti = np.linspace(a,b,muestras) fi = ftn(ti) fsi = fsn(ti) # SALIDA # Grafica plt.plot(ti,fi,label = 'f(t)') etiqueta = 'coeficientes = '+ str(n) plt.plot(ti,fsi,label = etiqueta) plt.xlabel('ti') plt.legend() plt.title('Serie de Fourier') plt.show()