Diferencia entre revisiones de «Series de Fourier (Grupo GIXP)»

De MateWiki
Saltar a: navegación, buscar
(Base trigonométrica compleja)
 
(No se muestran 34 ediciones intermedias de 3 usuarios)
Línea 7: Línea 7:
 
Paula León}}
 
Paula León}}
  
Una serie de Fourier (en honor al matemático Jean-Baptiste Joseph Fourier) consta de una suma infinita de funciones sinusoidales definidas en un dominio <math> \Omega \subseteq \mathbb{R}^n </math> que convergen a una cierta función <math> f(x) </math>. En el ámbito del análisis funcional, las series de Fourier son una poderosa herramienta capaz de descomponer cualquier función periódica definida sobre un cierto dominio como una combinación lineal de infinitas funciones sinusoidales. Poseen numerosas aplicaciones en física e ingeniería, relacionadas con el procesamiento de señales acústicas, análisis vibratorio y compresión de datos, entre otras.
+
Una serie de Fourier (en honor al matemático Jean-Baptiste Joseph Fourier) consta de una suma infinita de funciones sinusoidales definidas en un dominio <math> \Omega \subseteq \mathbb{R}^n </math> que convergen en mínimos cuadrados a una cierta función <math> f(x) </math>. En el ámbito del análisis funcional, las series de Fourier son una poderosa herramienta capaz de descomponer cualquier función periódica definida sobre un cierto dominio como una combinación lineal de infinitas funciones sinusoidales. Poseen numerosas aplicaciones en física e ingeniería, relacionadas con el procesamiento de señales acústicas, análisis vibratorio y compresión de datos, entre otras.
  
En el espacio de Hilbert <math> L^2([-T,T]) = \{f : [-T,T] \rightarrow \mathbb{R} : \int_{-T}^{T} |f(x)|^2 \, dx < \infty\} </math> se define un producto escalar <math> \langle f_1, f_2 \rangle = \int_{-T}^{T} f(x) \cdot g(x) \, dx</math> y las funciones sinusoidales forman una base ortonormal <br />
+
En el espacio de Hilbert <math> L^2([-T,T]) = \{f : [-T,T] \rightarrow \mathbb{R} : \int_{-T}^{T} |f(x)|^2 \, dx < \infty\} </math> se define un producto escalar <math> \langle f_1, f_2 \rangle = \int_{-T}^{T} f(x) \cdot g(x) \, dx</math>, las funciones sinusoidales forman una base ortonormal <br />
  
 
<math> B = \Biggl\{ \dfrac{1}{\sqrt{2T}}\Biggr\} \cup \Biggl\{ \dfrac{1}{\sqrt{T}} \cdot \cos{\left( \dfrac{n \pi x}{T}\right)} \Biggr\}_{n \in \mathbb{N}} \cup \Biggl\{ \dfrac{1}{\sqrt{T}} \cdot \sin{\left( \dfrac{n \pi x}{T}\right)} \Biggr\}_{n \in \mathbb{N}} </math>, <br /><br />
 
<math> B = \Biggl\{ \dfrac{1}{\sqrt{2T}}\Biggr\} \cup \Biggl\{ \dfrac{1}{\sqrt{T}} \cdot \cos{\left( \dfrac{n \pi x}{T}\right)} \Biggr\}_{n \in \mathbb{N}} \cup \Biggl\{ \dfrac{1}{\sqrt{T}} \cdot \sin{\left( \dfrac{n \pi x}{T}\right)} \Biggr\}_{n \in \mathbb{N}} </math>, <br /><br />
Línea 15: Línea 15:
 
y una función <math> f(x) </math> se descompone como <br />
 
y una función <math> f(x) </math> se descompone como <br />
  
<math> f(x) \sim \dfrac{d_0}{\sqrt{2T}} + \sum^{\infty}_{n=1} d_n \cdot \cos{\left( \dfrac{n \pi x}{T}\right)} + \sum^{\infty}_{n=1} c_n \cdot \sin{\left( \dfrac{n \pi x}{T}\right)} </math>, <br /><br />
+
<math>  
 
+
f(x) \sim \dfrac{d_0}{\sqrt{2T}} + \sum^{\infty}_{n=1} d_n \cdot \dfrac{1}{\sqrt{T}} \cos{\left( \dfrac{n \pi x}{T}\right)} + \sum^{\infty}_{n=1} c_n \cdot \dfrac{1}{\sqrt{T}} \sin{\left( \dfrac{n \pi x}{T}\right)}  
[[Archivo:GIXPBaseTrigonometrica.jpg|400px|thumb|right|Primeros diez términos de la Base Trigonométrica]]
+
</math>, <br /><br />
  
 
donde <br />
 
donde <br />
  
 
* <math> d_0 = \bigl \langle f, \dfrac{1}{\sqrt{2T}} \bigr \rangle = \int_{-T}^{T} f(x) \cdot \dfrac{1}{\sqrt{2T}} \, dx </math>
 
* <math> d_0 = \bigl \langle f, \dfrac{1}{\sqrt{2T}} \bigr \rangle = \int_{-T}^{T} f(x) \cdot \dfrac{1}{\sqrt{2T}} \, dx </math>
* <math> d_n = \bigl \langle f, \cos{\left( \dfrac{n \pi x}{T}\right)} \bigr \rangle = \int_{-T}^{T} f(x) \cdot \cos{\left( \dfrac{n \pi x}{T}\right)} \, dx </math>
+
* <math> d_n = \bigl \langle f, \dfrac{1}{\sqrt{T}} \cos{\left( \dfrac{n \pi x}{T}\right)} \bigr \rangle = \int_{-T}^{T} f(x) \cdot \dfrac{1}{\sqrt{T}} \cos{\left( \dfrac{n \pi x}{T}\right)} \, dx </math>
* <math> c_n = \bigl \langle f, \sin{\left( \dfrac{n \pi x}{T}\right)} \bigr \rangle = \int_{-T}^{T} f(x) \cdot \sin{\left( \dfrac{n \pi x}{T}\right)} \, dx </math>. <br /> <br />
+
* <math> c_n = \bigl \langle f, \dfrac{1}{\sqrt{T}} \sin{\left( \dfrac{n \pi x}{T}\right)} \bigr \rangle = \int_{-T}^{T} f(x) \cdot \dfrac{1}{\sqrt{T}} \sin{\left( \dfrac{n \pi x}{T}\right)} \, dx </math>. <br /> <br />
  
(SUBIR CÓDIGO DEL EJERCICIO 1)
+
Para hacerlo más ilustrativo, mostremos en una gráfica los 10 primeros términos de la base trigonométrica mencionada para el intervalo [-1,1].
 +
 
 +
[[Archivo:Fourier_BaseTrigonometrica_GIXP.png|400px|thumb|right|Primeros diez términos de la Base Trigonométrica]]
 +
 
 +
<syntaxhighlight lang="python">
 +
 
 +
import numpy as np
 +
from matplotlib import pyplot as plt
 +
import seaborn as sns
 +
 
 +
# Definir el intervalo x en [-1,1]
 +
x = np.linspace(-1, 1, 500)
 +
 +
# Colores pastel
 +
colors = sns.color_palette("husl", 10)
 +
 +
# ---- 1. Función constante ----
 +
   
 +
plt.figure(figsize=(6, 4))
 +
plt.plot(x, np.full_like(x, 0.5), color=colors[0], linewidth=2, label=r"$\frac{1}{2}$")
 +
plt.xlabel("$x$")
 +
plt.ylabel("$f(x)$")
 +
plt.title("Función constante de la base de Fourier")
 +
plt.legend()
 +
plt.grid()
 +
plt.show()
 +
 
 +
# ---- 2. Gráfica de los primeros 10 términos de cos(nπx) ----
 +
plt.figure(figsize=(8, 5))
 +
for n in range(1, 11):
 +
    plt.plot(x, np.cos(n * np.pi * x), color=colors[n-1], linewidth=2, label=rf"$\cos({n}\pi x)$")
 +
plt.xlabel("$x$")
 +
plt.ylabel("$\cos(n\pi x)$")
 +
plt.title("Primeros 10 términos de $\cos(n\pi x)$")
 +
plt.legend(loc="upper right", fontsize=8)
 +
plt.grid()
 +
plt.show()
 +
 
 +
# ---- 3. Gráfica de los primeros 10 términos de sin(nπx) ----
 +
plt.figure(figsize=(8, 5))
 +
for n in range(1, 11):
 +
    plt.plot(x, np.sin(n * np.pi * x), color=colors[n-1], linewidth=2, label=rf"$\sin({n}\pi x)$")
 +
plt.xlabel("$x$")
 +
plt.ylabel("$\sin(n\pi x)$")
 +
plt.title("Primeros 10 términos de $\sin(n\pi x)$")
 +
plt.legend(loc="upper right", fontsize=8)
 +
plt.grid()
 +
plt.show()
 +
 
 +
 
 +
</syntaxhighlight>
 +
 
 +
__TOC__
  
 
=Aproximación de una función continua=
 
=Aproximación de una función continua=
  
{{matlab|codigo=  
+
Las series de Fourier también pueden aplicarse sobre intervalos no simétricos, aunque eso conlleva dar una extensión de la función que se busca aproximar de forma par, tal que <math> f(x) = f(-x) </math> o impar, tal que <math> f(x) = - f(-x)</math>. Como ejemplo, aproximaremos la función <math> f(x) = 1 - 2\left| \frac{1}{2} - x \right| </math> definida en el intervalo <math> [0,1] </math>, cuya extensión impar se define como
f = @(x) 1 - 2*abs(1/2 - x); % Función f
+
 
fext = @(x) sign(x).*(1 - 2*abs(1/2 - sign(x).* x)); % Extensión impar de f(x)
+
<math>
 +
f^{*}(x) =
 +
\begin{cases}
 +
f(x), & x \in [0,1] \\
 +
- f(-x), & x \in [-1,0)
 +
\end{cases}
 +
</math>
 +
<br />
 +
 
 +
manteniendo la continuidad de la función en <math> x = 0 </math>. Los coeficientes de la serie de Fourier son
 +
 
 +
* <math> d_0 = \bigl \langle f^{*}, \dfrac{1}{\sqrt{2}} \bigr \rangle = \int_{-1}^{1} f^{*}(x) \cdot \dfrac{1}{\sqrt{2}} \, dx </math> 
 +
* <math> d_n = \bigl \langle f^{*}, \cos{\left( n \pi x \right)} \bigr \rangle = \int_{-1}^{1} f^{*}(x) \cdot \cos{\left( n \pi x \right)} \, dx </math> 
 +
* <math> c_n = \bigl \langle f^{*}, \sin{\left( n \pi x \right)} \bigr \rangle = \int_{-1}^{1} f^{*}(x) \cdot \sin{\left( n \pi x \right)} \, dx </math> 
 +
<br />
 +
 
 +
Dado que los coeficientes <math> d_0 </math> y <math> d_n </math> son el resultado de la integral de una función impar <math> f^{*}(x) </math> multiplicada por funciones pares (como la función constante o las funciones asociadas a los cosenos) en un intervalo simétrico, obtenemos que estos términos se anulan, es decir
 +
 
 +
<math>
 +
d_0 = 0, \quad d_n = 0, \quad \forall n \in \mathbb{N}.
 +
</math> 
 +
 
 +
Por lo tanto, la serie de Fourier queda expresada únicamente en términos de senos: 
 +
 
 +
<math>
 +
f^{*}(x) \sim \sum^{\infty}_{n=1} c_n \cdot \sin{\left( n \pi x \right)}.
 +
</math> 
 +
 
 +
A continuación, se muestra la suma de los primeros términos de la serie de Fourier de <math> f^{*}(x) </math> junto a esta función para comparar su similitud. Los coeficientes de la serie han sido calculados mediante la fórmula del trapecio con una partición uniforme de malla <math> 10^{-3} </math> del intervalo <math> [-1,1] </math>.
 +
 
 +
[[Archivo:GIXP(Aproximación de una función).png|miniaturadeimagen|Aproximación por Fourier de <math> f^{*}(x) </math>]]
 +
[[Archivo:GIXP(Errores de la aproximación).png|miniaturadeimagen|Error de la aproximación de <math> f^{*}(x) </math>]]
 +
 
 +
{{matlab|codigo=
 +
 
 +
% Definición de la función f(x) y su extensión impar f'(x)
 +
f = @(x) 1 - 2*abs(1/2 - x); % Función original f(x) en [0,1]
 +
fext = @(x) sign(x).*(1 - 2*abs(1/2 - abs(x))); % Extensión impar de f(x) en [-1,1]
 +
 
 +
% Intervalo y parámetros
 
a = -1; b = 1;              % Extremos del intervalo [-1,1]
 
a = -1; b = 1;              % Extremos del intervalo [-1,1]
h = 1e-2;                    % Discretización
+
h = 1e-3;                    % Discretización
XX = linspace(a,b,(b-a)/h);  % Linspace de 2000 puntos en [-1,1]
+
XX = linspace(a, b, (b - a) / h);  % Linspace en [-1,1]
 +
u = linspace(0, 1, 1000);    % Puntos para la integración numérica
  
% Utilizamos la regla del trapecio para aproximar los ci
+
% Términos de la serie de Fourier
 +
nn_plot = [1, 5, 10];  % Valores de n para las aproximaciones
 +
nn_error = 5:5:50;    % Valores de n para los errores
  
nn = [1 5 10];
+
% Colores para cada n en las gráficas de Fourier
 +
colors = ['b', 'g', 'r'];
  
for j=1:length(nn)
+
% Crear figura para las aproximaciones de Fourier
 +
figure('Position', [100, 100, 800, 900])
  
     n = nn(j);
+
% Aproximación de Fourier para nn_plot
     c = zeros(1,n);
+
for j = 1:length(nn_plot)
    s = @(x) 0;     % Aproximación de f por senos
+
     n = nn_plot(j); % Número de términos de la serie
 +
     s = zeros(1, length(XX)); % Inicializar la serie de Fourier
 
      
 
      
     N = 1000;        % de puntos
+
     % Cálculo de los coeficientes de Fourier
     c = 0; d = 1;    % Extremos del intervalo [0,1]
+
     for k = 1:n
    h2 = (d-c)/N;    % Discretización
+
        % Aproximación de la integral usando la regla del trapecio
    u = c:h2:d;      % Linspace en [0,1]
+
        w = ones(size(u));
    w = ones(N+1,1); % Vector de los pesos
+
        w(1) = 1/2; w(end) = 1/2;  
    w(1) = 1/2; w(end) = 1/2;
+
       
 +
        % Producto f(x) * sin(k*pi*x)
 +
        integrand = f(u) .* sin(k * pi * u); 
 +
        ak = 2 * trapz(u, integrand .* w);  % Coeficiente de Fourier a_k
 +
       
 +
        % Sumar el término de la serie
 +
        s = s + ak * sin(k * pi * XX);
 +
    end
 
      
 
      
     for i = 1:n
+
     % Crear subgráficas para cada n
         GG = f(u).*sin(i*pi*u);  % Función f * sin(npix) discretizada
+
    subplot(3, 1, j)
         c(1,i) = 2 * h2 * GG * w; % Coeficiente i-ésimo de la serie de Fourier
+
    hold on; grid on;
         s = @(x) s(x) + c(1,i)*sin(i*pi*x);
+
    plot(XX, fext(XX), 'k', 'LineWidth', 2)  % Función extendida en negro
 +
    plot(XX, s, colors(j), 'LineWidth', 2)  % Serie de Fourier aproximada
 +
    title(['Aproximación de Fourier con n = ', num2str(n)], 'FontSize', 16)
 +
   
 +
    % Leyenda
 +
    legend('Extensión impar de f(x)', 'Serie de Fourier de f(x)', 'Location', 'southeast', 'FontSize', 10)
 +
    xlabel('x', 'FontSize', 14)
 +
    ylabel('f(x) y Serie de Fourier', 'FontSize', 14)
 +
end
 +
 
 +
% Inicializar vectores para almacenar los errores
 +
errors_L2 = zeros(1, length(nn_error));
 +
errors_inf = zeros(1, length(nn_error));
 +
 
 +
% Crear figura para los errores
 +
figure('Position', [100, 100, 800, 600]) 
 +
 
 +
% Calcular errores para cada n en nn_error
 +
for j = 1:length(nn_error)
 +
    n = nn_error(j); 
 +
    s = zeros(1, length(XX)); 
 +
   
 +
    % Cálculo de la serie de Fourier
 +
    for k = 1:n
 +
         w = ones(size(u)); 
 +
        w(1) = 1/2; w(end) = 1/2; 
 +
       
 +
        % Producto f(x) * sin(k*pi*x)
 +
        integrand = f(u) .* sin(k * pi * u)
 +
         ak = 2 * trapz(u, integrand .* w);
 +
       
 +
        % Sumar el término de la serie
 +
         s = s + ak * sin(k * pi * XX);
 
     end
 
     end
 
      
 
      
     subplot(2,3,j)
+
     % Calcular errores
    hold on; grid on
+
    errors_L2(j) = sqrt(trapz(XX, (fext(XX) - s).^2)); 
    plot(XX,fext(XX))
+
     errors_inf(j) = max(abs(fext(XX) - s)); 
    plot(XX,s(XX))
+
     title(strcat('n=',num2str(nn(j))))
+
    legend('Extensión impar de f(x)','Serie de Fourier de f(x)','Location','southeast')
+
 
end
 
end
 +
 +
% Graficar errores
 +
subplot(2, 1, 1)
 +
plot(nn_error, errors_L2, 'bo-', 'LineWidth', 2)
 +
title('Error L2 en función de n', 'FontSize', 16)
 +
xlabel('Número de términos n', 'FontSize', 14)
 +
ylabel('Error L2', 'FontSize', 14)
 +
grid on
 +
 +
subplot(2, 1, 2)
 +
plot(nn_error, errors_inf, 'ro-', 'LineWidth', 2)
 +
title('Error uniforme en función de n', 'FontSize', 16)
 +
xlabel('Número de términos n', 'FontSize', 14)
 +
ylabel('Error uniforme', 'FontSize', 14)
 +
grid on
 +
 +
 
}}
 
}}
 +
 +
 +
También hemos calculado el error en norma \( L^2 \) y en norma uniforme para distintas \( n \) y así hacernos una idea de la función que siguen los errores de este método en función de \( n \). 
 +
 +
Hemos estimado que siguen la función \( e^{-\alpha n} \), con \( \alpha > 1 \).
  
 
=Base trigonométrica compleja=
 
=Base trigonométrica compleja=
  
(A PARTIR DE AQUÍ NO ES NUESTRO, BORRAR TODO LO DE ABAJO)
+
Se puede definir el conjunto de funciones que toman valores complejos y cuyo modulo al cuadrado es integrable.
  
=Preliminares=
+
<math> L^2( \Omega ) = \left\{ f: \mathbb{R} \to \mathbb{C} \ : \ \int_{\Omega} \left| f(x) \right|^2 \, dx < \infty \right\} </math>.
  
Antes de definir series de Fourier, necesitamos conocer el espacio <math> L^2= \{ f: \Omega \longrightarrow \mathbb{R} : \int_{\Omega}|f(x)|^2 \, dx < \infty \} </math>, que es un espacio de Hilbert.  
+
Este conjunto tiene estructura de espacio vectorial y admite un producto escalar <math> \bigl \langle f, g \bigr \rangle_{\Omega} = \int_{\Omega} f(z) \overline{g(z)} \, dx </math> dotándole de una estructura de espacio de Hilbert.
  
Esto nos permite definir el producto escalar como <math>\langle f,g\rangle_{L^2(\Omega)}= \int_{\Omega} f(x) \cdot g(x) \, dx </math>, con <math> f,g\in L^2(\Omega) </math>, y el módulo como <math> \| \cdot \| _ {L^2 (\Omega)} = \sqrt{\langle\cdot , \cdot \rangle_{L^2(\Omega)}} </math>.
+
En esta sección, se desarrollará una serie de Fourier para aproximar la función
  
=Series de Fourier=
+
<math> f(x) = 4x \left( \frac{1}{2} - x \right)^2 + ix </math>,
  
El conjunto <math> \{ \frac{1}{2},\cos(nx),\sin(nx) \}_{n\in\mathbb{N}}</math> es la '''base trigonométrica''' del espacio <math> L^2([-\pi,\pi])</math>, por tanto, toda función de <math> L^2([-\pi,\pi])</math> puede expresarse como una combinación lineal de los elementos de esta. Además, podemos observar que las funciones de la base son <math> 2\pi</math> periódicas, y es fácil comprobar que es una base ortogonal en <math> L^2([-\pi,\pi])</math>.
+
que toma valores complejos, definida en el intervalo <math> [0,1] </math>.
  
Para entender mejor la base vamos a graficar los primeros 10 términos de esta.
+
El objetivo es expresar la función como combinación lineal de elementos de una base del espacio, en particular, la base trigonométrica. Esta base para <math> L^2([-\pi,\pi]) </math> es
  
[[Archivo:Gf1_1.png|450px|thumb|right]]
+
<math> B_{L^2([-\pi,\pi])} = \left\{\frac{1}{\sqrt{2\pi}}e^{ikx}\right\}_{k \in \mathbb{Z}} </math>.
{{matlab|codigo=
+
x=linspace(-1,1,200);
+
y=1/2*ones(1,200);
+
hold on
+
plot(x,y)
+
for n=1:4
+
    plot(x,cos(n*pi*x))
+
    plot(x,sin(n*pi*x))
+
end
+
plot(x,cos(5*pi*x))
+
title('Primeros 10 términos de la base trigonométrica');
+
xlabel('x');
+
ylabel('y');
+
legend('1/2', '$\cos(\pi x)$', '$\sin(\pi x)$', '$\cos(2\pi x)$', '$\sin(2\pi x)$', '$\cos(3\pi x)$', '$\sin(3\pi x)$', '$\cos(4\pi x)$', '$\sin(4\pi x)$','$\cos(5\pi x)$', 'Interpreter','latex');
+
  
}}
+
Aplicando el cambio de variable
  
Una vez hemos entendido lo que es una base trigonométrica, podemos definir la '''serie de Fourier''' de una función <math> f\in L^2([-\pi,\pi])</math> como: <math> f \approx \frac{a_0}{2}+\sum^{N}_{n=1}(a_n\cos{(nx)}+b_n\sin{(nx)})</math>
+
<math> x = \frac{\log \left(\sqrt{\frac{2\pi}{b-a}} \right)}{ik} + \frac{2\pi}{b-a}(y-a) </math>,
  
Como la base trigonométrica es ortogonal, podemos obtener los coeficientes de la serie de Fourier como:
+
trasladamos la base al intervalo <math> \left[a,b\right] </math>:
  
<math> a_0=\frac{\langle f,\frac{1}{2}\rangle_{L^2([-\pi,\pi])}}{\| \frac{1}{2} \|^2 _ {L^2 ([-\pi,\pi])}} =\frac{1}{\pi}\int^{\pi}_{-\pi} f(x)\, dx </math>
+
<math> B_{L^2([a,b])} = \left\{\frac{1}{\sqrt{b-a}}e^{ik\frac{2\pi}{b-a}(y-a)}\right\}_{k \in \mathbb{Z}} </math>
  
<math> a_n=\frac{\langle f,\cos(nx)\rangle_{L^2([-\pi,\pi])}}{\| \cos(nx) \|^2 _ {L^2 ([-\pi,\pi])}} =\frac{1}{\pi}\int^{\pi}_{-\pi} f(x)\cos(x)\, dx </math>.
+
En efecto, es base, ya que
  
<math> b_n=\frac{\langle f,\sin(nx)\rangle_{L^2([-\pi,\pi])}}{\| \sin(nx) \|^2 _ {L^2 ([-\pi,\pi])}} =\frac{1}{\pi}\int^{\pi}_{-\pi} f(x)\sin(x)\, dx </math>,
+
* <math> \bigl \langle \frac{1}{\sqrt{b-a}}e^{ik\frac{2\pi}{b-a}(x-a)}, \frac{1}{\sqrt{b-a}}e^{ik\frac{2\pi}{b-a}(x-a)} \bigr \rangle_{L^2([a,b])} = \int_{a}^{b} \frac{1}{\sqrt{b-a}}e^{ik\frac{2\pi}{b-a}(x-a)\frac{1}{\sqrt{b-a}}e^{-ik\frac{2\pi}{b-a}(x-a)} \, dx = \frac{1}{b-a}\int_{a}^{b} \, dx = 1 </math>
  
=Extensión de funciones=
+
* <math> \bigl \langle \frac{1}{\sqrt{b-a}}e^{ik\frac{2\pi}{b-a}(x-a)}, \frac{1}{\sqrt{b-a}}e^{ih\frac{2\pi}{b-a}(x-a)} \bigr \rangle_{L^2([a,b])} = \int_{a}^{b} \frac{1}{\sqrt{b-a}}e^{ik\frac{2\pi}{b-a}(x-a)}  \frac{1}{\sqrt{b-a}}e^{-ih\frac{2\pi}{b-a}(x-a)} \, dx = \frac{1}{b-a}\int_{a}^{b} e^{i(k-h)\frac{2\pi}{b-a}(x-a)} \, dx = \frac{1}{i(k-h)2\pi} \left( 1 - 1 \right) \, dx = 0 </math>
  
Para simplificar los cálculos de la serie de Fourier podemos  extender la función de forma par o impar, lo cual hace que algunos términos se cancelen. Si la función es par, los coeficientes <math> b_n</math> serán cero, ya que al ser el seno una función impar, el producto  <math> f(x)\sin(x)</math> también lo va a ser, y la integral de una función impar sobre un intervalo simétrico se anula. Análogamente, si la función es impar los coeficientes <math> a_0,a_n,n\geq 1</math> van a ser cero.
+
Escogiendo el intervalo <math> \left[ 0,1 \right] </math>, se tiene que la base trigonométrica compleja de <math> L^2([0,1]) </math> es
  
Para ejemplificar esto, tomaremos la función <math>f(x)=x(1-x)</math> en el intervalo <math>[0,1]</math>. La extenderemos de forma impar en el intervalo <math>[-1,1]</math> y la aproximaremos usando su desarrollo en serie de Fourier.
+
<math> B_{L^2([0,1])} = \left\{e^{2\pi ikx}\right\}_{k \in \mathbb{Z}} </math>,
 +
<br />
  
Para hacer esto, primero vamos a comprobar que la extensión sigue siendo una función continua, esto se debe a que la original pasaba por el origen de coordenadas.
+
y será la que se usará para desarrollar la serie de Fourier.
  
[[Archivo:Grafica1_2_1.png|300px|thumb|right]]
+
Los coeficientes de la serie se calculan de la siguiente manera:
{{matlab|codigo=
+
x1=0:10^(-3):1;
+
x2=-1:10^(-3):0;
+
figure(1)
+
hold on
+
plot(x1,x1.*(1-x1),'r',LineWidth=1.5)
+
plot(x2,x2.*(1+x2),'b',LineWidth=1.5)
+
title('Extension impar de $f(x)=x(1-x)$', 'interpreter','latex',FontSize=15)
+
xlabel('x')
+
ylabel('y')
+
}}
+
  
Ahora calcularemos la serie de Fourier aproximando los coeficientes de la serie de forma numérica mediante el calculo de las integrales por el método del trapecio.
+
* <math> z_k = \bigl \langle f, e^{2\pi ikx} \bigr \rangle_{L^2([0,1])} = \int_{0}^{1} f(x) \cdot e^{-2\pi ikx} \, dx, \quad \forall k \in \mathbb{Z} </math>
  
{{matlab|codigo=
+
Por lo tanto, la serie de Fourier queda expresada únicamente en términos de exponenciales complejas:
a=0; b=1;                   
+
u_1=a:10^(-3):b;
+
N=length(u_1)-1;
+
h=(b-a)/N;
+
w=ones(N+1,1);             
+
w(1)=1/2; w(N+1)=1/2;
+
figure(2)
+
n=[1,5,10];
+
f_n=zeros(length(n),N+1);
+
for i=1:length(n)
+
    for k=1:n(i)
+
        g=(u_1.*(1-u_1).*sin(k*pi*u_1))';
+
        a_k=2*h*w'*g;
+
        f_n(i,:)=f_n(i,:)+a_k*sin(k*pi*u_1);
+
    end
+
    subplot(1,3,i)
+
    hold on
+
    plot(u_1,f_n(i,:),'r',LineWidth=1.5)
+
    plot(u_1,u_1.*(1-u_1),'--b',LineWidth=1.5)
+
    title('n='+string(n(i)))
+
    legend('$f_n(x)$','$f(x)$','interpreter','latex','Location','northwest')
+
    grid('on')
+
end
+
}}
+
  
[[Archivo:Gf1_2_2.png|800px|center]]
+
<math>
 +
f(x) \sim \sum^{+\infty}_{k=-\infty} z_k \cdot e^{2\pi ikx}
 +
</math>
  
En la gráfica se muestra la aproximación de <math> f(x) </math> por los primeros términos de su serie de Fourier (1,5 y 10 respectivamente).
+
[[Archivo:Fourier_Real_GIXP.png|400px|thumb|right|Serie de Fourier compleja de <math> f(x) </math>. Parte real.]]
Como ya de partida la función <math> f(x) </math> tenía una forma bastante sinusoidal en el intervalo <math> [0,1] </math>, vemos que la aproximación es bastante buena con tan sólo unos pocos términos de la serie.
+
[[Archivo:Fourier_Imaginaria_GIXP.png|400px|thumb|right|Serie de Fourier compleja de <math> f(x) </math>. Parte imaginaria.]]
  
Aunque a simple vista se ve que la aproximación es buena, vamos a comprobarlo utilizando los errores en la norma <math> L^2 </math> y en la uniforme.
+
<syntaxhighlight lang="python">
  
[[Archivo:Gf1_2_3.png|400px|thumb|right]]
+
import numpy as np
{{matlab|codigo=
+
import matplotlib.pyplot as plt
a=0; b=1;                   
+
from scipy.integrate import quad
u_1=a:10^(-3):b;
+
u_2=-1:10^(-3):0;
+
N=length(u_1)-1;
+
h=(b-a)/N;
+
w=ones(N+1,1);             
+
w(1)=1/2; w(N+1)=1/2;
+
for n=1:10
+
    f_n=zeros(1,N+1);
+
    for k=1:n
+
        g=(u_1.*(1-u_1).*sin(k*pi*u_1))';
+
        a_k=2*h*w'*g;
+
        f_n=f_n+a_k*sin(k*pi*u_1);
+
    end
+
    g1=abs(u_1.*(1-u_1)-f_n).^2;
+
    error1(n)=(h*w'*g1')^(1/2);
+
    error2(n)=max(abs(u_1.*(1-u_1)-f_n));
+
end
+
nn=1:1:10;
+
hold on
+
plot(nn,error1,'b',LineWidth=1.5)
+
plot(nn,error2,'r',LineWidth=1.5)
+
legend('$L^2$','Supremo','interpreter','latex')
+
}}
+
  
Como podemos observar en la gráfica, cuanto mayor es la <math> n </math>, mejor aproxima la función y además, podemos ver que el error en <math> n=10 </math> es casi 0. También, podemos observar que el error de la norma <math> L^2 </math> es menor que el de la norma uniforme.
+
# Definir la función a aproximar
  
Ahora vamos a tomar la función <math> g(x)=1_{x\leq 1/2}(x) </math> extendiéndola de forma par al intervalo <math> [-1,1] </math> y aproximándola por su serie de Fourier.
+
def f(x):
 +
    return 4*x*(0.5 - x)**2 + 1j*x
  
[[Archivo:Grafica1_3_2.jpeg|300px|thumb|right]]
+
# Calcular coeficientes de Fourier en la base {e^(i 2πnx)}
{{matlab|codigo=
+
x1=[0:0.01:1];
+
x2=[-1:0.01:0];
+
y1=[ones(50,1);zeros(51,1)];
+
y2=[zeros(50,1);ones(51,1)];
+
figure(1)
+
plot(x1,y1,LineWidth=1.5,Color='r')
+
ylim([-1,2])
+
hold on
+
plot(x2,y2,LineWidth=1.5,Color='b')
+
title('Extension par de $g(x)=1_{x\leq 1/2}(x)$','Interpreter','latex',FontSize=15)
+
xlabel('x')
+
ylabel('y')
+
}}
+
  
Comprobamos que como la función era discontinua, la extensión sigue siendo discontinua, y por tanto vamos a ver que la serie de Fourier va a tener problemas al aproximar la función.
+
def fourier_coefficient(n):
 +
   
 +
    integrand = lambda x: f(x) * np.exp(-1j * 2 * np.pi * n * x)
 +
   
 +
    real_part, _ = quad(lambda x: integrand(x).real, 0, 1)
 +
    imag_part, _ = quad(lambda x: integrand(x).imag, 0, 1)
  
{{matlab|codigo=
+
     return real_part + 1j * imag_part  # Devolver coeficiente complejo
x=[0:0.01:1];
+
y=[ones(50,1);zeros(51,1)];
+
u=0:10^(-3):1;
+
N=length(u)-1;
+
w = [ones(N/2,1);zeros(N/2+1,1)];             
+
h = 10^(-3);
+
nn=[1,5,10];
+
for j=1:length(nn)
+
     for n=1:nn(j)
+
        f_n=0.5*ones(1,N+1);
+
        for k=1:n
+
            g=(cos(k*pi*u))';
+
            a_k=2*h*w'*g;
+
            f_n=f_n+a_k*cos(k*pi*u);
+
        end
+
    end
+
    subplot(1,3,j)
+
    plot(x,y,'b--',LineWidth=1.5)
+
    hold on
+
    plot(u,f_n,'r',LineWidth=1.5)
+
    title('n='+string(nn(j)))
+
    legend('f(x)','$f_n(x)$','interpreter','latex')
+
end
+
}}
+
  
[[Archivo:Grafica1_3_1.png|800px|center]]
+
# Aproximar la función con los primeros N términos
+
En la gráfica se muestra la aproximación de <math> g(x) </math> por los primeros términos de su serie de Fourier (1,5 y 10 respectivamente).
+
  
También se observa que cerca del punto de discontinuidad (<math> x=1/2 </math>) los primeros términos de la serie "fallan" en aproximar bien a la función, ya que se producen muchas oscilaciones de gran amplitud. Esto es conocido como el '''fenómeno de Gibbs''', que se produce ya que los elementos de la base (funciones trigonométricas) son funciones muy regulares, pero que están aproximando una función discontinua. Para <math> x \leq 1/2 </math> la serie toma el valor 1 y para <math> x \geq 1/2 </math> toma el valor 0 (ya que tiene que ser igual a <math> g(x) </math> en casi todo punto), pero por ser periódica, en <math> x = 1/2 </math> tomará el valor 1/2, de ahi la dificultad de que la serie truncada se comporte "bien" cerca de este punto.
+
def fourier_approx_real(x, N):
 +
    S_N = sum(fourier_coefficient(n) * np.exp(1j * 2 * np.pi * n * x) for n in range(-N, N+1))
 +
    return S_N.real  # Tomamos la parte real de la serie de Fourier
  
Para evitar el fenómeno de Gibbs vamos a utilizar las sumas de Cesáro para aproximar <math> g(x) </math>. Su fórmula es: <math> S_N(x)=\frac{1}{N+1} \sum_{n=0}^N f_n(x) </math>, que no es más que la media aritmética de los <math> N+1 </math> primeros términos.
+
def fourier_approx_imag(x, N):
 +
    S_N = sum(fourier_coefficient(n) * np.exp(1j * 2 * np.pi * n * x) for n in range(-N, N+1))
 +
    return S_N.imag  # Tomamos la parte imaginaria de la serie de Fourier
  
{{matlab|codigo=
+
# Valores de x para la gráfica
x=[0:0.01:1];
+
y=[ones(50,1);zeros(51,1)];
+
u=0:10^(-3):1;
+
N=length(u)-1;
+
NN=[1,5,10];
+
w = [ones(N/2,1);zeros(N/2+1,1)];             
+
h = 10^(-3);
+
f=[];
+
for j=1:length(NN)
+
    for n=1:NN(j)
+
        f_n=0.5*ones(1,N+1);
+
        for k=1:n
+
            g=(cos(k*pi*u))';
+
            a_k=2*h*w'*g;
+
            f_n=f_n+a_k*cos(k*pi*u);
+
        end
+
        f=[f;f_n];
+
    end
+
%sumas de Cesaro
+
subplot(1,3,j)
+
plot(x,y,'b--',LineWidth=1.5)
+
hold on
+
S=zeros(1,N+1);
+
for n=1:NN(j)
+
    S=S+f(n,:);
+
end
+
S=(1./(NN(j)+1))*S;
+
plot(u,S,'r',LineWidth=1.5)
+
title('n='+string(NN(j)))
+
legend('f(x)','$f_n(x)$','interpreter','latex')
+
ylim([-0.2,1.2])
+
end
+
}}
+
  
[[Archivo:Grafica1_3_3.png|800px|center]]
+
x_vals = np.linspace(0, 1, 500)
 +
f_real_vals = np.array([f(x).real for x in x_vals])
 +
f_imag_vals = np.array([f(x).imag for x in x_vals])
  
Al observar las gráficas, podemos observar que efectivamente el fenómeno de Gibbs desaparece.
+
# Aproximaciones con distintos N
  
=Cambio de intervalo=
+
N_values = [5, 10, 20]
Ahora vamos a observar qué hay que hacer cuando una función en vez de estar definida en el intervalo <math> [-\pi,\pi] </math>, está definida en un intervalo <math> [a,b] </math>. En estos casos, hacemos un cambio de variable, variando así también la base trigonométrica.
+
  
Dado el intervalo <math> [a,b] </math> tomamos <math> T=\frac{b-a}{2} </math>, y el cambio de variable <math> y=\frac{T}{pi}x </math>. Con este cambio, la base trigonométrica es: <math> \left\{ \frac{1}{2}, \sin\left(\frac{n\pi}{T}y\right), \cos\left(\frac{n\pi}{T}y\right) \right\}_{n\in\mathbb{N}} </math>.
+
# Parte Real
  
Por este motivo, en los dos ejemplos anteriores, cuyo intervalo era <math> [-1,1] </math>, hemos tomado como base trigonométrica <math> \left\{ \frac{1}{2},\cos( n\pi x),\sin(n\pi x) \right\}_{n\in\mathbb{N}}</math>.
+
plt.figure(figsize=(10, 6))
 +
plt.plot(x_vals, f_real_vals, label='Función Original', linewidth=2, color='black')
  
Para entender mejor cómo cambiar de base, vamos a tomar la función <math> h(x)=xe^{-x} </math> en el intervalo <math> [1,3] </math> y a aproximarla por su serie de Fourier utilizando la misma base que en los ejemplos anteriores. Esto se debe a que al hacer el cambio de variable para tomar la nueva base lo único que afecta es el tamaño del intervalo, debido a la periodicidad de las funciones.
+
for N in N_values:
 +
    approx_vals = np.array([fourier_approx_real(x, N) for x in x_vals])
 +
    plt.plot(x_vals, approx_vals, label=f'Aproximación con {N} términos')
  
{{matlab|codigo=
+
plt.xlabel('x')
a=1; b=3;                   
+
plt.ylabel('Re f(x)')
u_1=a:10^(-3):b;
+
plt.title('Aproximación de Fourier de f(x) - Parte real')
N=length(u_1)-1;
+
plt.legend()
h=(b-a)/N;
+
plt.grid()
w=ones(N+1,1);             
+
plt.show()
w(1)=1/2; w(N+1)=1/2;
+
g0=(u_1.*exp(-u_1))';
+
a_0=h*w'*g0;
+
nn=[5,10,20];
+
for j=1:length(nn)
+
    for n=1:nn(j)
+
        f_n=0.5*a_0*ones(1,N+1);
+
        for k=1:n
+
            g1=(u_1.*exp(-u_1).*sin(k*pi*u_1))';
+
            g2=(u_1.*exp(-u_1).*cos(k*pi*u_1))';
+
            a_k=h*w'*g1;
+
            b_k=h*w'*g2;
+
            f_n=f_n+a_k*sin(k*pi*u_1)+b_k*cos(k*pi*u_1);
+
        end
+
    end
+
    subplot(1,3,j)
+
    plot(u_1,f_n,'r','LineWidth',1.5)
+
    hold on
+
    plot(u_1,u_1.*exp(-u_1),'b--','LineWidth',1.5)
+
    title('n='+string(nn(j)))
+
    legend('f(x)','$f_n(x)$','interpreter','latex')
+
end
+
}}
+
[[Archivo:Grafica1_4.png|900px|center]]
+
  
=Base trigonométrica compleja=
+
# Parte Imaginaria
  
Ahora vamos a tomar la base trigonométrica compleja <math> \{ e^{inx}\}_{n\in\mathbb{Z}}</math> en <math> L^2[-\pi,\pi]</math>, cuyo producto escalar se define como: <math>\langle f,g\rangle_{L^2}= \int_{\Omega} f(x) \cdot \overline {g(x)} \, dx </math>.
+
plt.figure(figsize=(10, 6))
 +
plt.plot(x_vals, f_imag_vals, label='Función Original', linewidth=2, color='black')
  
Esta base nos va a permitir aproximar funciones complejas mediante series de Fourier, pero también vamos a poder aproximar funciones reales.
+
for N in N_values:
Tomamos la función <math> f(x)=4x(1/2−x)^2 </math> en el intervalo <math> [0,1]</math> y vamos a aproximarla con esta base compleja. Para hacer esto lo primero que tenemos que hacer es expresar la base en el intervalo <math> [0,1]</math> que es: <math> \{ e^{2\pi inx}\}_{n\in\mathbb{Z}}</math> y una vez tenemos esta base ya podemos aproximar nuestra función mediante la serie de Fourier que es: <math> f(x)=\sum _{k=-\infty}^{\infty} c_k e^{2\pi inx}</math>. El calculo de los coeficientes <math>c_k</math> lo vamos a hacer utilizando el producto escalar definido para esta base compleja.
+
    approx_vals = np.array([fourier_approx_imag(x, N) for x in x_vals])
 +
    plt.plot(x_vals, approx_vals, label=f'Aproximación con {N} términos')
  
 +
plt.xlabel('x')
 +
plt.ylabel('Im f(x)')
 +
plt.title('Aproximación de Fourier de f(x) - Parte imaginaria')
 +
plt.legend()
 +
plt.grid()
 +
plt.show()
  
{{matlab|codigo=
+
 
clear all
+
</syntaxhighlight>
a=0; b=1;                   
+
 
u_1=a:10^(-3):b;
+
= Bibliografía =
N=length(u_1)-1;
+
 
h=(b-a)/N;
+
* [https://es.wikipedia.org/wiki/Serie_de_Fourier Wikipedia. Series de Fourier. Editada por última vez el 12/09/2024]
w=ones(N+1,1);             
+
w(1)=1/2; w(N+1)=1/2;
+
n=10;
+
nn=[5,10,20];
+
for j=1:length(nn)
+
    f_n=zeros(1,N+1);
+
    for k=-nn(j):nn(j)
+
        g1=(4*u_1.*(0.5-u_1).^2.*conj(exp(-i*k*2*pi*u_1)))';
+
        g2=(exp(i*k*2*pi*u_1).*conj(exp(i*k*2*pi*u_1)))';
+
        c=h*w'*g1;
+
        d=h*w'*g2;
+
        a_k=c/d;
+
        f_n=f_n+a_k*exp(i*k*pi*2*u_1);
+
    end
+
    subplot(1,3,j)
+
    plot(u_1,f_n,'r',LineWidth=1.5)
+
    hold on
+
    plot(u_1,(4*u_1.*(0.5-u_1).^2),'b--',LineWidth=1.5)
+
    title('n='+string(nn(j)))
+
    legend('$f_n(x)$','f(x)','interpreter','latex')
+
end
+
}}
+
[[Archivo:Grafica1_5.png|900px|center]]
+
  
 
[[Categoría:EDP]]
 
[[Categoría:EDP]]
 
[[Categoría:EDP24/25]]
 
[[Categoría:EDP24/25]]

Revisión actual del 23:56 19 feb 2025

Trabajo realizado por estudiantes
Título Series de Fourier. Grupo GIXP
Asignatura EDP
Curso 2024-25
Autores Gonzalo Garelly

Israel López

Francisco Lavao

Paula León

Este artículo ha sido escrito por estudiantes como parte de su evaluación en la asignatura


Una serie de Fourier (en honor al matemático Jean-Baptiste Joseph Fourier) consta de una suma infinita de funciones sinusoidales definidas en un dominio [math] \Omega \subseteq \mathbb{R}^n [/math] que convergen en mínimos cuadrados a una cierta función [math] f(x) [/math]. En el ámbito del análisis funcional, las series de Fourier son una poderosa herramienta capaz de descomponer cualquier función periódica definida sobre un cierto dominio como una combinación lineal de infinitas funciones sinusoidales. Poseen numerosas aplicaciones en física e ingeniería, relacionadas con el procesamiento de señales acústicas, análisis vibratorio y compresión de datos, entre otras.

En el espacio de Hilbert [math] L^2([-T,T]) = \{f : [-T,T] \rightarrow \mathbb{R} : \int_{-T}^{T} |f(x)|^2 \, dx \lt \infty\} [/math] se define un producto escalar [math] \langle f_1, f_2 \rangle = \int_{-T}^{T} f(x) \cdot g(x) \, dx[/math], las funciones sinusoidales forman una base ortonormal

[math] B = \Biggl\{ \dfrac{1}{\sqrt{2T}}\Biggr\} \cup \Biggl\{ \dfrac{1}{\sqrt{T}} \cdot \cos{\left( \dfrac{n \pi x}{T}\right)} \Biggr\}_{n \in \mathbb{N}} \cup \Biggl\{ \dfrac{1}{\sqrt{T}} \cdot \sin{\left( \dfrac{n \pi x}{T}\right)} \Biggr\}_{n \in \mathbb{N}} [/math],

y una función [math] f(x) [/math] se descompone como

[math] f(x) \sim \dfrac{d_0}{\sqrt{2T}} + \sum^{\infty}_{n=1} d_n \cdot \dfrac{1}{\sqrt{T}} \cos{\left( \dfrac{n \pi x}{T}\right)} + \sum^{\infty}_{n=1} c_n \cdot \dfrac{1}{\sqrt{T}} \sin{\left( \dfrac{n \pi x}{T}\right)} [/math],

donde

  • [math] d_0 = \bigl \langle f, \dfrac{1}{\sqrt{2T}} \bigr \rangle = \int_{-T}^{T} f(x) \cdot \dfrac{1}{\sqrt{2T}} \, dx [/math]
  • [math] d_n = \bigl \langle f, \dfrac{1}{\sqrt{T}} \cos{\left( \dfrac{n \pi x}{T}\right)} \bigr \rangle = \int_{-T}^{T} f(x) \cdot \dfrac{1}{\sqrt{T}} \cos{\left( \dfrac{n \pi x}{T}\right)} \, dx [/math]
  • [math] c_n = \bigl \langle f, \dfrac{1}{\sqrt{T}} \sin{\left( \dfrac{n \pi x}{T}\right)} \bigr \rangle = \int_{-T}^{T} f(x) \cdot \dfrac{1}{\sqrt{T}} \sin{\left( \dfrac{n \pi x}{T}\right)} \, dx [/math].

Para hacerlo más ilustrativo, mostremos en una gráfica los 10 primeros términos de la base trigonométrica mencionada para el intervalo [-1,1].

Primeros diez términos de la Base Trigonométrica
import numpy as np
from matplotlib import pyplot as plt
import seaborn as sns

# Definir el intervalo x en [-1,1]
x = np.linspace(-1, 1, 500)
 
# Colores pastel
colors = sns.color_palette("husl", 10)
 
# ---- 1. Función constante ----
    
plt.figure(figsize=(6, 4))
plt.plot(x, np.full_like(x, 0.5), color=colors[0], linewidth=2, label=r"$\frac{1}{2}$")
plt.xlabel("$x$")
plt.ylabel("$f(x)$")
plt.title("Función constante de la base de Fourier")
plt.legend()
plt.grid()
plt.show()

# ---- 2. Gráfica de los primeros 10 términos de cos(nπx) ----
plt.figure(figsize=(8, 5))
for n in range(1, 11):
    plt.plot(x, np.cos(n * np.pi * x), color=colors[n-1], linewidth=2, label=rf"$\cos({n}\pi x)$")
plt.xlabel("$x$")
plt.ylabel("$\cos(n\pi x)$")
plt.title("Primeros 10 términos de $\cos(n\pi x)$")
plt.legend(loc="upper right", fontsize=8)
plt.grid()
plt.show()

# ---- 3. Gráfica de los primeros 10 términos de sin(nπx) ----
plt.figure(figsize=(8, 5))
for n in range(1, 11):
    plt.plot(x, np.sin(n * np.pi * x), color=colors[n-1], linewidth=2, label=rf"$\sin({n}\pi x)$")
plt.xlabel("$x$")
plt.ylabel("$\sin(n\pi x)$")
plt.title("Primeros 10 términos de $\sin(n\pi x)$")
plt.legend(loc="upper right", fontsize=8)
plt.grid()
plt.show()

1 Aproximación de una función continua

Las series de Fourier también pueden aplicarse sobre intervalos no simétricos, aunque eso conlleva dar una extensión de la función que se busca aproximar de forma par, tal que [math] f(x) = f(-x) [/math] o impar, tal que [math] f(x) = - f(-x)[/math]. Como ejemplo, aproximaremos la función [math] f(x) = 1 - 2\left| \frac{1}{2} - x \right| [/math] definida en el intervalo [math] [0,1] [/math], cuya extensión impar se define como

[math] f^{*}(x) = \begin{cases} f(x), & x \in [0,1] \\ - f(-x), & x \in [-1,0) \end{cases} [/math]

manteniendo la continuidad de la función en [math] x = 0 [/math]. Los coeficientes de la serie de Fourier son

  • [math] d_0 = \bigl \langle f^{*}, \dfrac{1}{\sqrt{2}} \bigr \rangle = \int_{-1}^{1} f^{*}(x) \cdot \dfrac{1}{\sqrt{2}} \, dx [/math]
  • [math] d_n = \bigl \langle f^{*}, \cos{\left( n \pi x \right)} \bigr \rangle = \int_{-1}^{1} f^{*}(x) \cdot \cos{\left( n \pi x \right)} \, dx [/math]
  • [math] c_n = \bigl \langle f^{*}, \sin{\left( n \pi x \right)} \bigr \rangle = \int_{-1}^{1} f^{*}(x) \cdot \sin{\left( n \pi x \right)} \, dx [/math]


Dado que los coeficientes [math] d_0 [/math] y [math] d_n [/math] son el resultado de la integral de una función impar [math] f^{*}(x) [/math] multiplicada por funciones pares (como la función constante o las funciones asociadas a los cosenos) en un intervalo simétrico, obtenemos que estos términos se anulan, es decir

[math] d_0 = 0, \quad d_n = 0, \quad \forall n \in \mathbb{N}. [/math]

Por lo tanto, la serie de Fourier queda expresada únicamente en términos de senos:

[math] f^{*}(x) \sim \sum^{\infty}_{n=1} c_n \cdot \sin{\left( n \pi x \right)}. [/math]

A continuación, se muestra la suma de los primeros términos de la serie de Fourier de [math] f^{*}(x) [/math] junto a esta función para comparar su similitud. Los coeficientes de la serie han sido calculados mediante la fórmula del trapecio con una partición uniforme de malla [math] 10^{-3} [/math] del intervalo [math] [-1,1] [/math].

Aproximación por Fourier de [math] f^{*}(x) [/math]
Error de la aproximación de [math] f^{*}(x) [/math]
% Definición de la función f(x) y su extensión impar f'(x)
f = @(x) 1 - 2*abs(1/2 - x);  % Función original f(x) en [0,1]
fext = @(x) sign(x).*(1 - 2*abs(1/2 - abs(x)));  % Extensión impar de f(x) en [-1,1]

% Intervalo y parámetros
a = -1; b = 1;               % Extremos del intervalo [-1,1]
h = 1e-3;                    % Discretización
XX = linspace(a, b, (b - a) / h);  % Linspace en [-1,1]
u = linspace(0, 1, 1000);    % Puntos para la integración numérica

% Términos de la serie de Fourier
nn_plot = [1, 5, 10];  % Valores de n para las aproximaciones
nn_error = 5:5:50;     % Valores de n para los errores

% Colores para cada n en las gráficas de Fourier
colors = ['b', 'g', 'r'];

% Crear figura para las aproximaciones de Fourier
figure('Position', [100, 100, 800, 900])  

% Aproximación de Fourier para nn_plot
for j = 1:length(nn_plot)
    n = nn_plot(j);  % Número de términos de la serie
    s = zeros(1, length(XX));  % Inicializar la serie de Fourier
    
    % Cálculo de los coeficientes de Fourier
    for k = 1:n
        % Aproximación de la integral usando la regla del trapecio
        w = ones(size(u));  
        w(1) = 1/2; w(end) = 1/2; 
        
        % Producto f(x) * sin(k*pi*x)
        integrand = f(u) .* sin(k * pi * u);  
        ak = 2 * trapz(u, integrand .* w);  % Coeficiente de Fourier a_k
        
        % Sumar el término de la serie
        s = s + ak * sin(k * pi * XX);
    end
    
    % Crear subgráficas para cada n
    subplot(3, 1, j)
    hold on; grid on;
    plot(XX, fext(XX), 'k', 'LineWidth', 2)  % Función extendida en negro
    plot(XX, s, colors(j), 'LineWidth', 2)   % Serie de Fourier aproximada
    title(['Aproximación de Fourier con n = ', num2str(n)], 'FontSize', 16)
    
    % Leyenda
    legend('Extensión impar de f(x)', 'Serie de Fourier de f(x)', 'Location', 'southeast', 'FontSize', 10)
    xlabel('x', 'FontSize', 14)
    ylabel('f(x) y Serie de Fourier', 'FontSize', 14)
end

% Inicializar vectores para almacenar los errores
errors_L2 = zeros(1, length(nn_error));
errors_inf = zeros(1, length(nn_error));

% Crear figura para los errores
figure('Position', [100, 100, 800, 600])  

% Calcular errores para cada n en nn_error
for j = 1:length(nn_error)
    n = nn_error(j);  
    s = zeros(1, length(XX));  
    
    % Cálculo de la serie de Fourier
    for k = 1:n
        w = ones(size(u));  
        w(1) = 1/2; w(end) = 1/2;  
        
        % Producto f(x) * sin(k*pi*x)
        integrand = f(u) .* sin(k * pi * u);  
        ak = 2 * trapz(u, integrand .* w);  
        
        % Sumar el término de la serie
        s = s + ak * sin(k * pi * XX);
    end
    
    % Calcular errores
    errors_L2(j) = sqrt(trapz(XX, (fext(XX) - s).^2));  
    errors_inf(j) = max(abs(fext(XX) - s));  
end

% Graficar errores
subplot(2, 1, 1)
plot(nn_error, errors_L2, 'bo-', 'LineWidth', 2)
title('Error L2 en función de n', 'FontSize', 16)
xlabel('Número de términos n', 'FontSize', 14)
ylabel('Error L2', 'FontSize', 14)
grid on

subplot(2, 1, 2)
plot(nn_error, errors_inf, 'ro-', 'LineWidth', 2)
title('Error uniforme en función de n', 'FontSize', 16)
xlabel('Número de términos n', 'FontSize', 14)
ylabel('Error uniforme', 'FontSize', 14)
grid on


También hemos calculado el error en norma \( L^2 \) y en norma uniforme para distintas \( n \) y así hacernos una idea de la función que siguen los errores de este método en función de \( n \).

Hemos estimado que siguen la función \( e^{-\alpha n} \), con \( \alpha > 1 \).

2 Base trigonométrica compleja

Se puede definir el conjunto de funciones que toman valores complejos y cuyo modulo al cuadrado es integrable.

[math] L^2( \Omega ) = \left\{ f: \mathbb{R} \to \mathbb{C} \ : \ \int_{\Omega} \left| f(x) \right|^2 \, dx \lt \infty \right\} [/math].

Este conjunto tiene estructura de espacio vectorial y admite un producto escalar [math] \bigl \langle f, g \bigr \rangle_{\Omega} = \int_{\Omega} f(z) \overline{g(z)} \, dx [/math] dotándole de una estructura de espacio de Hilbert.

En esta sección, se desarrollará una serie de Fourier para aproximar la función

[math] f(x) = 4x \left( \frac{1}{2} - x \right)^2 + ix [/math],

que toma valores complejos, definida en el intervalo [math] [0,1] [/math].

El objetivo es expresar la función como combinación lineal de elementos de una base del espacio, en particular, la base trigonométrica. Esta base para [math] L^2([-\pi,\pi]) [/math] es

[math] B_{L^2([-\pi,\pi])} = \left\{\frac{1}{\sqrt{2\pi}}e^{ikx}\right\}_{k \in \mathbb{Z}} [/math].

Aplicando el cambio de variable

[math] x = \frac{\log \left(\sqrt{\frac{2\pi}{b-a}} \right)}{ik} + \frac{2\pi}{b-a}(y-a) [/math],

trasladamos la base al intervalo [math] \left[a,b\right] [/math]:

[math] B_{L^2([a,b])} = \left\{\frac{1}{\sqrt{b-a}}e^{ik\frac{2\pi}{b-a}(y-a)}\right\}_{k \in \mathbb{Z}} [/math]

En efecto, es base, ya que

  • [math] \bigl \langle \frac{1}{\sqrt{b-a}}e^{ik\frac{2\pi}{b-a}(x-a)}, \frac{1}{\sqrt{b-a}}e^{ik\frac{2\pi}{b-a}(x-a)} \bigr \rangle_{L^2([a,b])} = \int_{a}^{b} \frac{1}{\sqrt{b-a}}e^{ik\frac{2\pi}{b-a}(x-a)} \frac{1}{\sqrt{b-a}}e^{-ik\frac{2\pi}{b-a}(x-a)} \, dx = \frac{1}{b-a}\int_{a}^{b} \, dx = 1 [/math]
  • [math] \bigl \langle \frac{1}{\sqrt{b-a}}e^{ik\frac{2\pi}{b-a}(x-a)}, \frac{1}{\sqrt{b-a}}e^{ih\frac{2\pi}{b-a}(x-a)} \bigr \rangle_{L^2([a,b])} = \int_{a}^{b} \frac{1}{\sqrt{b-a}}e^{ik\frac{2\pi}{b-a}(x-a)} \frac{1}{\sqrt{b-a}}e^{-ih\frac{2\pi}{b-a}(x-a)} \, dx = \frac{1}{b-a}\int_{a}^{b} e^{i(k-h)\frac{2\pi}{b-a}(x-a)} \, dx = \frac{1}{i(k-h)2\pi} \left( 1 - 1 \right) \, dx = 0 [/math]

Escogiendo el intervalo [math] \left[ 0,1 \right] [/math], se tiene que la base trigonométrica compleja de [math] L^2([0,1]) [/math] es

[math] B_{L^2([0,1])} = \left\{e^{2\pi ikx}\right\}_{k \in \mathbb{Z}} [/math],

y será la que se usará para desarrollar la serie de Fourier.

Los coeficientes de la serie se calculan de la siguiente manera:

  • [math] z_k = \bigl \langle f, e^{2\pi ikx} \bigr \rangle_{L^2([0,1])} = \int_{0}^{1} f(x) \cdot e^{-2\pi ikx} \, dx, \quad \forall k \in \mathbb{Z} [/math]

Por lo tanto, la serie de Fourier queda expresada únicamente en términos de exponenciales complejas:

[math] f(x) \sim \sum^{+\infty}_{k=-\infty} z_k \cdot e^{2\pi ikx} [/math]

Serie de Fourier compleja de [math] f(x) [/math]. Parte real.
Serie de Fourier compleja de [math] f(x) [/math]. Parte imaginaria.
import numpy as np
import matplotlib.pyplot as plt
from scipy.integrate import quad

# Definir la función a aproximar

def f(x):
    return 4*x*(0.5 - x)**2 + 1j*x

# Calcular coeficientes de Fourier en la base {e^(i 2πnx)}

def fourier_coefficient(n):
    
    integrand = lambda x: f(x) * np.exp(-1j * 2 * np.pi * n * x)
    
    real_part, _ = quad(lambda x: integrand(x).real, 0, 1)
    imag_part, _ = quad(lambda x: integrand(x).imag, 0, 1)

    return real_part + 1j * imag_part  # Devolver coeficiente complejo

# Aproximar la función con los primeros N términos

def fourier_approx_real(x, N):
    S_N = sum(fourier_coefficient(n) * np.exp(1j * 2 * np.pi * n * x) for n in range(-N, N+1))
    return S_N.real  # Tomamos la parte real de la serie de Fourier

def fourier_approx_imag(x, N):
    S_N = sum(fourier_coefficient(n) * np.exp(1j * 2 * np.pi * n * x) for n in range(-N, N+1))
    return S_N.imag  # Tomamos la parte imaginaria de la serie de Fourier

# Valores de x para la gráfica

x_vals = np.linspace(0, 1, 500)
f_real_vals = np.array([f(x).real for x in x_vals])
f_imag_vals = np.array([f(x).imag for x in x_vals])

# Aproximaciones con distintos N

N_values = [5, 10, 20]

# Parte Real

plt.figure(figsize=(10, 6))
plt.plot(x_vals, f_real_vals, label='Función Original', linewidth=2, color='black')

for N in N_values:
    approx_vals = np.array([fourier_approx_real(x, N) for x in x_vals])
    plt.plot(x_vals, approx_vals, label=f'Aproximación con {N} términos')

plt.xlabel('x')
plt.ylabel('Re f(x)')
plt.title('Aproximación de Fourier de f(x) - Parte real')
plt.legend()
plt.grid()
plt.show()

# Parte Imaginaria

plt.figure(figsize=(10, 6))
plt.plot(x_vals, f_imag_vals, label='Función Original', linewidth=2, color='black')

for N in N_values:
    approx_vals = np.array([fourier_approx_imag(x, N) for x in x_vals])
    plt.plot(x_vals, approx_vals, label=f'Aproximación con {N} términos')

plt.xlabel('x')
plt.ylabel('Im f(x)')
plt.title('Aproximación de Fourier de f(x) - Parte imaginaria')
plt.legend()
plt.grid()
plt.show()

3 Bibliografía