Diferencia entre revisiones de «Series de Fourier (Grupo 2 1/2)»

De MateWiki
Saltar a: navegación, buscar
(Aproximación de una función)
(Referencias)
 
(No se muestran 17 ediciones intermedias de 2 usuarios)
Línea 11: Línea 11:
  
 
== Base trigonométrica==
 
== Base trigonométrica==
Para una mayor claridad del la base trigonométrica, se representaran los <math> 13</math> primeros términos de ella, obtenidos mediante el siguiente código.
+
Para aproximar una función mediante las series de Fourier es necesaria una base trigonométrica sobre la que definir la aproximación. Dado un intervalo de longitud <math> T </math> sobre el que aproximará la función, la base es la siguiente:
  
[[Archivo: HscSin.png|300px|thumb|right|Término de la base <math> \sin(n\pi x)</math>]]
+
<center> <math> \{ \frac{1}{2}, sen(\frac{n \pi x}{T}), cos(\frac{n \pi x}{T}) \}_{n \in \mathbb{N} } </math></center>
 +
 
 +
Se puede tener una mayor claridad del la base trigonométrica graficando unos cuantos términos. Se representaran los <math> 13</math> primeros términos de ella, obtenidos mediante el siguiente código.
 +
 
 +
[[Archivo: HscSin.png|350px|thumb|right|Término de la base <math> \sin(n\pi x)</math>]]
 
{{matlab|codigo=
 
{{matlab|codigo=
 
% Definir el rango de x
 
% Definir el rango de x
Línea 37: Línea 41:
 
end}}
 
end}}
  
[[Archivo: hscCos.png|300px|thumb|right|Término de la base <math> \cos(n\pi x)</math>]]
+
[[Archivo: hscCos.png|350px|thumb|right|Término de la base <math> \cos(n\pi x)</math>]]
 
{{matlab|codigo=
 
{{matlab|codigo=
  
Línea 71: Línea 75:
  
 
==Aproximación de una función==
 
==Aproximación de una función==
A continuación se verá como mediante las bases vistas, somos capaces de aproximar series de Fourier. El objetivo de este trabajo es ver la calidad con la que se pueden aproximar funciones periódicas en intervalos <math>[-T,T]</math>,mediante el uso de senos y cosenos. Las funciones no siempre tienen que ser periódicas, y por ello se utiliza el recurso de extender la función. A la hora de extender una función se puede hacer tanto de forma par, en cuyo caso solo se necesitarán los coeficientes pares de la base trigonométrica, como de forma impar donde solo se necesitarán los coeficientes impares de la base trigonométrica. La longitud del intervalo es importante, ya que con esta se encontrará la base con la que trabajar, y a la hora de encontrar los coeficientes para la base, solo se necesitará la longitud. El cálculo necesario para encontrar los coeficientes es el siguiente.
+
A continuación se verá como mediante las bases vistas, somos capaces de aproximar series de Fourier. El objetivo de este trabajo es ver la calidad con la que se pueden aproximar funciones periódicas en intervalos <math>[-T,T]</math>,mediante el uso de la base trigonométrica. Las funciones no siempre tienen que ser periódicas, y por ello se utiliza el recurso de extender la función. A la hora de extender una función se puede hacer tanto de forma par, en cuyo caso solo se necesitarán los coeficientes pares de la base trigonométrica, como de forma impar donde solo se necesitarán los coeficientes impares de la base trigonométrica. La longitud del intervalo es importante, ya que con esta se encontrará la base con la que trabajar, y a la hora de encontrar los coeficientes para la base, solo se necesitará la longitud. El cálculo necesario para encontrar los coeficientes es el siguiente.
 
<center> <math>a_0 =\frac{1}{T}\int_{-T}^{T} f(x) dx, \hspace{30px} a_n =\frac{1}{T}\frac{\int_{-T}^{T} cos\Bigl(\frac{n \pi x}{T}\Bigl)f(x) dx}{\int_{-T}^{T} cos^{2}\Bigl(\frac{n \pi x}{T}\Bigl) dx}, \hspace{30px} b_n= \frac{1}{T}\frac{\int_{-T}^{T} sen\Bigl(\frac{n \pi x}{T}\Bigl)f(x) dx}{\int_{-T}^{T} cos^{2}\Bigl(\frac{n \pi x}{T}\Bigl) dx} </math></center>
 
<center> <math>a_0 =\frac{1}{T}\int_{-T}^{T} f(x) dx, \hspace{30px} a_n =\frac{1}{T}\frac{\int_{-T}^{T} cos\Bigl(\frac{n \pi x}{T}\Bigl)f(x) dx}{\int_{-T}^{T} cos^{2}\Bigl(\frac{n \pi x}{T}\Bigl) dx}, \hspace{30px} b_n= \frac{1}{T}\frac{\int_{-T}^{T} sen\Bigl(\frac{n \pi x}{T}\Bigl)f(x) dx}{\int_{-T}^{T} cos^{2}\Bigl(\frac{n \pi x}{T}\Bigl) dx} </math></center>
 
Esto sería en el caso de una base general, en el caso de tener una base ortonormal, dichos coeficientes quedarían así:
 
Esto sería en el caso de una base general, en el caso de tener una base ortonormal, dichos coeficientes quedarían así:
<center> <math>a_0 =\frac{1}{T}\int_{-T}^{T} f(x) dx, \hspace{30px} a_n =\frac{1}{T}\int_{-T}^{T} f(x) \cos\Bigl(\frac{n \pi x}{T}\Bigl) dx, \hspace{30px} b_n =\frac{1}{T}\int_{-T}^{T} f(x) \sin\Bigl(\frac{n \pi x}{T}\Bigl) dx  </math> </center>. Como se puede ver, a la hora de calcular los coeficientes no es necesario saber cual es el intervalo, con la longitud basta, de todas formas, a la hora de aproximar una función se deberá tener en cuenta el intervalo específico que se quiere aproximar, y realizar una traslación. Finalmente, la función que se obtendrá para aproximar será:
+
<center> <math>a_0 =\frac{1}{T}\int_{-T}^{T} f(x) dx, \hspace{30px} a_n =\frac{1}{T}\int_{-T}^{T} f(x) \cos\Bigl(\frac{n \pi x}{T}\Bigl) dx, \hspace{30px} b_n =\frac{1}{T}\int_{-T}^{T} f(x) \sin\Bigl(\frac{n \pi x}{T}\Bigl) dx  </math> </center> Como se puede ver, a la hora de calcular los coeficientes no es necesario saber cual es el intervalo, con la longitud basta, de todas formas, a la hora de aproximar una función se deberá tener en cuenta el intervalo específico que se quiere aproximar, y realizar una traslación. Finalmente, la función que se obtendrá para aproximar será:
 
<center><math>f(x) = \frac{a_0}{2} + \sum_{n=1}^{\infty} \left( a_n \cos \left( \frac{2\pi nx}{T} \right) + b_n \sin \left( \frac{2\pi nx}{T} \right) \right)</math> </center>
 
<center><math>f(x) = \frac{a_0}{2} + \sum_{n=1}^{\infty} \left( a_n \cos \left( \frac{2\pi nx}{T} \right) + b_n \sin \left( \frac{2\pi nx}{T} \right) \right)</math> </center>
 
=== Funciones continuas===
 
=== Funciones continuas===
Línea 87: Línea 91:
 
<center><math> g(x)=\begin{cases}
 
<center><math> g(x)=\begin{cases}
 
     x(1+x), & \text{si } x \in  [0,1] \\
 
     x(1+x), & \text{si } x \in  [0,1] \\
   x(1-x), & \text{si } x \in  [-1,0]
+
   x(1-x), & \text{si } x \in  [-1,0)
 
\end{cases}</math></center>
 
\end{cases}</math></center>
  
Línea 98: Línea 102:
 
[[Archivo:Ejercicio2FourierManuel.png|650px|thumb|right|sinmarco|Aproximación por Serie de Fourier para <math> g(x)=\begin{cases}
 
[[Archivo:Ejercicio2FourierManuel.png|650px|thumb|right|sinmarco|Aproximación por Serie de Fourier para <math> g(x)=\begin{cases}
 
     x(1+x), & \text{si } x \in  [0,1] \\
 
     x(1+x), & \text{si } x \in  [0,1] \\
   x(1-x), & \text{si } x \in  [-1,0]
+
   x(1-x), & \text{si } x \in  [-1,0)
 
\end{cases}</math>]]
 
\end{cases}</math>]]
 
{{matlab|codigo=
 
{{matlab|codigo=
Línea 112: Línea 116:
 
xxx=0:10^(-3):1;
 
xxx=0:10^(-3):1;
  
%numero de terminos
+
%número de terminos
 
terminos=[1,5,10];
 
terminos=[1,5,10];
  
Línea 508: Línea 512:
  
 
Finalmente, destacar como a medida que se va aumentando el número de coeficientes de Fourier, la aproximación va experimentando una variación que hace que se aproxima más a la función objeto.
 
Finalmente, destacar como a medida que se va aumentando el número de coeficientes de Fourier, la aproximación va experimentando una variación que hace que se aproxima más a la función objeto.
 +
 +
== Referencias==
 +
* [https://es.wikipedia.org/wiki/Serie_de_Fourier  Wikipedia. Series de Fourier.]
 +
* [Libro de Sandro Salsa. Partial Differential Equations in Action: From Modelling to Theory]
 +
[[Categoría:EDP]]
 +
[[Categoría:EDP23/24]]

Revisión actual del 11:11 15 feb 2024

Trabajo realizado por estudiantes
Título Series de Fourier.
Asignatura EDP
Curso 2023-24
Autores Alfredo de Lorenzo, Hugo Sanz, Manuel Fdez.
Este artículo ha sido escrito por estudiantes como parte de su evaluación en la asignatura

1 Introducción

Las Series de Fourier constituyen un conjunto fundamental de herramientas matemáticas empleadas para la aproximación de funciones periódicas mediante la suma infinita de funciones seno y coseno. El término se origina en el trabajo del matemático francés Jean-Baptiste Joseph Fourier, quien desarrolló la teoría durante su investigación sobre la ecuación del calor. Se le atribuye como el pionero en el estudio sistemático de dichas series, y presentó sus resultados iniciales en 1807 y 1811.

El objetivo de las Series de Fourier radica en la capacidad de descomponer cualquier función periódica con un periodo [math]T[/math] en una serie infinita de funciones trigonométricas. En particular, si [math]f(x)[/math] es una función periódica con periodo [math]T[/math], puede expresarse como:

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

donde [math]a_0[/math], [math]a_n[/math], y [math]b_n[/math] se denominan coeficientes de Fourier de la serie de Fourier de la función [math]f(x)[/math]. Estos coeficientes se calculan mediante integrales definidas sobre el periodo [math]T[/math] de la función.

Aproximar funciones mediante las series de Fourier tienen ventajas y desventajas frente a otros métodos. Si bien es cierto que no aproximan con exactitud observando un punto particular, sí lo hace para la forma general de la función.

2 Base trigonométrica

Para aproximar una función mediante las series de Fourier es necesaria una base trigonométrica sobre la que definir la aproximación. Dado un intervalo de longitud [math] T [/math] sobre el que aproximará la función, la base es la siguiente:

[math] \{ \frac{1}{2}, sen(\frac{n \pi x}{T}), cos(\frac{n \pi x}{T}) \}_{n \in \mathbb{N} } [/math]

Se puede tener una mayor claridad del la base trigonométrica graficando unos cuantos términos. Se representaran los [math] 13[/math] primeros términos de ella, obtenidos mediante el siguiente código.

Término de la base [math] \sin(n\pi x)[/math]
% Definir el rango de x
x_values = linspace(-1, 1, 1000);

num_functions = 6;
seno = cell(1, num_functions);
legendss = cell(1, num_functions);
f = @(x) 1/2;
for n = 1:num_functions
        % Funciones seno 
        seno{n} = sin(n *pi* x_values);
        legendss{n} = ['f(x)=sin(', num2str(n), 'pix)'];
end

figure(1)
for i = 1:num_functions 
    subplot(1,4,i)
    plot(x_values, seno{i}, 'DisplayName', legendss{i});
    legend(legendss{i});
    xlabel('x');    
    ylabel('f(x)');
end


Término de la base [math] \cos(n\pi x)[/math]
num_functions = 6;
coseno = cell(1, num_functions);
legendsc = cell(1, num_functions);
for n = 1:num_functions
        % Funciones coseno
        coseno{n} = cos(n *pi* x_values);
        legendsc{n} = ['f(x)=cos(', num2str(n), 'pix)'];
end
figure(2)
for i = 1:num_functions 
    subplot(1,4,i)
    plot(x_values, coseno{i}, 'DisplayName', legendsc{i});
    legend(legendsc{i});
    xlabel('x');
    ylabel('f(x)');
end


Término de la base [math] 1/2[/math]
figure(3)
plot(x_values,ones(size(x_values))*1/2,'DisplayName', '1/2')
legend('f(x)=1/2');
xlabel('x');
ylabel('f(x)');
grid on;
hold off;


Como se observa en las gráficas del seno y coseno, a medida que aumenta [math]n[/math] las funciones tienen menor periodo por lo que oscilan más. Esto hace que a mayores valores de [math]n[/math] la aproximación sea más óptima ya que oscilará tanto que apenas será notable. De esta forma la suma infinita de términos se aproxima a la función.

3 Aproximación de una función

A continuación se verá como mediante las bases vistas, somos capaces de aproximar series de Fourier. El objetivo de este trabajo es ver la calidad con la que se pueden aproximar funciones periódicas en intervalos [math][-T,T][/math],mediante el uso de la base trigonométrica. Las funciones no siempre tienen que ser periódicas, y por ello se utiliza el recurso de extender la función. A la hora de extender una función se puede hacer tanto de forma par, en cuyo caso solo se necesitarán los coeficientes pares de la base trigonométrica, como de forma impar donde solo se necesitarán los coeficientes impares de la base trigonométrica. La longitud del intervalo es importante, ya que con esta se encontrará la base con la que trabajar, y a la hora de encontrar los coeficientes para la base, solo se necesitará la longitud. El cálculo necesario para encontrar los coeficientes es el siguiente.

[math]a_0 =\frac{1}{T}\int_{-T}^{T} f(x) dx, \hspace{30px} a_n =\frac{1}{T}\frac{\int_{-T}^{T} cos\Bigl(\frac{n \pi x}{T}\Bigl)f(x) dx}{\int_{-T}^{T} cos^{2}\Bigl(\frac{n \pi x}{T}\Bigl) dx}, \hspace{30px} b_n= \frac{1}{T}\frac{\int_{-T}^{T} sen\Bigl(\frac{n \pi x}{T}\Bigl)f(x) dx}{\int_{-T}^{T} cos^{2}\Bigl(\frac{n \pi x}{T}\Bigl) dx} [/math]

Esto sería en el caso de una base general, en el caso de tener una base ortonormal, dichos coeficientes quedarían así:

[math]a_0 =\frac{1}{T}\int_{-T}^{T} f(x) dx, \hspace{30px} a_n =\frac{1}{T}\int_{-T}^{T} f(x) \cos\Bigl(\frac{n \pi x}{T}\Bigl) dx, \hspace{30px} b_n =\frac{1}{T}\int_{-T}^{T} f(x) \sin\Bigl(\frac{n \pi x}{T}\Bigl) dx [/math]
Como se puede ver, a la hora de calcular los coeficientes no es necesario saber cual es el intervalo, con la longitud basta, de todas formas, a la hora de aproximar una función se deberá tener en cuenta el intervalo específico que se quiere aproximar, y realizar una traslación. Finalmente, la función que se obtendrá para aproximar será:
[math]f(x) = \frac{a_0}{2} + \sum_{n=1}^{\infty} \left( a_n \cos \left( \frac{2\pi nx}{T} \right) + b_n \sin \left( \frac{2\pi nx}{T} \right) \right)[/math]

3.1 Funciones continuas

En primer lugar se estudiarán las funciones continuas, y como se pueden aproximar mediante la serie de Fourier. Para ello se trabajará como ejemplo con la función:

[math]f(x) = x(1-x)[/math]

sobre el intervalo [math][0,1][/math].

Para poder obtener su base trigonométrica en el intervalo [math][-1,1][/math], en primer lugar se comprueba que se pueda extender de forma impar, para ello se obtiene expresión [math]-f(-x)[/math] . Una vez hecho, se de fine la extensión, que en este caso es:

[math] g(x)=\begin{cases} x(1+x), & \text{si } x \in [0,1] \\ x(1-x), & \text{si } x \in [-1,0) \end{cases}[/math]

Una vez se ha obtenido, ya está definida la función en el intervalo [math][-1,1][/math], viendo que es una función continua ya se pueden obtener los coeficientes de Fourier.

[math] \lim_{x\rightarrow 0^{-}} g(x)=0=\lim_{x\rightarrow 0^{+}} g(x) [/math]

Cabe destacar, que al estar trabajando con una función impar, como resultado todos los coeficientes asociados al coseno serán [math]0[/math], al ser pares, y de los asociados al seno uno de cada dos lo será, aquellos que sean pares por ser multiplicación de impares. Una vez calculados los términos, se verán las series de Fourier. Se han representado las series relativas a [math]n=1,5,10[/math] y se muestra como varia el error.

Aproximación por Serie de Fourier para [math] g(x)=\begin{cases} x(1+x), & \text{si } x \in [0,1] \\ x(1-x), & \text{si } x \in [-1,0) \end{cases}[/math]
% Definir la función a integrar
fa_par = @(x, n) sin(pi * n * x) .* (x.*(1-x));
fb_par = @(x, n) cos(pi * n * x) .* (x.*(1-x)); 
fa_impar = @(x, n) sin(pi * n * x) .* (x.*(1+x));
fb_impar = @(x, n) cos(pi * n * x) .* (x.*(1+x));
f = @(x) (x.*(1-x));
h = @(x) (x.*(1+x));
% Tolerancia para el método del trapecio
xx=-1:10^(-3):0;
xxx=0:10^(-3):1;

%número de terminos
terminos=[1,5,10];

k=1
for i=terminos
    % Inicializar un vector para almacenar los resultados
    b_k = zeros(i, 1);
    a_k = zeros(i, 1);
    
    % Calcular las integrales para n desde 1 hasta 20 usando el método del trapecio adaptativo
    for n = 1:i
        resultado_seno = trapz(xx,fa_impar(xx, n))+trapz(xxx,fa_par(xxx, n));
        resultado_cos = trapz(xx,fb_impar(xx, n))+trapz(xxx,fb_par(xxx, n)); 
    
        % Almacenar el resultado
        b_k(n) = resultado_seno;
        a_k(n) = resultado_cos; 
    end
    %Serie de fourier para n=i
    fn = @(x) 0;
    for n=1:i
        fn = @(x) b_k(n) * sin(n*pi*x) + fn(x);
    end
    
    % Definir la función
    x = linspace(-1, 1, 100000); % Generar 100 puntos en el rango [0, 1]
    x2 = linspace(0, 1, 100000); % Generar 100 puntos en el rango [0, 1]
    y = linspace(-1, 0, 100000); % Generar 100 puntos en el rango [0, 1]
    
    % Trazar la función
    figure(1)
    subplot(1,3,k)
    hold on 
    plot(x, fn(x), 'r--')
    plot(x2, f(x2),'blue-')
    plot(y, h(y),'yellow-')
    title('Comparación f y fn para n='+ string(i)); % Título del gráfico
    legend('fn(x)', 'f(x)', 'h(x)')
    grid on; % Activar la cuadrícula
    hold off
    
    % Mostrar los resultados
    disp('Resultados para coefs del seno usando el método del trapecio:');
    disp(b_k);
    disp('Resultados para coefs del coseno usando el método del trapecio:');
    disp(a_k);
    k=k+1
end

En estas gráficas se observa la comparación entre la función [math]g[/math], que es la extensión de nuestra función objeto, y la aproximación, [math]f_{n}[/math], por la serie de Fourier. Para volver al problema originar habría que restringirse tan solo a la representación de la parte positiva del eje x, la parte de la función [math]g[/math] representada en color azul.

Como se puede observar, la aproximacion para una interacción es bastante próxima, sin embargo, si aumentamos la aproximación hasta los primeros 5 o 10 coeficientes de Fourier, la aproximación es casi exacta a la función original.

Pasamos ahora a ver una gráfica que muestra el erros de la serie de Fourier, y como disminuye a medida que la [math]n[/math] aumenta.

Errores de la aproximación por la Serie de Fourier.
j=50; %coeficientes obtenidos para calcular el error
fn = @(x) 0;
% Calcular las integrales para n desde 1 hasta j
for n = 1:j
    resultado_seno = trapz(xx,fa_impar(xx, n))+trapz(xxx,fa_par(xxx, n));
    resultado_cos = trapz(xx,fb_impar(xx, n))+trapz(xxx,fb_par(xxx, n)); 

    % Almacenar el resultado
    b_k(n) = resultado_seno;
    a_k(n) = resultado_cos; 
end
for n=1:j
    fn = @(x) b_k(n) * sin(n*pi*x) + fn(x);
    abs_diff = @(x) abs(f(x) - fn(x)).^2;
    integral_result(n) = sqrt(trapz(xxx,abs_diff(xxx)));
    abs_diffneg = @(x) -abs(f(x) - fn(x));
    [supremo(n), x_supremo(n)] = (fminbnd(abs_diffneg, 0, 1));
end
N=zeros(j);
for n=1:j
    N(n)=n;
end

figure(2)
hold on
plot(N, log(abs(x_supremo)))
plot(N, log(integral_result))
xlabel('n'); % Etiqueta del eje x
ylabel('Error'); % Etiqueta del eje y
legend('Error uniforme','Error en norma L^2')
title('Errores logarítmicos para n='+ string(j)); % Título del gráfico
grid on; % Activar la cuadrícula
hold off



En la gráfica del logaritmo del error, se observan tanto el error uniforme, como el error en la norma [math] L^{2}[/math]. Se ha empleado el logaritmo, ya que en este caso, no se puede apreciar bien la forma en la que disminuye, y el logaritmo nos da una mejor idea. Se aprecia como ha medida que la n aumenta, el error disminuye, como es lógico.

3.2 Funciones discontinuas

Ahora se pasará a estudiar una función discontinua, y aunque el procedimiento sea similar, lo interesante serán las conclusiones que se puedan obtener. La función que estudiaremos será:

[math] f(x)=\begin{cases} 1, & \text{si } x \in [0,1/2] \\ 0, & \text{si } x \in (1/2,1] \end{cases}[/math]

Dicha función es discontinua, y cada rama es constante, de tal forma que al hacer la extensión que en este caso será par que en este paso será trivial, nos quedará una función definida en el intervalo [math][-1,1][/math] :

[math] f(x)=\begin{cases} 0, & \text{si } x \in [-1,-1/2) \\ 1, & \text{si } x \in [-1/2,1/2]\\ 0, & \text{si } x \in (1/2,1]\\ \end{cases}[/math]

Y una vez hecha la extensión par, se calcularán los coeficientes de la serie de Fourier, pero en este caso tiene los términos pares. La idea es ver las diferencias a la hora de aproximar una función continua o discontinua mediante una serie de Fourier.

Función [math]fn(x)[/math] para [math]n=1,5,10,50[/math]


clc
clear
format long
close all

g = @(x) (x > 0 & x < 0.5);
% Definir la función a integrar
funa = @(x, n) sin(pi * n * x);
funb = @(x, n) cos(pi * n * x);
func = @(x, n) cos(pi * n * x).^2;
fund = @(x, n) sin(pi * n * x).^2;
% Definir los límites de integración
a = -1; %A pesar de ser [-1,1], fuera de [-1/2,1/2] toma el valor 0
b = 1; 
xx= -1/2:10^(-3):1/2;
xxx= -1:10^(-3):1;

% Tolerancia para el método del trapecio adaptativo
tolerancia = 1e-10;
%numero de términos
i=10;

% Inicializar un vector para almacenar los resultados
ak = zeros(i, 1); %coeficientes del seno
bk = zeros(i, 1); %coeficientes del coseno


% Calcular las integrales para n desde 1 hasta i usando el método del trapecio adaptativo
for n = 1:i 
    ak(n) = trapz(xx,funa(xx,n))/trapz(xxx,fund(xxx,n));
    bk(n) = trapz(xx,funb(xx,n))/trapz(xxx,func(xxx,n));
end
a0= 1; %coeficiente de Fourier dado por 1/2
%Serie de fourier hasta n=i
fn = @(x) a0/2;
%Sumas de Cesarò
Sn = @(x) fn(x);
for n=1:i
    fn = @(x) bk(n) * cos(n*pi*x) + fn(x);
    Sn = @(x)fn(x) + Sn(x);
    Snaux=@(x) 1/(n+1) * (Sn(x));
    abs_diffn = @(x) abs(g(x) - Snaux(x)).^2;
    integral_result(n) = sqrt(integral(abs_diffn, 0, 1));
    abs_diffneg = @(x) -abs(g(x) - Snaux(x));
    [supremo(n), x_supremo(n)] = fminbnd(abs_diffneg, 0, 1);
end

Al ver las gráficas de la función y la serie de Fourier, se observan oscilaciones en la discontinuidad. Dicho suceso es conocido como el fenómeno de Gibbs. Para mitigarlo se emplea la suma de Césaro, la cual es:

[math]S_{N}={\frac{1}{N+1}} \sum_{i=0}^{N} f_{n}[/math]

Pasamos ahora a ver las gráficas.

Función [math]Sn(x)[/math] para [math]n=1,5,10,50[/math]
Sn = @(x) 1/(i+1) * (Sn(x));

% Definir la función
x = linspace(0, 1, 100000); % Generar 100 puntos en el rango [0, 1]

% Trazar la función
hold on 
plot(x, fn(x))
plot(x,g(x)) %gráfica de la función característica
xlabel('x'); % Etiqueta del eje x
ylabel('f(x)'); % Etiqueta del eje y
title('Gráfico fn'); % Título del gráfico
grid on; % Activar la cuadrícula
hold off

% Mostrar los resultados
disp('Resultados para coefs del seno usando el método del trapecio:');
disp(ak);
disp('Resultados para coefs del coseno usando el método del trapecio:');
disp(bk);

%Vemos que se produce el llamado "fenómeno de Gibbs" por lo que definimos
%otra función usando las sumas de Cesarò

figure

hold on 
plot(x, Sn(x))
plot(x,g(x)) %gráfica de la función característica
xlabel('x'); % Etiqueta del eje x
ylabel('f(x)'); % Etiqueta del eje y
title('Gráfico Sn'); % Título del gráfico
grid on; % Activar la cuadrícula
hold off
Error de [math]Sn(x)[/math]

En las gráficas se puede ver cómo la suma de Césaro elimina el fenómeno de Gibbs, dando así una mejor aproximación a la función. Para ver la calidad de dichas aproximaciones, a continuación se muestran las gráficas de los errores de dicha función.

N=zeros(i);
for n=1:i
    N(n)=n;
end

figure 

hold on 
plot(N, (integral_result))
plot(N,(abs(x_supremo)))
xlabel('n'); % Etiqueta del eje x
ylabel('error'); % Etiqueta del eje y
title('Gráfico fn'); % Título del gráfico
grid on; % Activar la cuadrícula
hold off


Viendo los errores en las gráficas, se puede apreciar como el error uniforme es constantemente 0.5, y esto se debe a que la discontinuidad es de salto 1, por lo que es imposible que el supremo de la diferencia sea menor de 0.5. Otra conclusión que se puede apreciar, es como el error desciende de forma mucho más lenta en el caso de la norma [math] L^{2}[/math] al ser una función discontinua, que indica que hay mayor dificultad para adaptarse.

4 Cambio de intervalo

En esta sección se trabajará como modificar un intervalo dado para obtener su base trigonométrica asociada y su correspondiente base de Fourier. Esta es otra forma que se utiliza cuando el intervalo no es ni simétrico respecto de 0, o no se puede conseguir mediante extensiones pares o impares; tal y como se ha tratado en las secciones anteriores.

Sea [math] [a,b] [/math] el intervalo genérico, para poder obtener su base trigonométrica se debe buscar otro intervalo de forma que podamos obtener su base. Estos intervalos son de la forma [math] [-T,T] [/math], simétricos respecto a 0, y se debe verificar la siguiente condición: [math] long(-T,T)= long(a,b) [/math]. Una vez se tenga el nuevo intervalo, la función se debe extender por periodicidad para finalmente mantenernos en el intervalo original.

En dicho caso, se ha visto anteriormente como se calcula la base en dicho intervalo.

Se plantea el siguiente ejemplo para facilitar la comprensión de esta sección.

Dado el intervalo [math][1,3][/math], obtener su base trigonométrica asociada y aproximar en dicho intervalo la función

[math]f(x) = xe^{-x}[/math]

En primer lugar, para obtener la base trigonométrica se buscará el intervalo cuya longitud es 2, entonces se toma el intervalo [math][-1,1][/math].

Por tanto, según lo visto en secciones anteriores, la base trigonométrica en el espacio [math] L^{2}[-1,1][/math] será [math] \Bigl\{ \frac{1}{2}, cos(\pi n x), sen(\pi n x)\Bigl\} [/math]

Para poder aproximar la [math]f[/math] dada por la serie de Fourier en el intervalo modificado, se debe extender la función por periodicidad para volver al intervalo original. En este caso, se debe realizar una traslación de [math]2k[/math] con [math]k \in \mathbb{Z} [/math]. Es decir, los coeficientes de Fourier obtenidos serán de [math]g(x)=f(x+2)=(x+2)e^{-(x+2)}[/math] (con [math]k=1[/math]), para así, a la hora de representar [math]f_{n}[/math] en el intervalo [math][1,3][/math] se corresponda con la función [math]f(x)[/math] original.

A continuación, se muestra el código con el cual se han obtenido los coeficientes de [math]g(x)[/math] asociados al intervalo [math][-1,1][/math]. El ejemplo se muestra para tres casos, la aproximación con 5, 10 y 20 coeficientes.

% Definimos las funciones
f = @(x) (x .* exp(-x));
funa = @(x, n) sin(pi*n*x) .* ((x+2) .* exp(-(x+2)));
funb = @(x, n) cos(pi*n*x) .* ((x+2) .* exp(-(x+2)));
fun0 = @(x) ((x+2).* exp(-(x+2)));

% Tolerancia para el método del trapecio
xx=-1:10^(-3):1;

%numero de terminos
terminos=[5,10,20];
k=1
for i=terminos
    
    % Inicializar un vector para almacenar los resultados
    results = zeros(i, 1);
    
    % Calcular las integrales para n desde 1 hasta 20
    for n = 1:i
        % Utilizar la función integral para calcular la integral definida
        a_k(n) = trapz(xx,funa(xx, n)) ;
        b_k(n) = trapz(xx,funb(xx, n));
    end
    
    %veamos el termino a0
    a0 = trapz(xx,fun0(xx));
    
    % Mostrar los resultados
    disp('Resultados para cada n del seno:');
    disp(a_k);
    disp('Resultados para cada n del coseno:');
    disp(b_k);

En esta parte del código se ha obtenido la correspondiente serie de Fourier,

%Calculemos la serie de Fourier
    fn=@(x) a0/2;
    for n=1:i
        fn = @(x) a_k(n)*sin(n*pi*x)+ b_k(n)*cos(n*pi*x) + fn(x);
    end

Y finalmente, las gráficas donde se observa como se aproxima la serie de Fourier a la función original [math]f(x)[/math] en [math][1,3][/math]

Aproximación por Serie de Fourier para [math]f(x) = xe^{-x}[/math]
% Trazar la función
    x = linspace(1, 3, 1000);
    subplot(1,3,k)
    plot(x,f(x),'b')
    hold on
    plot(x,fn(x),'r--')
    title('Comparación f y fn para n='+ string(i)); % Título del gráfico
    legend( 'f(x)','fn(x)')
    grid on; % Activar la cuadrícula
    hold off
    k=k+1
end

Con este ejemplo se puede observar como se puede aproximar una función en un intervalo de la forma [math] [a,b] [/math] a través de la Serie de Fourier. Además, destacar como se observa que según aumente el número de coeficientes de Fourier empleados, la aproximación se asemeja más a la función objeto.

5 Aproximación de una función con base trigonométrica compleja

Una vez trabajado con bases trigonométricas reales, se verá como se puede trabajar con una base trigonométricas compleja. La base trigonométrica compleja en un intervalo [math] [-T,T] [/math] es de la forma [math]\{ e^{\frac{\pm inx\pi}{T}} \} [/math].

La serie de Fourier compleja es de la forma,

[math]f= \sum_{i=- \infty}^{\infty} c_{k} e^{i \cdot 2nx\pi}[/math]

donde cada coeficiente complejo se obtiene de la siguiente manera,

[math] c_{k} = \frac{1}{2T} \int_{-T}^{T} f(z) e^{\frac{-i\cdot nz\pi}{T}} \, dz [/math]

En el espacio [math]L^{2}[-T,T][/math] de funciones que toman valores complejos, el producto escalar,

[math] (f,g)_{L^{2}} =\int_{-T}^{T} f(x) \overline{g(x)} \, dx [/math]

toma valores complejos. Por tanto, los coeficientes de Fourier serán número complejos, a pesar de que las funciones tomen valores reales.


Esto se particularizará para el intervalo [math][0,1][/math] y la función [math]f(x) = 4x \cdot \Bigl(\frac{1}{2} - x\Bigl)^{2}[/math].

Repitiendo el proceso de la sección anterior para definir el intervalo donde se puedan calcular los coeficientes (complejos) de Fourier, se debe tomar [math]T=\frac{1}{2}[/math], entonces el intervalo será [math]\Bigl[-\frac{1}{2},\frac{1}{2}\Bigl][/math].

Entonces la base de este caso particular será:

[math] \{ e^{\pm i \cdot 2nx\pi} \} [/math]

Nuevamente como se ha modificado el intervalo dado, se debe modificar la función con la cual se obtendrán los coeficientes. En este caso la función será [math]g(x) = f(x+T) = 4\Bigl(x+\frac{1}{2}\Bigl) \cdot \Bigl(\frac{1}{2} - \Bigl(x+\frac{1}{2}\Bigl)\Bigl)^{2}[/math].

En el siguiente código se obtendrán estos coeficientes para los primeros 5, 10 y 20 términos de la base.

Aproximación por Serie de Fourier para [math]f(x) = 4x \cdot \Bigl(\frac{1}{2} - x\Bigl)^{2}[/math]
% Definir las funciones
funa = @(z, n) (exp(1i *2* pi * n * z)).*(4*(z+1/2).*(1/2-(z+1/2)).^2);
fun0=@(z) (4*(z+1/2).*(1/2-(z+1/2)).^2);
f=@(z) (4*(z).*((+1/2-z).^2));

% Tolerancia para el método del trapecio
xx=-0.5:10^(-3):0.5;

terminos=[5,10,20];
k=1
for i=terminos
    % Inicializar un vector para almacenar los resultados
    a_k = zeros(i, 1);
    b_k = zeros(i, 1);
    
    % Calcular las integrales
    for n = 1:i
        % Utilizar la función integral para calcular la integral compleja
        a_k(n) = trapz(xx,funa(xx, n));
        b_k(n) = conj(a_k(n));
    end
    
    % Calcular a0
    a0 = trapz(xx,fun0(xx));
    % Mostrar los resultados
    disp('Resultados para cada a:');
    disp(a_k);
    disp('Resultados para cada b:');
    disp(b_k);
    
    %Serie de fourier para n=i
    fn = @(z) a0;
    for n=1:i
        fn= @(z) fn(z) + b_k(n).*exp(1i.*2*n.*pi.*z) + a_k(n).*exp(1i.*2*(-n).*pi.*z)
    end
    
    % Trazar la función
    x = linspace(0, 1, 1000);
    subplot(1,3,k)
    plot(x,f(x),'r','LineWidth',1.5)
    hold on
    plot(x,fn(x+1/2),'b')
    title('Comparación f y fn para n='+ string(i)); % Título del gráfico
    legend( 'f(x)','fn(x)')
    grid on; % Activar la cuadrícula
    hold off
    k=k+1
end

Con este ejemplo se pretendía mostrar como calcular una aproximación por Series de Fourier a partir de una base trigonométrica compleja.

Finalmente, destacar como a medida que se va aumentando el número de coeficientes de Fourier, la aproximación va experimentando una variación que hace que se aproxima más a la función objeto.

6 Referencias