Series de Fourier. Yan, Otelo, Miguel

De MateWiki
Saltar a: navegación, buscar

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] 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

[math] f(x)∼ \frac{a_0}{2} + \sum_{n=1}^{N} [a_nsen(nx) + b_nsen(nx)] [/math]

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

[math] a_0=\frac{\langle f , 1/2 \rangle _{L^2}}{|| sen(nx)||^{2}_{L^2}} \hspace{30px} [/math]

2 La base trigonométrica

Diez primeros términos de 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

Extensión impar de la función f(x)=x(1-x)

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;


Representación gráfica de [math] f(x) [/math] y de las aproximaciones [math] f_{1}(x), f_{5}(x) [/math] y [math] f_{10}(x) [/math]
Errores en las normas [math] L^2 [/math] y uniforme en función de [math] n [/math]

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;                         %Number of points
a=0; b=1;                     %Extremes of the interval
h=(b-a)/(N-1);
u=a:h:b;                       %coordinates of the partition
 w=ones(N,1);                 %weights vector
w(1)=1/2; w(N)=1/2;

for k = 1:10 
    f=(f1(u).*sin(k.*pi.*u))';                 %function
    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