Diferencia entre revisiones de «ANLAAG»
(→Aproximación de funciones discontinuas) |
(→Teorema) |
||
| Línea 253: | Línea 253: | ||
Consideremos la función discontinua <math>f(x) = 1_{x\leq \frac{1}{2}}(x)</math> | Consideremos la función discontinua <math>f(x) = 1_{x\leq \frac{1}{2}}(x)</math> | ||
| − | + | [[Archivo:Figu1.jpg|miniaturadeimagen|centro]] | |
hagamos su extensión al intervalo <math> [-1,1]</math>. Primero observamos ejecutando las siguientes líneas de código que esta función se extiende de forma par. | hagamos su extensión al intervalo <math> [-1,1]</math>. Primero observamos ejecutando las siguientes líneas de código que esta función se extiende de forma par. | ||
Revisión del 19:55 14 feb 2024
Contenido
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:
Además, los coeficientes de Fourier se obtienen de la siguiente manera.
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.
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,
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 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.
% 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')
4 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 [math][-\pi,\pi][/math] 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.
4.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]. TAL VEZ PODEMOS ARGUMENTAR AQUÍ QUE PODEMOS APLICAR ESTE TEOREMA A NUESTRO CASO POR UN CAMBIO DE INTERVALO??
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 ejecutando las siguientes líneas de código que esta función se extiende de forma par.
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;
% Definimos nuestra función f:
f1=zeros(length(x),1);
for i=1:length(x)
if x(i)<=1/2
f1(i)=1;
else
f1(i)=0;
end
end
% Extensión 'par':
xx=c:0.001:a; % Intervalo de extensión
f2=zeros(length(xx),1);
for i=1:length(xx)
if xx(i)>=-1/2
f2(i)=1;
else
f2(i)=0;
end
end
% Otra forma de definir la función característica, usando funciones de
% matlab:
% Definir la función discontinua original
f = @(x) double(x >= 0 & x <= 1/2);
% Definir la extensión par de la función a [-1, 1]
%%%f_par = @(x) double(abs(mod(-x, 2)) <= 1/2);
f_par=@(x)double(x <= 0 & x >= -1/2);
%%% Representación gráfica de la función característica:
hold on
plot(x,f1,'b.')
plot(xx,f2,'b.')
hold off
legend('f(x)')
xlim([-1,1])
ylim([-0.5,1.5])
axis square
%%% Repetición del ejercicio anterior:
% Valores de n almacenados en una lista:
n_valores=1:1:100;
% Funciones a integrar (coeficientes de Fourier):
f_sin_1=@(x,k) double(x >= 0 & x <= 1/2).*sin(k*pi*x);
f_sin_2=@(x,k) double(x <= 0 & x >= -1/2).*sin(k*pi*x);
f_cos_1=@(x,k) double(x >= 0 & x <= 1/2).*cos(k*pi*x);
f_cos_2=@(x,k) double(x <= 0 & x >= -1/2).*cos(k*pi*x);
f_medio_1=@(x,k) double(x >= 0 & x <= 1/2).*1/2;
f_medio_2=@(x,k) double(x <= 0 & x >= -1/2).*1/2;
% Cálculo de los coeficientes de Fourier:
% Inicializamos una matriz de 0 para almacenar los valores de ak
% (coeficientes asociados al seno):
ak=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,k);
y_medio_2=f_medio_2(xx,k);
ak(k,n)=trapz(x,y_sin_1)+trapz(xx,y_sin_2);
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('bk (coeficientes asociados al coseno)')
% disp(bk)
% disp('ck (coeficientes asociados a 1/2)')
% disp(ck)
Entonces la función [math]f_n[/math] que aproximará a [math]f[/math] tiene la forma
Si dibujamos [math]f[/math] y [math]f_n[/math] aparecen en las discontinuidades de salto oscilaciones las cuales se conocen como el fenómeno de Gibbs. Aún que se aumente mucho el valor de n estas oscilaciones no desaparecen y pueden producir errores significativos a la hora de aproximar la función original. Para mitigar este efecto se pueden introducir las sumas de Cesàro,
Veamos que, en efecto, el error disminuye según aumenta la N.
Gráficamente, vemos como según aumenta N, la serie de Fourier ayudada por la sumas de Cesàro se aproximan cada vez mejor a [math]f[/math]
5 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Í