Diferencia entre revisiones de «ANLAAG»

De MateWiki
Saltar a: navegación, buscar
(Aproximación de funciones continuas)
(Aproximación de funciones continuas)
Línea 59: Línea 59:
  
 
== Aproximación de funciones continuas ==
 
== 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.
+
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 par o impar. En el primer caso, la aproximación simplemente se realiza utilzando los elementos de la base del coseno y el
+
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.
  
Consideremos, por ejemplo, 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.  
+
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.  
  
CODIGO
+
{{matlab|codigo=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,
 
Luego, la función que aproximará f(x) tiene la forma,
  
Línea 72: Línea 143:
  
 
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.  
 +
[[Archivo:Apartado21.jpg|miniaturadeimagen|centro]]
  
GRÁFICAS?? CÓDIGO?
+
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.
 +
 
 +
{{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.  
  
[[Archivo:Apartado21.jpg|miniaturadeimagen]]
+
[[Archivo:Apartado22.jpg|miniaturadeimagen|centro]]
[[Archivo:Apartado22.jpg|miniaturadeimagen]]
+
 
CÓDIGO
+
{{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')
 +
}}

Revisión del 18:53 14 feb 2024

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 1/2
Elemento de la base del coseno
Elemento de la base del seno
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

% 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

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

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