Diferencia entre revisiones de «Bases de Fourier»

De MateWiki
Saltar a: navegación, buscar
(Aproximación de funciones continuas)
(Aproximación de funciones continuas)
Línea 89: Línea 89:
 
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.  
 
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.  
  
GRÁFICAS?? CÓDIGO?
+
ADJUNTAR GRÁFICAS  
 +
{{matlab|codigo=% 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.  
 
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.  
  
GRÁFICAS/CÓDIGO
+
ADJUNTAR GRÁFICAS  
 +
{{matlab|codigo= % 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')
 +
}}
  
 
== Aproximación de funciones discontinuas ==
 
== Aproximación de funciones discontinuas ==

Revisión del 18:38 14 feb 2024

1 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 continúen 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.

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.


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[ a_k \sin(k \pi x)[/math] donde [math] a_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.

ADJUNTAR GRÁFICAS

% 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.

ADJUNTAR GRÁFICAS

% 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')


2 Aproximación de funciones discontinuas

Como se ha mencionado anteriormente las series de Fourier convergen a una función continua. Sin embargo, ¿cómo hacemos para aproximar funciones no estrictamente continuas?. Esta cuestión se resuelve teniendo en cuenta la condición de Dirichlet. Esta indica el intervalo [-pi,pi] se puede dividir en un conjunto de subintervalos finitos en los cuales la función es monótona, si la función es continua salvo en un número finito de puntos con discontinuidad de salto finito.

Nos apoyaremos entonces en el siguiente teorema.

2.1 Teorema

Si [math] f \in L^2 ([-\pi,\pi]) [/math] y verifica la condición de Dirichlet entonces la serie de Fourier converge puntualmente en los puntos de continuidad. Es decir:

  • Si [math] x_0 [/math] es un punto de continuidad entonces, [math] f(x_0)=lim_{n\to\infty}\{\frac{a_0}{2}+ \sum_{n=1}^\infty[ a_n \sin(n \pi x) +b_n \cos(n\pi x)]\} [/math] .
  • Si [math] x_0 [/math] es un punto de discontinuidad entonces la serie converge en [math] x_0 [/math] a [math] \frac{f(x_0^-) + f(x_0^+)}{2} [/math]

En [math]-\pi[/math] y [math]\pi[/math] la serie converge a [math] \frac{f(\pi) + f(-\pi)}{2} [/math].

Consideremos la función discontinua [math]f(x) = 1_{x\leq \frac{1}{2}}(x)[/math] hagamos su extensión al intervalo [math] [-1,1][/math]. Primero observamos que esta función se extiende de forma par.

CÓDIGO CON LOS COEFICIENTES IMPARES 0.

El coeficiente impar [math]b_n[/math] es nulo. Si dibujamos [math]f(x)[/math] y [math]f_n(x)[/math] podemos apreciar en las discontinuidades de salto oscilaciones las cuales se conoces como el fenómeno de Gibbs.

CÓDIGO + FOTO DE LA GRÁFICA NO PUEDO AVANZAR MÁS DE AQUÍ SIN LAS GRÁFICAS

3 Cambio de intervalo

Tal y como se ha expresado a lo largo del documento, podemos aproximar funciones en el intervalo compacto [math][-T,T][/math] pero, ¿qué ocurre con aquellos intervalos de la forma [math][a,b][/math]?. Debido a la periodicidad de las funciones que queremos aproximar, la serie de Fourier también se puede aproximar para intervalos de la forma [a, b] con la base [math]\{ \frac{1}{2},\cos(\frac{n \pi x}{T}),\sin(\frac{n \pi x}{T})\}_{n \in \mathbb{N}}[/math], donde tomamos como [math] T = b - \frac{a}{2}[/math].

Para comprender mejor dicho concepto, se propone aproximar la funicon [math]f(x)=x e^{-x}[/math] en el intervalo compacto [math][1,3][/math]. De esta manera obtenemos [math]T = 1[/math] y sustituimos en la base anterior generando la siguiente. A continuación se presentan tres bases con [math] n = 5, 10 [/math] y [math]20[/math] que aproximen dicha función. Como se observa, de nuevo se tiene que, cuanto mayor sea la [math]n[/math] mejor es la aproximación,

GRÁFICO + CÓDIGO

IGUAL NECESITAMOS COMENTAR MÁS COSAS AQUÍ