Diferencia entre revisiones de «Series de Fourier (equipo LUA)»
m |
m |
||
| Línea 371: | Línea 371: | ||
coefcos=[]; | coefcos=[]; | ||
for j=1:length(enes)-1 | for j=1:length(enes)-1 | ||
| − | |||
k=enes(j)+1; | k=enes(j)+1; | ||
X=f(t).*cos(k*pi*t); | X=f(t).*cos(k*pi*t); | ||
Revisión del 18:22 15 feb 2024
| Trabajo realizado por estudiantes | |
|---|---|
| Título | Series de Fourier. Grupo LUA |
| Asignatura | EDP |
| Curso | 2023-24 |
| Autores | Luis Carreras Hoyos, Lucía Gil Ruiz y Alejandra Hernández Sieber |
| Este artículo ha sido escrito por estudiantes como parte de su evaluación en la asignatura | |
Contenido
1 Introducción
Adentrarse en el fascinante mundo de las series de Fourier es embarcarse en un viaje que nos lleva a los inicios del siglo XIX, donde el matemático y físico francés Joseph Fourier dejó su marca en la historia de las ciencias. Aunque las series de Fourier tienen una inmensa presencia en los textos de análisis y cálculo modernos, su desarrollo y evolución a lo largo del tiempo nos ofrecen una perspectiva única sobre cómo las ideas matemáticas han moldeado nuestra comprensión del mundo que nos rodea.
Nacido en 1768 en Auxerre, Francia, Joseph Fourier fue un hombre de una gran inquietud intelectual. A lo largo de su vida, participó en la investigación de una amplia gama de campos, desde la ingeniería hasta la administración pública, pero fue en el ámbito de las matemáticas y la física donde dejó su huella más significante. El punto de inflexión llegó en 1807, cuando Fourier, trabajando como ingeniero en la campaña militar de Napoleón en Egipto, comenzó un estudio profundo sobre la conducción del calor. Este interés lo llevó a investigar las soluciones de la ecuación del calor, un problema fundamental en la física matemática. Fue durante este período cuando Fourier formuló su famosa conjetura, que más tarde se convertiría en el teorema de la convergencia de las series de Fourier.
Finalmente, en 1822, Fourier publicó su obra maestra: "Théorie analytique de la chaleur" (Teoría Analítica del Calor), donde presentó de manera sistemática su teoría sobre las series de Fourier y su aplicación en la resolución de problemas de conducción de calor. Este trabajo no solo marcó un hito en el desarrollo de la física matemática, sino que también sentó las bases para una nueva rama del análisis matemático: el análisis armónico.
2 Espacios de Hilbert
Para comprender ciertas propiedades y construcciones de las series de Fourier, es útil tener un cierto conocimiento previo sobre los espacios de Hilbert.
2.1 Definición: Espacio de Hilbert
Un espacio de Hilbert es un espacio vectorial equipado con un producto interno. Dado un espacio vectorial complejo [math] (H,+,\cdot \mathbb{C}) [/math] se define producto interior o producto escalar a toda aplicación [math] \langle , \rangle : H \times H \longrightarrow \mathbb{C} [/math], tal que
- [math] \langle x,y \rangle = \overline {\langle y,x \rangle }~~~ \forall x,y \in H[/math]
- [math] \langle \alpha x + \beta y, z \rangle = \alpha \langle x,z \rangle + \beta \langle y,z \rangle ~ \forall x,y,z \in H, ~ \forall \alpha, \beta \in \mathbb{C}[/math]
- [math] \langle x,x\rangle \geq 0 ~ \forall x \in H[/math]
- [math] \langle x,x\rangle = 0 [/math] si y solo sí [math] x = 0_{H} [/math].
Al espacio vectorial [math] (H,+,\cdot \mathbb{C}) [/math] dotado de un producto escalar [math] \langle , \rangle, [/math] se le llama espacio de Hilbert.
Hay que destacar que, un espacio de Hilbert es completo. Esto es, toda sucesión de Cauchy es convergente dentro del espacio.
2.2 Funciones cuadrado integrables
Las funciones cuadrado integrables son aquellas funciones para las cuales la integral del valor absoluto al cuadrado de la función es finita (en el dominio considerado [math] \Omega \subset \mathbb{R}^n [/math] abierto). Es decir,
Este conjunto de funciones forman un espacio de Hilbert cuando lo dotamos de un producto escalar. En relación a las series de Fourier, estamos interesados en el espacio de funciones cuadrado integrables en un intervalo. Definimos entonces el siguiente producto escalar:
Sea [math] \Omega \subset \mathbb{R}^N [/math] un abierto, entonces [math] \langle, \rangle_{l^2}: L^2 (\Omega, \mathbb{C}) \times L^2 (\Omega, \mathbb{C}) \longrightarrow \mathbb{C} [/math]
Este producto escalar cumple con las propiedades requeridas para ser un producto interno en un espacio de Hilbert.
3 Definición: Series de Fourier
En esencia, las series de Fourier permiten descomponer una función periódica en una serie infinita de senos y cosenos, en el caso real, o en términos de exponenciales complejas, en el caso complejo. Esta representación proporciona una manera elegante de analizar funciones a través de una descomposición mucho más sencilla.
Formalmente, una serie de Fourier es una serie infinita que converge puntualmente a una función periódica y continua. Las series de Fourier tienen la siguiente estructura:
donde [math]a_0[/math], [math]a_n[/math] y [math]b_n[/math] se denotan como los coeficientes de Fourier de la serie de Fourier de una función [math]f(t) \in L^2 (\left[-T,T\right])[/math].
En particular, si [math] f(t) [/math] es una función integrable Riemann de periodo [math] 2\pi [/math], la serie de Fourier correspondiente a [math] f(t) [/math] es:
donde los términos [math] a_0, a_n, b_n [/math] quedan determinados como:
3.1 Bases de Fourier
Una base de Fourier es un conjunto de funciones ortogonales que se utilizan para expresar otras funciones de manera aproximada mediante su serie de Fourier.
De nuevo, si consideramos el espacio [math] L^2 (\left[-\pi,\pi\right])[/math], el conjunto [math] \left\{ \frac{1}{2} \right\} \cup \left\{\cos \left( nx \right), \sin \left( nx \right) \right\}_{n \in \mathbb{N}} [/math] forman una base de las funciones de periodo [math] 2\pi [/math]. Las funciones de la base son [math] 2\pi [/math] - periódicas y ortogonales.
En caso general de tener un intervalo [math] [-T, T] [/math] , dicha base ortogonal se obtiene de aplicar el cambio de variable [math] y=x \cdot \frac{T}{\pi} [/math]. Como resultado, la base ortogonal obtenida en este caso será:
Por último, al ser una base formada por funciones periódicas, si trasladamos el intervalo [math] [-T, T] [/math] al intervalo [math] [a, b] [/math], como la longitud de ambos coincide, su base de Fourier asociada coincide con la de [math] [-T, T] [/math] mencionada previamente. Por lo tanto, para aproximar una función definida en un intervalo genérico, bastará trasladarlo hasta centrarlo en el origen y usar la base correspondiente según la longitud del mismo.
En este caso, los coeficientes de Fourier quedarían determinados de la manera siguiente:
Si dibujamos en una gráfica los [math] 10 [/math] primeros términos de la base trigonométrica [math] \left\{\frac{1}{2} \right\} \cup \left\{\cos \left( n \pi x \right), \sin \left( n \pi x \right) \right\}_{n \in \mathbb{N}} [/math] en el intervalo [math] x \in [-1,1] [/math] obtendríamos lo siguiente:
clear all
close all
colores=["#0072BD","#D95319","#EDB120","#7E2F8E","#77AC30","#4DBEEE","#A2142F","#FDEAE1","#B2E2F2","#E79EFF"];
t=linspace(-1,1,1000);
s=@(n,x) sin(n*pi*x);
c=@(n,x) cos(n*pi*x);
yline(1/2,'-.r')
lista=[]
lista=[lista 'f(x)=1/2']
hold on
for j=1:10
plot(t,s(j,t),'--','color',colores(j))
plot(t,c(j,t),'color',colores(j))
lista=[lista "f(x)=sin("+num2str(j)+"\pix)"];
lista=[lista "f(x)=cos("+num2str(j)+"\pix)"];
end
title('Base trigonométrica')
xlabel('Eje X')
ylabel('Eje Y')
legend(lista)
Como se puede observar fácilmente, las funciones obtenidas son periódicas y, a medida que aumenta el valor del parámetro [math] n [/math], estas tienen un periodo de oscilación menor pues dicho periodo es inversamente proporcional a [math] n [/math]. En concreto, el periodo de oscilación es [math] \frac{2}{n} [/math].
4 Aproximación de una función continua
Primero vamos a explorar como las series de Fourier proporcionan una aproximación más precisa de las funciones continuas en comparación con las funciones discontinuas. Para ello, vamos a comparar las aproximaciones analizando varios ejemplos.
Como función continua, vamos a aproximar [math] f(x)=x(1-x) [/math] en el intervalo [math] [0,1] [/math]. En primer lugar, podemos extender la función de forma impar a [-1,1], manteniéndose la continuidad de la función. Puesto que [math] f(x) \in L^2 (\left[-1,1\right])[/math], la base trigonométrica correspondiente es:
Al haber extendido [math] f(x) [/math] de forma impar, si tomamos las funciones pares de la base trigonométrica, el integrando del producto escalar de estas funciones con [math] f(x) [/math] resulta ser una función impar. Al integrar sobre un intervalo simétrico respecto al origen, la integral resultante será cero. Esto se debe a la cancelación de áreas positivas y negativas debido a la simetría de la función respecto al origen. Por ello, tanto el coeficiente de Fourier [math] a_0 [/math] como los coeficientes [math] a_n ~ \forall n \in \mathbb{N} [/math] son nulos.
A continuación, definiendo [math] f_n(x) [/math] como la suma de los primeros [math] n [/math] términos de la serie de Fourier, estas funciones quedarán únicamente determinadas por los elementos impar de la base. Es decir,
Haciendo uso de Matlab, representaremos las correspondientes [math] f_n(x) [/math] para [math] n=1,5,10 [/math]. Para ello, calcularemos las integrales de los coeficientes de Fourier usando la fórmula del trapecio como aproximación.
Para elaborar el código nos ayudamos de una función auxiliar llamada sumatorio que utilizaremos también en los siguientes apartados.
function [salida]=sumatorio(coeficiente0,coeficientescoseno,coeficientesseno)
salida=@(x) coeficiente0*1/2;
for k=1:length(coeficientesseno)
salida=@(x) salida(x)+coeficientesseno(k)*sin(k*pi*x)+coeficientescoseno(k)*cos(k*pi*x);
end
end
clear all
close all
f=@(x) x.*(1-x);
t=linspace(0,1,1000);
plot(t,f(t),'b','linewidth',1.5)
hold on
plot(-t,-f(t),'b-.','linewidth',1.5)
colores=['r','m','g'];
n=[1,5,10];
for j=1:length(n)
coef=[];
for k=1:n(j)
X=f(t).*sin(k*pi*t);
bk=2*trapz(t,X);
coef=[coef bk];
end
f_n= sumatorio(0,zeros(1,length(coef)),coef);
plot(t,f_n(t),colores(j),'linewidth',1.5)
plot(-t,-f_n(t),colores(j),'linestyle','-.','linewidth',1.5)
end
title('Aproximación de una función continua')
xlabel('Eje X')
ylabel('Eje Y')
legend('f(x)','Extensión impar de f(x)','Aproximación n=1','Extensión impar aproximación n=1','Aproximación n=5','Extensión impar aproximación n=5','Aproximación n=10','Extensión impar aproximación n=10','Location','northwest')
Podemos apreciar la similitud entre la función [math] f(x) [/math] y su aproximación [math] f_n(x) [/math]. A medida que aumenta el número de términos [math] n [/math] en la serie de Fourier, la aproximación se vuelve más precisa. Claramente, se puede observar que se verifica la convergencia puntual de las series de Fourier. Tanto es así que en la gráfica no se aprecia la función [math] f(x) [/math]. Esto es debido a que se superpone con la función aproximación [math] f_{10}(x) [/math].
Por último, calculamos los errores entre la función original y la función aproximada en función del número de términos de la serie. En concreto, estudiamos los errores en las normas [math] L^2 [/math], [math] \left( \int_{0}^{1} |f(x)-f_n(x)|^2 dx \right) ^{\frac{1}{2}}[/math],y uniforme, [math] sup_{x \in [0,1]} | f(x)-f_n(x)| [/math]. Representamos estos errores gráficamente:
clear all
close all
format long
f=@(x) x.*(1-x);
t=linspace(0,1,100001);
enes=linspace(0,400,401);
g=@(x) (abs(f(x))).^2;
h=@(x) abs(f(x));
error_L2=[sqrt(integral(g,0,1))];
error_unif=[max(h(t))];
coef=[];
for j=1:length(enes)-1
k=enes(j)+1;
X=f(t).*sin(k*pi*t);
bk=2*trapz(t,X);
coef=[coef bk];
f_n= sumatorio(0,zeros(1,length(coef)),coef);
g=@(x) (abs(f(x)-f_n(x))).^2;
h=@(x) abs(f(x)-f_n(x));
error_L2=[error_L2 sqrt(integral(g,0,1))];
error_unif=[error_unif max(h(t))];
end
semilogy(enes,error_L2)
hold on
semilogy(enes,error_unif)
title('Errores en las normas L^2 y uniforme')
xlabel('valor de n')
ylabel('error en escala logarítmica')
legend('Error en la norma L^2', 'Error en la norma uniforme')
En la gráfica del error en [math] L^2 [/math], se aprecia una disminución gradual a medida que aumenta n, ya que la aproximación de la serie de Fourier se vuelve cada vez más precisa. En el error uniforme, también se aprecia una disminución del error a medida que aumenta n. Sin embargo, no disminuye tan rápidamente como el error en [math] L^2 [/math]. Esto es debido a que el error uniforme considera la diferencia máxima absoluta entre la función original y su aproximación de Fourier en todo el dominio. Por tanto, un único punto en el dominio cuya diferencia es considerablemente alta afecta al error máximo. No obstante, en el error [math] L^2 [/math] interviene la integral de la diferencia entre la función original y su aproximación de Fourier en todo el dominio. Los puntos del dominio cuya diferencia es relativamente alta no afectan tanto al resultado del error, debido a que estos puntos se consideran en función de su contribución al área total bajo la curva.
4.1 Ejemplo de base y serie de Fourier
Consideramos la función [math] f(x)=x \cdot e^{-x} [/math] en el intervalo [math] [1,3] [/math]. Por tanto, la base trigonométrica asociada en este intervalo será:
Notar como, dicha base coincide con la base trigonométrica mencionada previamente para el intervalo [math] [-1,1] [/math].
A continuación, si aproximamos la función [math] f(x) [/math] con dicha base trigonométrica para distintos valores de [math] n [/math] obtendríamos lo siguiente: (Destacar que, para ejecutar este código es necesario cargar la función sumatorio definida en la sección aproximación de una función continua en un archivo aparte).
clear all
close all
f=@(x) x.*exp(-x);
t=linspace(1,3,1000);
plot(t,f(t),'b','linewidth',1.5)
hold on
colores=['r','m','g'];
n=[5,10,20];
for j=1:length(n)
coef0=trapz(t,f(t));
coefseno=[];
coefcoseno=[];
for k=1:n(j)
Xseno=f(t).*sin(k*pi*t);
bk=trapz(t,Xseno);
coefseno=[coefseno bk];
Xcoseno=f(t).*cos(k*pi*t);
ak=trapz(t,Xcoseno);
coefcoseno=[coefcoseno ak];
end
f_n= sumatorio(coef0,coefcoseno,coefseno);
plot(t,f_n(t),colores(j),'linewidth',1.5)
end
title(['Aproximación de una función con un cambio de intervalo'])
xlabel('Eje X')
ylabel('Eje Y')
legend('f(x)','Aproximación n=5','Aproximación n=10','Aproximación n=20','Location','southwest')
Como se puede observar, a medida que aumentamos el valor de [math] n [/math], la aproximación obtenida es cada vez más cercana a la función original [math] f(x) [/math].
Por otra parte, debemos prestar especial atención al comportamiento de la aproximación en los extremos del intervalo. En primer lugar, al tratarse la serie de Fourier de una función periódica y no ser coincidentes los valores de [math] f(1) [/math] y [math] f(3) [/math] (los extremos del intervalo) , es donde mayores diferencias se producen en la aproximación. Además, es destacable que, en los extremos del intervalo la serie de Fourier converge a
Este fenómeno que se observa no es casual, si no que se trata de un teorema destacado. Para ello, introducimos primero una definición:
Definición: Sea [math] f \in L^2 (\left[-\pi,\pi\right])[/math]. La función [math] f [/math] satisface la condición de Dirichlet si verifica:
- La función [math] f [/math] es continua salvo un número finito de puntos con discontinuidad de salto finito.
- Puedo dividir [math] [-\pi,\pi] [/math] en un conjunto de subintervalos finitos en los cuales la función es monótona.
Teorema: Convergencia puntual de la serie de Fourier. Sea [math] f \in L^2 (\left[-\pi,\pi\right])[/math] una función que verifica la condición de Dirichlet. Entonces, la serie de Fourier converge puntualmente en los puntos de continuidad. Es decir, si [math] x_o [/math] es un punto de continuidad de [math] f [/math], entonces:
Si [math] x_0 [/math] es un punto de discontinuidad, entonces la serie de Fourier converge en [math] x_0 [/math] al valor:
En los valores extremos [math] -\pi, \pi [/math], la serie converge a:
Cabe destacar que este fenómeno va a contribuir a que los errores de aproximación sean mucho mayores.
5 Aproximación de una función discontinua
Una vez estudiado el caso de la aproximación de una función continua con las series de Fourier, procedemos a estudiar lo que ocurre cuando dicha función es discontinua. En primer lugar, es imprescindible notar que la base trigonométrica [math] \left\{ \frac{1}{2} \right\} \cup \left\{\cos \left( \frac{n \pi x}{T} \right), \sin \left( \frac{n \pi x}{T} \right) \right\}_{n \in \mathbb{N}} [/math] en [math] L^2 (\left[-T,T\right])[/math] está formada por funciones continuas en todo su dominio y, por ende, la combinación lineal de ellas, que aproximará a la función [math] f(x) [/math], también será continua a pesar de que [math] f(x) [/math] no lo sea.
En busca de poder apreciar lo que sucede con este tipo de funciones, vamos a estudiar un ejemplo concreto en el que debemos aproximar la función discontinua [math] f(x)=1_{x \leq 1/2}(x) [/math]. En este caso, podemos extender de forma par la función al intervalo [math] [−1, 1] [/math], obteniendo así una función par y periódica. De manera equivalente a lo que sucedía en el ejercicio anterior, al ser una función par en el intervalo [math] [−1, 1] [/math], los coeficientes correspondientes a las funciones impares de la base, [math] \{ \sin(n \pi x)\}_{n \in \mathbb{N}}[/math], serán nulos.
Para aproximar esta función con distintos números de elementos de la base trigonométrica, hemos elaborado el siguiente código en Matlab. (Destacar que, para ejecutar este código es necesario cargar la función sumatorio definida en la sección aproximación de una función continua en un archivo aparte).
clear all
close all
f=@(x) 1.*(x<=1/2);
g=@(x) f(-x);
t=linspace(0,1,1000);
fplot(f,[0 1],'b','linewidth',1.5)
hold on
fplot(g,[-1 0],'b','linewidth',1.5)
colores=['r','m','g','c'];
n=[1,5,10,100];
coef0=2*trapz(t,f(t));
for j=1:length(n)
coefcos=[];
for k=1:n(j)
X=f(t).*cos(k*pi*t);
ak=2*trapz(t,X);
coefcos=[coefcos ak];
end
f_n= sumatorio(coef0,coefcos,zeros(1,length(coefcos)));
plot(t,f_n(t),colores(j),'linewidth',1.5)
plot(-t,f_n(t),colores(j),'linestyle','-.','linewidth',1.5)
end
title('Aproximación de una función discontinua')
xlabel('Eje X')
ylabel('Eje Y')
legend('f(x)','Extensión par de f(x)','Aproximación n=1','Extensión par aproximación n=1','Aproximación n=5','Extensión par aproximación n=5','Aproximación n=10','Extensión par aproximación n=10','Aproximación n=100','Extensión par aproximación n=100','Location','northwest')
Lo primero a destacar en esta imagen es el comportamiento oscilatorio que se produce en las series de Fourier alrededor del punto de salto, conocido como el fenómeno de Gibbs. Este suceso se puede apreciar con gran claridad en el caso [math] n=100 [/math], representado en la gráfica en color turquesa.
El fenómeno de Gibbs se caracteriza por la persistencia de oscilaciones cerca de los puntos de discontinuidad de una función cuando se aproxima mediante series de Fourier. Además, aunque se utilicen un número infinito de términos en la serie de Fourier para aproximar una función, las oscilaciones asociadas al fenómeno de Gibbs no desaparecen, simplemente se concentran en regiones más estrechas alrededor de los puntos de discontinuidad. Asimismo, su frecuencia aumenta a medida que se acercan al punto de discontinuidad. Esto da la impresión visual de que las oscilaciones se "apilan" cerca de la discontinuidad. Tener en cuenta este fenómeno es crucial para el diseño y la implementación eficaz de algoritmos basados en series de Fourier.
Además, otro punto a destacar de la imagen es que claramente a medida que aumentamos el valor de [math] n [/math], conseguimos una mejor aproximación a la función, es decir, un menor error de aproximación. A continuación, hemos elaborado otro código en Matlab para estudiar el comportamiento del error en función del valor de [math] n [/math]. En concreto, hemos estudiado los errores en las normas [math] L^2 [/math], [math] \left( \int_{0}^{1} |f(x)-f_n(x)|^2 dx \right)^{\frac{1}{2}} [/math],y uniforme, [math] sup_{x \in [0,1]} | f(x)-f_n(x)| [/math]. (Destacar que, para ejecutar este código es necesario cargar la función sumatorio definida en la sección aproximación de una función continua en un archivo aparte).
clear all
close all
format long
f=@(x) 1.*(x<=1/2);
g=@(x) f(-x);
t=linspace(0,1,100001);
enes=linspace(0,400,401);
coef0=2*trapz(t,f(t));
g=@(x) (abs(f(x)-coef0/2)).^2;
h=@(x) abs(f(x)-coef0/2);
error_L2=[sqrt(integral(g,0,1))];
error_unif=[max(h(t))];
coefcos=[];
for j=1:length(enes)-1
k=enes(j)+1;
X=f(t).*cos(k*pi*t);
ak=2*trapz(t,X);
coefcos=[coefcos ak];
f_n= sumatorio(coef0,coefcos,zeros(1,length(coefcos)));
g=@(x) (abs(f(x)-f_n(x))).^2;
h=@(x) abs(f(x)-f_n(x));
error_L2=[error_L2 sqrt(integral(g,0,1))];
error_unif=[error_unif max(h(t))];
end
semilogy(enes,error_L2)
hold on
semilogy(enes,error_unif)
title('Errores en las normas L^2 y uniforme')
xlabel('valor de n')
ylabel('error en escala logarítmica')
legend('Error en la norma L^2', 'Error en la norma uniforme','Location','southwest')
En primer lugar, el error en la norma [math] L^2 [/math] tiene un comportamiento muy similar al caso de la aproximación de una función continua. Sin embargo, los errores son claramente mayores debido a las oscilaciones propias del fenómeno de Gibbs. En segundo lugar, el error en la norma uniforme sigue un comportamiento totalmente distinto con respecto al caso anterior. De hecho, la convergencia del mismo a cero es mucho más lenta y los errores son mucho mayores. Esto se debe a que, tal y como hemos mencionado anteriormente, el error uniforme considera la diferencia máxima absoluta entre la función original y su aproximación de Fourier en todo el dominio. Por ello, el error uniforme se ve realmente perjudicado por el fenómeno de Gibbs.
5.1 Sumas de Cesàro
Finalmente, existe una técnica para aliviar el fenómeno de Gibbs, conocido como las sumas de Cesàro, definidas como: [math] S_N=\frac{1}{N+1} \sum_{n=0}^{N} f_n(x) [/math]. Para estudiar el efecto que tienen estas funciones en la aproximación de una función discontinua, hemos elaborado otro código en Matlab. (Destacar que, para ejecutar este código es necesario cargar la función sumatorio definida en la sección aproximación de una función continua en un archivo aparte).
clear all
close all
f=@(x) 1.*(x<=1/2);
w=@(x) f(-x);
t=linspace(0,1,100001);
coef0=2*trapz(t,f(t));
colores=['r','m','g'];
enes=linspace(0,100,101);
S=zeros(length(enes),length(t));
S_N=@(x) coef0/2;
g=@(x) (abs(f(x)-S_N(x))).^2;
h=@(x) abs(f(x)-S_N(x));
error_L2=[sqrt(integral(g,0,1))];
error_unif=[max(h(t))];
S(1,:)=S_N(t);
for j=1:length(enes)-1
coefcos=[];
for k=1:enes(j)+1
X=f(t).*cos(k*pi*t);
ak=2*trapz(t,X);
coefcos=[coefcos ak];
end
f_n= sumatorio(coef0,coefcos,zeros(1,length(coefcos)));
S_N=@(x) (S_N(x)*j+f_n(x))/(j+1);
g=@(x) (abs(f(x)-S_N(x))).^2;
h=@(x) abs(f(x)-S_N(x));
error_L2=[error_L2 sqrt(integral(g,0,1))];
error_unif=[error_unif max(h(t))];
S(j+1,:)=S_N(t);
end
figure(1)
subplot(2,2,1)
surf(t,enes,S)
hold on
surf(-t,enes,S)
shading flat
title('Representación de S_N(x) en función de N y de x')
xlabel('Valores de x')
ylabel('Valores de N')
subplot(2,2,2)
hold on
colores_hex = ["#FF0000", "#FF7F00", "#FFD700", "#FFFF00", "#7FFF00", ...
"#00FF00", "#00FF7F", "#00FFFF", "#007FFF", "#0000FF", ...
"#7F00FF", "#FF00FF", "#FF007F", "#BEBEBE", "#808080", ...
"#404040", "#000000", "#FFFFFF", "#800000", "#8B4513", ...
"#A0522D", "#D2691E", "#FF4500", "#FF6347", "#FF8C00", ...
"#FFA500", "#FFDAB9", "#FFE4B5", "#FFFF00", "#FFFACD", ...
"#FAFAD2", "#FFEFD5", "#FFEBCD", "#FFE4C4", "#FFDEAD", ...
"#F5DEB3", "#DEB887", "#D2B48C", "#BC8F8F", "#F4A460", ...
"#DAA520", "#B8860B", "#CD853F", "#D2691E", "#8B4513", ...
"#A0522D", "#A52A2A", "#800000", "#FF0000", "#FF6347", ...
"#FF7F50", "#CD5C5C", "#DC143C", "#FFA07A", "#FF4500", ...
"#FFD700", "#DAA520", "#FF8C00", "#FFA500", "#FFDAB9", ...
"#FFE4B5", "#FFEFD5", "#FFFACD", "#FAFAD2", "#FFFF00", ...
"#FFFFE0", "#FFF8DC", "#FFF5EE", "#F0FFF0", "#F5FFFA", ...
"#F0FFFF", "#F0F8FF", "#F8F8FF", "#F5F5F5", "#FFFAFA", ...
"#FFFAF0", "#FDF5E6", "#FFF0F5", "#FAEBD7", "#FFFFF0", ...
"#F0E68C", "#FFFF00", "#808000", "#BDB76B", "#F0E68C", ...
"#EEE8AA", "#F5DEB3", "#FAFAD2", "#ADFF2F", "#7FFF00", ...
"#7CFC00", "#00FF00", "#32CD32", "#98FB98", "#90EE90", ...
"#00FA9A", "#00FF7F", "#3CB371", "#2E8B57", "#228B22", ...
"#008000", "#006400", "#9ACD32", "#6B8E23", "#808000", ...
"#556B2F", "#66CDAA", "#8FBC8F", "#20B2AA", "#008B8B", ...
"#008080", "#00CED1", "#00FFFF", "#40E0D0", "#7FFFD4", ...
"#B0E0E6", "#5F9EA0", "#4682B4", "#6495ED", "#00BFFF", ...
"#1E90FF", "#ADD8E6", "#87CEEB", "#87CEFA", "#191970", ...
"#000080", "#00008B", "#0000CD", "#0000FF", "#4169E1", ...
"#8A2BE2", "#4B0082", "#483D8B", "#6A5ACD", "#7B68EE", ...
"#9370DB", "#8A2BE2", "#9400D3", "#9932CC", "#8B008B", ...
"#800080", "#BA55D3", "#DA70D6", "#DDA0DD", "#EE82EE", ...
"#FF00FF", "#FF69B4", "#FF1493", "#DB7093", "#C71585", ...
"#B22222", "#FF0000", "#DC143C", "#CD5C5C", "#F08080", ...
"#E9967A", "#FA8072", "#FFA07A", "#FF4500", "#FF6347", ...
"#FF7F50", "#FF8C00", "#FFA500", "#FFD700", "#B8860B", ...
"#DAA520", "#FFC0CB", "#FFB6C1", "#FF69B4", "#FF1493", ...
"#FFC0CB", "#DB7093", "#C71585", "#FFA07A", "#FA8072", ...
"#FFA07A", "#FF4500", "#FF6347", "#FF7F50", "#FF8C00", ...
"#FFA500", "#FFD700", "#B8860B", "#DAA520", "#FFC0CB", ...
"#FFB6C1", "#FF69B4", "#FF1493"];
for k=1:length(enes)
plot(t,S(k,:),'Color', colores_hex(k))
plot(-t,S(k,:),'Color', colores_hex(k))
end
title('Representación sumas de Cesàro')
xlabel('Eje X')
ylabel('Eje Y')
subplot(2,2,3)
semilogy(enes,error_L2)
hold on
semilogy(enes,error_unif)
ylim([0 0.6])
title('Errores de las sumas de Cesàro')
xlabel('Valores de N')
ylabel('Errores en escala logarítmica')
legend('Error en la norma L^2', 'Error en la norma uniforme','Location','southwest')
subplot(2,2,4)
plot(t,f(t))
hold on
plot(t,f_n(t))
plot(t,S_N(t))
title('Representación de la mitigación del fenómeno de Gibbs para N=100')
xlabel('Eje X')
ylabel('Eje Y')
legend('f(x)','f_{100}(x)','S_{100}(x)')
figure(2)
colores=['r','m','g','c'];
nuevas_enes=[1,5,10,100];
fplot(f,[0 1],'b','linewidth',1.5)
hold on
fplot(w,[-1 0],'b','linestyle','-.','linewidth',1.5)
for k=1:length(nuevas_enes)
plot(t,S(nuevas_enes(k)+1,:),'color', colores(k),'linewidth',1.5)
plot(-t,S(nuevas_enes(k)+1,:),'color', colores(k),'linestyle','-.','linewidth',1.5)
end
title('Representación sumas de Cesàro para n=1,5,10,100')
xlabel('Eje X')
ylabel('Eje Y')
legend('f(x)','Extensión par de f(x)','S_1(x)','Extensión par S_1(x)','S_5(x)','Extensión S_5(x)','S_{10}(x)','Extensión par S_{10}(x)','S_{100}(x)',...
'Extensión par S_{100}(x)','Location','northwest')
La primera gráfica está en tres dimensiones y representa las sumas de Cesàro en función de los valores de N (eje Y) y los valores de x (eje X). Realmente, la manera de visualizar cada una de estas funciones según el valor de N es imaginarse el plano [math] N=k [/math] para cierto [math] k \in \{0,\dots, 100\} [/math] y la intersección de dicho plano con la superficie representada es la correspondiente suma de Cesàro [math] S_k [/math]. Estas sumas están representadas en la gráfica situada en la parte superior derecha.
En la última de las 4 gráficas, se muestra la mitigación del efecto de Gibbs haciendo uso de las sumas de Cesàro para N=100.
En cuanto a la gráfica de la parte inferior izquierda, hemos representado los errores en la norma [math] L^2 [/math] y uniforme. Aunque puede parecer sorprendente que estos errores hayan aumentado con respecto a los errores obtenidos con las series de Fourier, realmente es una de las consecuencias de las sumas de Cesàro.
Recordamos que las sumas de Cesàro son una forma de promediar las sumas parciales de la serie, lo que puede suavizar las oscilaciones alrededor de los puntos de discontinuidad. Sin embargo, es importante destacar que, aunque estas sumas reducen el efecto de Gibbs, introducen un nuevo desafío: un aumento en el error de aproximación.
Este aumento en el error se debe a que las sumas de Cesàro, para reducir las oscilaciones alrededor de los puntos de discontinuidad, tienen un efecto de suavizado general en toda la función. Esto implica que la aproximación resultante puede alejarse más de la función original en regiones donde no hay discontinuidades. Por ello, es importante considerar este inconveniente a la hora de hacer uso de las sumas de Cesáro en la aproximación según el objetivo de cada ejercicio.
Por último, el código recién introducido representa también en otra figura las sumas de Cesàro obtenidas de la función [math] f(x)=1_{x \leq 1/2}(x) [/math] para los valores de [math] N=1,5,10,100 [/math], así como la propia función.
Tal y como hemos mencionado, las sumas de Cesàro reducen las oscilaciones en torno a los puntos de discontinuidad de la función. Además, para un valor de [math] N [/math] lo suficientemente grande, como es [math] N=100 [/math], la representación de las sumas de Cesáro son bastante similares a la función original, a precio de un error mayor, tal y como ya se ha comentado.
6 Forma compleja
Por último, otra forma de representar las series de Fourier es reformulando el seno y el coseno en términos de números complejos empleando las fórmulas de Euler:
Por lo tanto, sustituyendo y agrupando algebraicamente, podemos expresar las series de Fourier de la siguiente manera:
definiendo [math] c_0:=\frac{a_0}{2}[/math], [math] c_n:=\frac{a_n-ib_n}{2} [/math] y [math] c_{-n}:=\frac{a_n+ib_n}{2} [/math].
De esta manera obtenemos la serie de Fourier expresada en una nueva base, la base trigonométrica compleja: [math] \left\{ e^{i n x} \right\}_{n \in \mathbb{Z}} [/math]. Al dejarlo en una única expresión, se simplifican los cálculos matemáticos y facilita su comprensión teórica.
6.1 Ejemplo de serie de Fourier con base trigonométrica compleja
Veamos un ejemplo empleando la base trigonométrica compleja. Tomamos [math] f(x)=4x\left(\frac{1}{2}-x\right)^2 [/math] en el intervalo [math] [0,1] [/math]. Aproximemos ahora dicha función con los primeros [math] 5, 10 [/math] y [math] 20 [/math] términos de la serie.
Recordamos que, en el espacio [math] L^2([-\pi,\pi]) [/math] de funciones que toman valores complejos, el producto escalar definido es
Además, los coeficientes de Fourier serán por tanto números complejos, incluso aunque la función tome valores reales.
Para ello, lo primero que debemos hacer es adaptar la base trigonométrica mencionada al intervalo [math] [0,1] [/math]. Para llevarlo a cabo, de manera análoga al caso de la base trigonométrica real, realizamos el cambio de variable [math] y= x \cdot \frac{1}{2\pi} [/math], obteniendo así la base: [math] \left\{e^ {2 \pi i n x} \right\}_{n \in \mathbb{Z}} [/math].
Una vez hemos obtenido la base, calculamos los coeficientes de Fourier [math] c_o, c_n [/math] y [math] c_{-n} [/math] asociados, de manera que
Para poder obtener gráficamente estos resultados hemos definido la siguiente función en Matlab
function [salida]=sumatorio2(coeficiente0,coeficientesexppos,coeficientesexpneg)
salida=@(x) coeficiente0;
for k=1:length(coeficientesexpneg)
salida=@(x) salida(x)+coeficientesexpneg(k)*exp(-2*i*k*pi.*x)+coeficientesexppos(k)*exp(2*i*k*pi.*x);
end
end
En un archivo distinto al de la función sumatorio2 definida previamente, introducimos el código siguiente. Este nos permite obtener la aproximación de la serie de Fourier asociada a la función [math] f(x)=4x\left(\frac{1}{2}-x\right)^2 [/math] en el intervalo [math] [0,1] [/math] para los [math] 5, 10 [/math] y [math] 20 [/math] términos de la serie.
clear all
close all
f=@(x) 4*x.*(1/2-x).^2;
t=linspace(0,1,1000);
plot(t,f(t),'b','linewidth',1.5)
hold on
colores=['r','m','g'];
n=[5,10,20];
for j=1:length(n)
coef0=trapz(t,f(t));
coefexppos=[];
coefexpneg=[];
for k=1:n(j)
Xexpneg=f(t).*exp(2*i*k*pi.*t);
bk=trapz(t,Xexpneg);
coefexpneg=[coefexpneg bk];
Xexppos=f(t).*exp(-2*i*k*pi.*t);
ak=trapz(t,Xexppos);
coefexppos=[coefexppos ak];
end
f_n= sumatorio2(coef0,coefexppos,coefexpneg);
plot(t,f_n(t),colores(j),'linewidth',1.5)
end
title('Aproximación con la base trigonométrica compleja')
xlabel('Eje X')
ylabel('Eje Y')
legend('f(x)','Aproximación n=5','Aproximación n=10','Aproximación n=20','Location','northwest')
Como se puede observar, de nuevo, cuanto mayor es el valor del parámetro [math] n [/math], mejor se ajusta la aproximación a la función [math] f(x) [/math]. Por último, en los extremos del intervalo se verifica que
cumpliendose así lo ya mencionado en el Teorema de convergencia de la serie de Fourier de la sección [math] 3.2 [/math].