ANLAAG

De MateWiki
Revisión del 19:11 14 feb 2024 de Aitana Guill Beltrán (Discusión | contribuciones) (Bases trigonométricas)

Saltar a: navegación, buscar

1 Introducción

Fue entre 1807 y 1811, mientras llevaba a cabo un estudio sobre la ecuación del calor, cuando el matemático francés Jean-Baptiste Joseph Fourier publicó el primer estudio sobre la serie que recibe su nombre, la serie de Fourier.

Una serie de Fourier consiste en una serie infinita y convergente puntualmente a una función continua y periódica. La gran importancia de esta radica en su increíble eficacia para aproximar funciones, pues fue el matemático quien llegó a la conclusión de que cualquier función periódica e integrable de Riemann en el intervalo [-T,T] puede escribirse como suma infinita de funciones trigonométricas. De esta manera, se da lugar a la siguiente expresión que representa la serie, donde [math] a_0,a_n, b_n \in \mathbb{R} [/math] se conocen como coeficientes de Fourier:

[math] f(x) = \frac{a_0}{2}+ \sum_{n=1}^\infty[ a_n \cos(\frac{n \pi x}{T}) +b_n\sin(\frac{n \pi x}{T})] [/math]


Además, los coeficientes de Fourier se obtienen de la siguiente manera.


FALTA EL CÁLCULO DE COEFICIENTES

2 Bases trigonométricas

Tal y como se ha observado con anterioridad cualquier función periódica e integrable de Riemann en el intervalo [-T,T] puede escribirse como suma infinita de funciones trigonométricas. El primer paso para comprender este concepto es definir la base ortogonal que permite mediante combinaciones lineales de los coeficientes de Fourier aproximar cualquier función. Esta base se encuentra en el espacio de Hilbert [math]L^2([-T,T])[/math] y viene dada por [math]\{ \frac{1}{2},\cos(\frac{n \pi x}{T}),\sin(\frac{n \pi x}{T})\}_{n \in \mathbb{N}}[/math].

Para comprender de manera óptima este concepto se presenta a continuación gráficamente los diez primeros términos de dicha base en el intervalo [-1,1]. Para obtener dicha representación, se ha utilizado el código que aparece posteriormente. Analíticamente, simplemente se debe sustituir la expresión de la base anterior para T=1.

Elemento de la base del coseno
clear
close all
n=10;
x=-1:0.001:1;  %Intervalo de x [-1,1]
f=@(x,n)cos(n*pi*x);
g=@(x,n)sin(n*pi*x);
y=1/2*ones(size(x));

% Representación del coseno
figure(1)
for i=1:n
    subplot(2,5,i)
    plot(x,f(x,i))
    axis square
    title(['n = ' num2str(i)])
end

Elemento de la base del seno

% Representación del seno
figure(2)
for i=1:n
    subplot(2,5,i)
    plot(x,g(x,i))
    axis square
    title(['n = ' num2str(i)])
end

Elemento de la base 1/2

% Representación de 1/2
figure(3)
axis square
plot(x,y)


Como se puede observar en las últimas dos, el valor de n es inversamente proporcional al periodo. Esto permite aproximarnos a la conclusión que posteriormente se enunciará de que cuanto mayor sea el valor de la n mejor aproximación de la función se obtendrá.

3 Aproximación de funciones continuas

Tal y como se ha enunciado anteriormente, la gran importancia de las series de Fourier radica en su increíble eficacia para aproximar funciones periódicas. A su vez, se va a realizar un análisis de como extender funciones continuas en el intervalo [0, T] al intervalo [-T, T] y que estas sigan siendo continuas. De esta manera solo se utilizaría para su aproximación las funciones pares o impares de las bases.

En primer lugar se debe diferenciar que ocurre cuando la extensión es impar o par. En el primer caso, la aproximación simplemente se realiza utilizando los elementos de la base del seno, con sus respectivos coeficientes de Fourier, pues los del coseno y [math]\ \frac{1}{2}[/math] se anulan.

A continuación, veremos un ejemplo sobre ello. Consideremos la función a aproximar [math] f(x) = x(1-x) [/math] en el intervalo [0,1]. Esta función se aproxima por extensión impar, en efecto, ejecutando las siguientes líneas de código vemos como los coeficientes pares son nulos. Cabe mencionar que los coeficientes de Fourier no se han calculado por integración, sino que se han aproximado utilizando la fórmula del trapecio.

clear
close all
format long
% Límites de integración:
a=0;
b=1;
c=-1;
% División de los puntos del intervalo:
tolerancia= 1e-3;
% Intervalo
x=a:0.001:b;
xx=c:0.001:a;
% Valores de n almacenados en una lista:
n_valores=1:1:100;

% Funciones a integrar:
    % f:
f_cos_1=@(x,k)x.*(1-x).*cos(k*pi*x);
f_sin_1=@(x,k)x.*(1-x).*sin(k*pi*x);
f_medio_1=@(x,k)x.*(1-x).*1/2;
    % Extensión de f:
f_cos_2=@(x,k)x.*(1+x).*cos(k*pi*x);
f_sin_2=@(x,k)x.*(1+x).*sin(k*pi*x);
f_medio_2=@(x,k)x.*(1+x).*1/2;
% Función a aproximar:
g=@(x)x.*(1-x);
g_impar=@(x)x.*(1+x);
% Inicializamos una matriz de 0 para almacenar los valores de ak
% (coeficientes asociados al seno): 
ak=zeros(n_valores(end),length(n_valores));
aak=zeros(n_valores(end),length(n_valores));
% Inicializamos una matriz de 0 para almacenar los valores de bk
% (coeficientes asociados al coseno): 
bk=zeros(n_valores(end), length(n_valores));
% Inicializamos una matriz de 0 para almacenar los valores de ck
% (coeficientes asociados a 1/2): 
ck=zeros(n_valores(end), length(n_valores));

for n=1:length(n_valores)
    %Calculamos ak, bk y ck para cada uno de los valores de n:
    for k=1:n_valores(n)
            % Vector con los valores de f_sin:
            y_sin_1=f_sin_1(x,k);
            y_sin_2=f_sin_2(xx,k);
            
            % Vector con los valores de f_cos:
            y_cos_1=f_cos_1(x,k);
            y_cos_2=f_cos_2(xx,k);
            
            % Vector con los valores de f_sin:
            y_medio_1=f_medio_1(x);
            y_medio_2=f_medio_2(xx);

        ak(k,n)=trapz(x,y_sin_1)+trapz(xx,y_sin_2);
        aak(k,n)=2*trapz(x,y_sin_1);
        bk(k,n)=trapz(x,y_cos_1)+trapz(xx,y_cos_2);
        ck(k,n)=trapz(x,y_medio_1)+trapz(xx,y_medio_2);
    end
end

% Visualización de resultados: 
    % (Nota: las columnas guardan los valores para n= 1, 5, 10
    % respectivamente y las filas los coeficientes ak, bk, ck siendo k la
    % fila.)
% disp('ak (coeficientes asociados al seno)')
% disp(ak)
% disp('aak (coeficientes asociados al seno (simetría))')
% disp(aak)
% disp('bk (coeficientes asociados al coseno)')
% disp(bk)
% disp('ck (coeficientes asociados a 1/2)')
% disp(ck)

Luego, la función que aproximará f(x) tiene la forma,

[math] f(x) = \sum_{k=1}^n[ b_k \sin(k \pi x)[/math] donde [math] b_k = 2 \int_{0}^{1} f(x)sin(k \pi x) [/math]

En las siguientes gráficas apreciamos como según crece n, [math] f_n(x)[/math] se va acercando más a la función original f(x). En concreto se muestran los casos para n = 1, 5 y 10.

centro

En el caso de que la extensión sea par la función se aproxima utilizando los elementos del coseno y el [math]\ \frac{1}{2}[/math] con sus respectivos coeficientes de Fourier, pues los del seno se anulan.

% Definimos la función fn 

    % Nota: como hemos comprobado previamente, tenemos que fn se puede
    % aproximar con los coeficientes de Fourier asociados a las funciones
    % impares de la base trigonométrica, además aplicando simetrías.

for i = 1:length(n_valores)
    % Definir función anónima con el nombre adecuado
    suma=@(x) 0;
    for j=1:i
        suma=@(x) suma(x) + ak(j,i)*sin(j*pi*x);
    end
    eval(['fn_' num2str(i) '=@(x) suma(x);']);
end

% Representación gráfica de fn:
figure
subplot(3,1,1)
hold on
plot(x,g(x),'b')
plot(x,fn_1(x),'r--')
plot(xx,g_impar(xx),'b')
plot(xx,fn_1(xx),'r--')
legend('f(x)','fn(x)')
title('n = 1')
hold off
% Para n=5:
ak_5=zeros(5,1);
for i=1:5
    ak_5(i)=aak(i,2);
end
subplot(3,1,2)
hold on
plot(x,g(x),'b')
plot(x,fn_5(x),'r--')
plot(xx,g_impar(xx),'b')
plot(xx,fn_5(xx),'r--')
legend('f(x)','fn(x)')
title('n = 5')
hold off
% Para n=10:
subplot(3,1,3)
hold on
plot(x,g(x),'b')
plot(x,fn_10(x),'r--')
plot(xx,g_impar(xx),'b')
plot(xx,fn_10(xx),'r--')
legend('f(x)','fn(x)')
title('n = 10')
hold off


Esto también se puede ver claramente si calculamos el error que se comete entre f(x) y [math] f_n(x)[/math] para cada n. Se muestran dos gráficas donde se representan los errores para n = 1, 5 y 10 con las normas L^2 y uniforme.

centro
% Cálculo de Errores:
    % Error en la norma L2 
     error_L2=zeros(1,length(n_valores));

    for n=1:length(n_valores)
        % Crear la función de diferencia f_n(x)
        eval(['f_dif_' num2str(n) ' = @(x) abs(g(x) - fn_' num2str(n) '(x));']);
        
        % Calcular y_dif_n
        eval(['y_dif_' num2str(n) ' = sqrt(f_dif_' num2str(n) '(x));']);
        
        % Calcular el error L2 y almacenarlo en el arreglo error_L2
        eval(['error_L2(' num2str(n) ') = sqrt(trapz(x, y_dif_' num2str(n) '));']);
    end
    % Error en la norma uniforme
    error_uniforme=zeros(1,length(n_valores));
     for i=1:length(n_valores)
        eval(['yy_dif_' num2str(i) ' = f_dif_' num2str(i) '(x);']);
        eval(['error_uniforme(' num2str(i) ')= max( yy_dif_' num2str(i) ');']);
     end
        
% Graficamos los errores:
figure
subplot(2,1,1)
plot(n_valores,error_L2,'b-')
xlabel('n')
ylabel('Error')
title('Error en la norma L^2')
subplot(2,1,2)
plot(n_valores,error_uniforme,'r-')
xlabel('n')
ylabel('Error')
title('Error en la norma uniforme')