Series de Fourier. Yan, Otelo, Miguel
A lo largo de este artículo trataremos de entender la aproximación de funciones por series trigonométricas, más concretamente, por Series de Fourier. Para ello aproximaremos varias funciones con diferentes propiedades, para así llegar a comprender mejor como funcionan estas aproximaciones.
1 Series de Fourier
No tendría sentido intentar entender la aproximación de funciones por series trigonométricas, sin si quiera saber que son estás series. Así, comenzamos con una breve explicación teórica de las Series de Fourier.
Tomamos el espacio de Hilbert [math] L^2([-\pi,\pi]) [/math], con producto escalar asociado [math] \langle f,g \rangle _{L^2} = \int_{-\pi}^{\pi} f \cdot g \hspace{5px} dx [/math], norma asociada a dicho producto escalar [math] || f ||_{L^2} = \sqrt{\langle f,g \rangle _{L^2}} [/math] y la base ortogonal [math] \{\frac{1}{2},cos(nx),sen(nx)\}_{n\in \mathbb{N}} [/math] compuesta por funciones [math] 2\pi [/math] periódicas (omitiremos la comprobación de que la base es ortogonal y de que el espacio es de Hilbert). Por ser un sistema ortogonal, podemos aproximar cualquier función [math] f(x) \in L^2([-\pi,\pi]) [/math] mediante la serie
donde los coeficientes [math] a_0, a_n [/math] y [math] b_n [/math] reciben el nombre de Coeficientes de Fourier y vienen dados (por ser la base antes mencionada una base ortognal) por las expresiones
Para finalizar con esta introducción teórica, veamos rápidamente como cambian los elementos de nuestra base trigonométrica dependiendo del intervalo de definición de las funciones de [math] L^2 [/math]. Si el intervalo es la forma [math] [-T,T] [/math], nótese que mediante el cambio de variable [math] y=\frac{xT}{\pi} [/math] en la base anterior obtenemos [math] \{\frac{1}{2},cos(\frac{ny\pi}{T}),sen(\frac{ny\pi}{T})\}_{n\in \mathbb{N}} [/math], siendo esta una base ortogonal de [math] L^2([-T,T]) [/math].
Esta idea se puede generalizar a intervalos de la forma [math] [a,b] [/math] para cualesquiera [math] a [/math] y [math] b [/math] reales. Bastaría tomar la base trigonométrica del espacio [math] L^2([-\frac{b-a}{2},\frac{b-a}{2}]) [/math] , puesto que este intervalo tiene la misma longitud que [math] [a,b] [/math], y los elementos de dicha base son funciones periódicas cuyo periodo es precisamente la longitud [math] b-a [/math].
2 La base trigonométrica
Antes de comenzar con la aproximación de funciones, lo primero que haremos será dibujar los diez primeros términos de nuestra base trigonométrica, [math] \{\frac{1}{2},cos(nx\pi),sen(nx\pi)\}_{n\in \mathbb{N}} [/math] , con el fin de hacernos una idea de la forma geométrica de los elementos de nuestra base. Para dibujarlos utilizamos el siguiente código de matlab:
x = linspace(-1, 1, 1000); % Generar valores de x en el intervalo [-1, 1]
n = 1:10; % Números de términos
% Graficar los términos en una sola imagen con subgráficas
figure;
for i = 1:length(n)
subplot(5, 2, i); % Crear una subgráfica
plot(x, 1/2*ones(size(x)), 'r--', x, cos(n(i)*pi*x), 'g', x, sin(n(i)*pi*x), 'b'); % Graficar los términos
title(['Términos para n = ', num2str(n(i))]); % Título de la subgráfica
xlabel('x'); % Etiqueta del eje x
ylabel(['y_', num2str(n(i))]); % Etiqueta del eje y
legend({'1/2', ['cos(', num2str(n(i)), '\pi x)'], ['sin(', num2str(n(i)), '\pi x)']}); % Leyenda
end
3 Aproximación de función continua
Una vez representados algunos de los términos de nuestra base, usaremos estos para aproximar mediante una serie la función [math] f(x)=x(1-x) [/math] en el intervalo [math] [0,1] [/math]. Para facilitarnos la tarea, primero extenderemos de forma impar la función [math] f(x) [/math] al intervalo [math] [-1,1] [/math]. Nótese que los elementos de la forma [math]\frac{1}{2} [/math] y [math] cos(nx\pi) [/math] son impares, y por la definición antes explicada de los coeficientes de Fourier se tiene que en el dominio [math] [-1,1] [/math] dichos coeficientes serán nulos, por lo que la serie estará formada únicamente por términos de la forma [math] b_{n}sen(nx\pi) [/math].
% Definir la función
f = @(x) x.*(1-x);
% Definir el intervalo
x = linspace(0, 1, 100); % Generar 100 puntos entre 0 y 1
x2 = linspace(-1, 0, 100);
% Evaluar la función en los puntos del intervalo
y = f(x);
y1=-f(x);
% Graficar la función
hold on
plot(x2, y1, 'b', 'LineWidth', 2);
plot(x,y,'b','LineWidth', 2)
xlabel('x');
ylabel('Extensión impar def(x) ');
title('Gráfico de f(x) = x(1-x) extendida');
grid on;
Una vez aclarado el por qué de la extensión impar, utilizamos el método del trapecio para calcular numéricamente los coeficientes de Fourier y representamos gráficamente tanto la función [math] f(x) [/math] como las aproximaciones [math] f_{1}(x), f_{5}(x) [/math] y [math] f_{10}(x) [/math]. Además, calculamos el error en las normas [math] L^2 [/math] y uniforme en función del número [math] n [/math] de términos de la serie, y graficamos también los errores obtenidos.
Todo esto queda escrito en el siguiente código de Matlab:
f1 = @(x)(1-x).*x;
coeficientes = zeros(1, 10);
N=1000;
a=0; b=1;
h=(b-a)/(N-1);
u=a:h:b;
w=ones(N,1);
w(1)=1/2; w(N)=1/2;
for k = 1:10
f=(f1(u).*sin(k.*pi.*u))';
coeficientes(1,k) = h*w'*f;
end
coeficientes = 2*coeficientes;
y = zeros(10,1000);
y(1,:) = coeficientes(1,1).*sin(pi*u);
for k = 2:10
y(k,:) = y(k-1,:) + coeficientes(1,k).*sin(k*pi*u);
end
figure(1)
hold on
plot(u,f1(u), "black")
plot(u,y(1,:), "g")
plot(u,y(5,:), "blue")
plot(u,y(10,:), 'red')
hold off
title("Aproximación de f por series de Fourier")
legend("f(x) =(1-x)x", "n =1", "n=5", "n=10")
m = 10;
errores_L2 = zeros(1,m); errores_uniforme = zeros(1,m);
for n=1:m
integrando = (abs(f1(u)-y(n,:))).^2;
g = integrando';
int = h*w'*g;
errores_L2(1,n) = sqrt(int);
errores_uniforme(1,n) = max(abs(f1(u)-y(n,:)));
end
figure(2)
hold on
v = 1:1:m;
plot(v,errores_L2)
plot(v,errores_uniforme)
hold off
title("Gráfica de errores")
legend("error en norma L^2", "error en norma uniforme")