Diferencia entre revisiones de «Series de Fourier (Grupo PPAD)»
| Línea 99: | Línea 99: | ||
</math></center> | </math></center> | ||
| − | De esta forma, se puede aproximar la función f mediante los primeros 5, 10 y 20 términos de la serie, empleando el siguiente código de python | + | De esta forma, se puede aproximar la función f mediante los primeros 5, 10 y 20 términos de su desarrollo en la serie de Fourier, empleando el siguiente código de python |
[[Archivo:Fourier.gif|600px|thumb|Aproximación de Fourier de la función extendida <math> xe^{-x} </math>]] | [[Archivo:Fourier.gif|600px|thumb|Aproximación de Fourier de la función extendida <math> xe^{-x} </math>]] | ||
Revisión del 17:37 12 feb 2025
| 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:
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:
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:
que se conoce como referencia de Fourier trigonométrica.
3 . Aproximación de una función por la base trigonométrica
Seadefinida 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 referencia de Fourier trigonométrica:
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:
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:
donde el coeficiente \( d_0 \) es:
para que su norma sea 1, pues:
De esta forma, obtenemos la base de Fourier de \( L^2(a,b) \):
Para preservar la ortonormalidad en \( L^2(a,b) \), los senos y cosenos han sido normalizados con el factor:
para los términos trigonométricos.
Esto se puede reescribir como:
Sea la función \( f(x) = x e^{-x} \). Se verifica que \( f(x) \in L^2(-2,3) \), pues:
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:
Calculemos ahora los coeficientes de la serie de Fourier
El coeficiente \( d_0 \) se obtiene como:
Para los coeficientes \( d_n \):
Para los coeficientes \( d_m \):
De esta forma, se puede aproximar la función f mediante los primeros 5, 10 y 20 términos de su desarrollo en la serie de Fourier, empleando el siguiente código de python
from tqdm import tqdm
import sympy as sp
import math
import numpy as np
import matplotlib.pyplot as plt
e=0
n=5
l=0
for i in tqdm(range(1,n)):
# Definir la variable x
x = sp.symbols('x')
# Definir la función a integrar
integrand =(math.sqrt(2)/math.sqrt(5))* x * sp.exp(-x)*sp.cos(i * ((2*sp.pi*x-sp.pi)/5))
# Calcular la integral de la función en el intervalo [-2, 3]
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))
# Calcular la integral de la función en el intervalo [-2, 3]
integral_result2 = sp.integrate(integrand2, (x, -2, 3))
e=e+integral_result*(math.sqrt(2)/math.sqrt(5))*sp.cos(i * ((2*sp.pi*x-sp.pi)/5))
l=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
f_numeric = 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)
# 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
