Series de Fourier (Grupo PPAD)

De MateWiki
Saltar a: navegación, buscar
Trabajo realizado por estudiantes
Título Series de Fourier (Grupo PPAD).
Asignatura EDP
Curso 2024-25
Autores Pablo Vidal Nacle, Pablo Maestro Fernández, Alex Heredero Santamaría, Diego Moñino Vizmanos
Este artículo ha sido escrito por estudiantes como parte de su evaluación en la asignatura


1 . Introducción

Se define el espacio de Hilbert [math]L^2(a,b)[/math] como:

[math] L^2(a,b) = \left\{ f(x)| \int_{a}^{b} |f(x)|^{2} dx \lt \infty \right\} [/math],

donde [math] a,b \in \mathbb{R} [/math] y [math] a \lt b [/math]. [math]L^2(a,b)[/math] es un espacio vecotrial con producto escalar asociado:

[math] \left\langle f,g \right\rangle_{L^{2}}=\int_{a}^{b} f(x)g(x) dx, \forall f,g \in L^{2} [/math],

Esta construcción del espacio [math] L^{2} [/math] motiva plantear la posibilidad de definir una base numerable que permita expresar todos los elementos del espacio en función de los elementos de la base.

2 . Base trigonométrica

Tal y como se ha definido en la introducción, consideramos el espacio [math]L^2(-\pi,\pi)[/math]. En éste se define la base numerable [math] \beta [/math] dada por los siguientes elementos:

[math] \beta = \left\{ \frac{1}{\sqrt{2\pi}}, \frac{1}{\sqrt{\pi}}cos(n x), \frac{1}{\sqrt{\pi}}sen(n x) \right\}_{n \in \mathbb{N}} [/math],

que se conoce como referencia de Fourier trigonométrica.

3 . Aproximación de una función por la base trigonométrica

Sea
[math] f(x) = xe^{-x} [/math],

definida en el intervalo [-2,3], se busca aproximar f mediante la base trigonométrica del espacio [math]L^2(-2,3)[/math].

Consideramos el espacio de Hilbert \( L^2(- \pi, \pi) \) con el producto interno \( \langle \cdot, \cdot \rangle_{L^2} \). En este espacio tomamos la base de Fourier trigonométrica:

[math] \beta = \left\{ \frac{1}{\sqrt{2\pi}}, \frac{1}{\sqrt{\pi}}cos(nx), \frac{1}{\sqrt{\pi}}sen(nx) \right\}_{n \in \mathbb{N}} [/math],

Si consideramos ahora el espacio \( L^2(a, b) \), buscamos una base ortonormal (referencia de Fourier) en este espacio. Para ello, hacemos el cambio de variable:


[math] h(x) = \frac{2\pi}{b-a} (x - a) - \pi, \quad x \in [a, b] [/math],


De esta manera, \( h(x) \in [-\pi, \pi] \), lo que permite trasladar la base ortonormal del espacio \( L^2(- \pi, \pi) \) al nuevo intervalo \( [a, b] \).

Bajo este cambio de variable, una función \( f(x) \) en \( L^2(a,b) \) se puede expresar como:

[math] f(x) = d_0 + \sum_{n=0}^{\infty} d_n \cos(n R(x)) + \sum_{n=0}^{\infty} c_n \sin(n R(x)) [/math]

donde el coeficiente \( d_0 \) es:

[math] d_0 = \frac{1}{\sqrt{b-a}} [/math]

para que su norma sea 1, pues:

[math] \left\langle \frac{1}{\sqrt{b-a}}, \frac{1}{\sqrt{b-a}} \right\rangle = \int_a^b \frac{1}{b-a} \, dx = 1. [/math]

De esta forma, obtenemos la base de Fourier de \( L^2(a,b) \):

[math] \mathcal{F} = \left\{ \frac{1}{\sqrt{b-a}}, \frac{\sqrt{2}}{\sqrt{b-a}} \cos\left( n \left( \frac{2\pi (x-a)}{b-a} - \pi \right) \right), \frac{\sqrt{2}}{\sqrt{b-a}} \sin\left( n \left( \frac{2\pi (x-a)}{b-a} - \pi \right) \right) \right\}. [/math]

Para preservar la ortonormalidad en \( L^2(a,b) \), los senos y cosenos han sido normalizados con el factor:

[math] \frac{\sqrt{2}}{\sqrt{b-a}} [/math]

para los términos trigonométricos.

En [math] L^2(-2,3) [/math], nos queda la base:

[math] \mathcal{F} = \left\{ \frac{1}{\sqrt{5}}, \frac{\sqrt{2}}{\sqrt{5}} \cos\left( n \left( \frac{2\pi x - \pi}{5} \right) \right), \frac{\sqrt{2}}{\sqrt{5}} \sin\left( n \left( \frac{2\pi x - \pi}{5} \right) \right) \right\}. [/math]

Sea la función \( f(x) = x e^{-x} \). Se verifica que \( f(x) \in L^2(-2,3) \), pues:

[math] \int_{-2}^{3} x^2 e^{-2x} \, dx = \frac{5(e^{10}-5)}{4 e^6}. [/math]

Dado que \( f(x) \) es continua y satisface la condición de Dirichlet, su desarrollo en serie de Fourier converge a la función en los puntos de continuidad y en los extremos. Así, se tiene:

[math] f \sim \frac{d_0}{\sqrt{5}} + \sum_{n=1}^{\infty} d_n \frac{\sqrt{2}}{\sqrt{5}} \cos\left(n \frac{2\pi x - \pi}{5} \right) + \sum_{n=1}^{\infty} d_m \frac{\sqrt{2}}{\sqrt{5}} \sin\left(n \frac{2\pi x - \pi}{5} \right). [/math]

Calculemos ahora los coeficientes de la serie de Fourier

El coeficiente \( d_0 \) se obtiene como:

[math] d_0 = \left\langle f,\frac{1}{\sqrt{5}} \right\rangle_{L^{2}} = \int_{-2}^{3} x e^{-x} \, dx = \frac{-4 + e^5}{\sqrt{5} e^3}. [/math]

Para los coeficientes \( d_n \):

[math] d_n = \left\langle f, \frac{\sqrt{2}}{\sqrt{5}} \cos\left(n \frac{2\pi x - \pi}{5} \right) \right\rangle _{L^{2}}= \int_{-2}^{3} \frac{\sqrt{2}}{\sqrt{5}} x e^{-x} \cos\left(n \frac{2\pi x - \pi}{5} \right) \, dx. [/math]

Para los coeficientes \( d_m \):

[math] d_m = \left\langle f, \frac{\sqrt{2}}{\sqrt{5}} \sin\left(n \frac{2\pi x - \pi}{5} \right) \right\rangle _{L^{2}} = \int_{-2}^{3} \frac{\sqrt{2}}{\sqrt{5}} x e^{-x} \sin\left(n \frac{2\pi x - \pi}{5} \right) \, dx. [/math]

De esta forma, se puede aproximar la función f mediante los primeros 5, 10 y 20 términos de su desarrollo en serie de Fourier, empleando el siguiente código de python:

Aproximación de Fourier de la función extendida [math] xe^{-x} [/math]
Error absoluto entre la función [math] xe^{-x} [/math] y su aproximación de Fourier


from tqdm import tqdm
import sympy as sp
import math
import numpy as np
import matplotlib.pyplot as plt

n=10

def calcular_aproximacion_fourier(n):
    e = 0
    l = 0
    x = sp.symbols('x')
    
    for i in tqdm(range(1, n)): 
        integrand = (math.sqrt(2)/math.sqrt(5)) * x
        * sp.exp(-x) * sp.cos(i * ((2*sp.pi*x - sp.pi) / 5))
        integral_result = sp.integrate(integrand, (x, -2, 3))
        
        integrand2 = (math.sqrt(2)/math.sqrt(5)) * x 
        * sp.exp(-x) * sp.sin(i * ((2*sp.pi*x - sp.pi) / 5))
        integral_result2 = sp.integrate(integrand2, (x, -2, 3))
        
        e += integral_result * (math.sqrt(2)/math.sqrt(5)) * 
        sp.cos(i * ((2*sp.pi*x - sp.pi) / 5))
        l += integral_result2 * (math.sqrt(2)/math.sqrt(5)) * 
        sp.sin(i * ((2*sp.pi*x - sp.pi) / 5))
    
    d0 = -(4 + sp.exp(5)) / (math.sqrt(5) * sp.exp(3))
    f = d0 / math.sqrt(5) + e + l
    
    return sp.lambdify(x, f, "numpy")

# Definir la función f(x) = x * exp(-x)
def f(x):
    return x * np.exp(-x)

# Generar valores de x en el rango [-2, 3]
x_vals = np.linspace(-2, 3, 1000)
y_vals = f(x_vals)

f_numeric=calcular_aproximacion_fourier(n)
# Aproximación de Fourier (f_numeric debe estar definida previamente)
y_fourier = f_numeric(x_vals)

# Calcular el error
error_vals = np.abs(y_vals - y_fourier)

# Crear el gráfico de la función y su aproximación
plt.figure(figsize=(6,4))
plt.plot(x_vals, y_vals, label=r'$f(x) = x e^{-x}$',linestyle='dashed', color='b')
plt.plot(x_vals, y_fourier, label=f"Aproximación n={n}", color='r')
plt.axhline(0, color='black', linewidth=0.5)
plt.axvline(0, color='black', linewidth=0.5)
plt.xlabel("x")
plt.ylabel("f(x)")
plt.title("Comparación entre f(x) y su Aproximación de Fourier")
plt.legend()
plt.grid()
plt.show()

# Gráfico del error
plt.figure(figsize=(6,4))
plt.plot(x_vals, error_vals, label="Error Absoluto", color='g')
plt.xlabel("x")
plt.ylabel("Error")
plt.title("Error entre f(x) y su aproximación de Fourier")
plt.legend()
plt.grid()
plt.show

# Valores de n a evaluar
n_vals1 = np.linspace(10,200,20)
n_vals=[]
for i in range(20):
    n_vals.append(int(n_vals1[i]))
error_supremo_vals = []

for n in n_vals:
    f_numeric = calcular_aproximacion_fourier(n)
    y_fourier = f_numeric(x_vals)
    error_L2 = np.sqrt(np.trapz(np.abs(y_vals - y_fourier)**2, x_vals))
    error_L2_vals.append(error_L2)
    error_supremo = np.sqrt(np.trapz(np.abs(y_vals - y_fourier)**2, x_vals))
    error_supremo_vals.append(error_supremo)

# Graficar el error en norma L2 vs n
plt.figure(figsize=(6, 4))
plt.plot(n_vals, error_L2_vals, linestyle='-', color='r')
plt.xlabel("n")
plt.ylabel("Error L2")
plt.title("Error en Norma L2 para distintos valores de n")
plt.legend()
plt.grid()
plt.show()

# Graficar el error en norma supremo vs n
plt.figure(figsize=(6, 4))
plt.plot(n_vals, error_supremo_vals, linestyle='-', color='r')
plt.xlabel("n")
plt.ylabel("Error norma supremo")
plt.title("Error en Norma supremo para distintos valores de n")
plt.legend()
plt.grid()
plt.show()


4 . Referencias

  • Sandro Salsa, Gianmaria Verzini. Partial Differential Equations in Action(Edición 4).