En este ejemplo analizaremos la serie de Fourier de la función signo, restringuida al intervalo $[-\pi,\pi]$, definida por $$ f(\theta):=\left\{ \begin{matrix} -1,& \theta \in [-\pi,0]\\ 1,& \theta \in [0,\pi]\\ \end{matrix}\right. , $$ cuya serie de Fourier es de la forma: $$ f(\theta)=\sum_{n\rm{\ impar}}\frac{4}{n\pi}\sin(n\theta)=\sum_{k=0}^{\infty}\frac{4}{\pi}\frac{\sin[(2k+1)\theta]}{(2k+1)}. $$
Definimos el $k$-ésimo término de la serie como $$ T_{k}(\theta):=\frac{4}{\pi}\frac{\sin[(2k+1)\theta]}{(2k+1)}, $$ y la serie de Fourier truncada hasta el término $n$-ésimo, es decir, $$ S_n(\theta):=\sum_{k=0}^n T_{k}(\theta). $$
Primero graficaremos la función y la serie truncada usando Numpy. Para ello, cargamos los módulos correspondientes y definiremos una función que calcule la suma truncada:
In [1]:
import numpy as np
import matplotlib.pyplot as plt
%matplotlib inline
In [2]:
def Sn(n,x):
Sn = 0
for k in range(n+1):
Sn += (4/np.pi)*np.sin((2*k+1)*x)/(2*k+1.)
return Sn
Para graficar las curvas en el intervalo $[-2\pi,2\pi]$, creamos el arreglo de valores correspondiente:
In [3]:
x = np.linspace(-2*np.pi,2*np.pi,1000)
Con esto podemos graficar la serie truncada hasta un orden dado, por ejemplo, $n=10$:
In [8]:
plt.plot(x,Sn(50,x))
plt.grid()
plt.xlabel(r'$\theta$',fontsize=15)
plt.ylabel(r'$S_n(\theta)$',fontsize=15)
Out[8]:
Ahora graficamos varias series truncadas
In [9]:
colores = ['blue','red','brown','purple','black']
dasheses = [[],[5,2],[5,5],[5,2,2,2],[2,2]]
fig = plt.figure(figsize=(10,6))
for n in range(4):
plt.plot(x,Sn(n,x),colores[n], dashes=dasheses[n],label='$S_{%d}$'%n, linewidth=1.5)
plt.xlim(-3*np.pi,3*np.pi)
plt.grid()
plt.xlabel(r'$\theta$',fontsize=15)
plt.ylabel(r'$S_n(\theta)$',fontsize=15)
plt.legend(loc='best',fontsize=13)
Out[9]:
También podemos explorar en forma interactiva cómo cambia la serie truncada al variar el número de términos, es decir, variando $n$. Para esto, definimos una función que crea el gráfico para un valor de $n$ dado:
In [10]:
def g(n=0):
plt.plot(x,Sn(n,x))
plt.xlim(-np.pi,np.pi)
plt.grid()
plt.xlabel(r'$\theta$',fontsize=15)
plt.ylabel(r'$S_n(\theta)$',fontsize=15)
Ahora desplegamos el gráfico en forma interactiva usando la función interact
de ipywidgets
:
In [11]:
from ipywidgets import interact
In [12]:
interact(g,n=(0,50))
Out[12]:
Podemos además analizar este ejemplo usando el paquete de matemática simbólica Sympy
In [13]:
import sympy as sp
sp.init_printing()
Primero definimos algunos símbolos que usaremos
In [14]:
x = sp.symbols('x', real=True)
n, m = sp.symbols('n, m', integer=True)
Una forma rápida de intruducir la función que estamos estudiando es usando la función Heaviside
que está predefinida en Sympy
In [15]:
f1 = 2*(sp.Heaviside(x)- sp.Rational(1,2))
Sympy
tiene su propia función plot
que permite graficar rápidamente una función definida en forma simbólica:
In [16]:
sp.plot(f1)
Out[16]:
La serie de Fourier puede ser calculada usando la función fourier_series
:
In [17]:
sf = sp.fourier_series(f1,(x,-sp.pi,sp.pi))
sf
Out[17]:
Podemos calcular la serie truncada hasta un orden cualquiera con el método truncate
In [18]:
sf.truncate(n=15)
Out[18]:
Y graficar en forma interactiva la serie truncada usando la función plot
de Sympy
In [ ]:
def g2(m=0):
sp.plot(sf.truncate(n=m), (x,-2*sp.pi,2*sp.pi))
In [ ]:
interact(g2,m=(1,50))
Finalmente, podemos calcular los coeficientes $b_n$ a partir de su definición
In [ ]:
bn = (1/sp.pi)*sp.integrate(f1*sp.sin(n*x),(x,-sp.pi,sp.pi))
bn
In [ ]:
sp.simplify(bn)
In [ ]:
Sm = sp.Sum(bn*sp.sin(n*x),(n,0,sp.oo))
Sm
In [ ]:
def g3(m=0):
sp.plot(sp.Sum(bn*sp.sin(n*x),(n,0,m)).doit(), (x,-2*sp.pi,2*sp.pi))
# Sum().doit() es equivalente a summation()
In [ ]:
interact(g3,m=(1,50))
In [ ]: