Diferencia entre revisiones de «Series de Fourier (Grupo 2 1/2)»
(→Funciones discontinuas) |
(→Referencias) |
||
| (No se muestran 54 ediciones intermedias de 3 usuarios) | |||
| Línea 11: | Línea 11: | ||
== Base trigonométrica== | == Base trigonométrica== | ||
| − | Para una | + | 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: |
| − | + | ||
| − | + | <center> <math> \{ \frac{1}{2}, sen(\frac{n \pi x}{T}), cos(\frac{n \pi x}{T}) \}_{n \in \mathbb{N} } </math></center> | |
| − | [[Archivo: | + | |
| + | 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 | ||
x_values = linspace(-1, 1, 1000); | x_values = linspace(-1, 1, 1000); | ||
| − | + | num_functions = 6; | |
| − | num_functions = | + | |
seno = cell(1, num_functions); | seno = cell(1, num_functions); | ||
| − | + | legendss = cell(1, num_functions); | |
| − | + | ||
f = @(x) 1/2; | f = @(x) 1/2; | ||
| − | |||
for n = 1:num_functions | for n = 1:num_functions | ||
% Funciones seno | % Funciones seno | ||
seno{n} = sin(n *pi* x_values); | seno{n} = sin(n *pi* x_values); | ||
legendss{n} = ['f(x)=sin(', num2str(n), 'pix)']; | legendss{n} = ['f(x)=sin(', num2str(n), 'pix)']; | ||
| − | |||
| − | |||
| − | |||
end | end | ||
| − | |||
figure(1) | figure(1) | ||
for i = 1:num_functions | for i = 1:num_functions | ||
| Línea 45: | Línea 39: | ||
xlabel('x'); | xlabel('x'); | ||
ylabel('f(x)'); | ylabel('f(x)'); | ||
| − | end | + | end}} |
| + | [[Archivo: hscCos.png|350px|thumb|right|Término de la base <math> \cos(n\pi x)</math>]] | ||
| + | {{matlab|codigo= | ||
| + | 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) | figure(2) | ||
for i = 1:num_functions | for i = 1:num_functions | ||
| Línea 55: | Línea 59: | ||
xlabel('x'); | xlabel('x'); | ||
ylabel('f(x)'); | ylabel('f(x)'); | ||
| − | end | + | end}} |
| + | [[Archivo: Hsz1_2.png|300px|thumb|right|Término de la base <math> 1/2</math>]] | ||
| + | {{matlab|codigo= | ||
figure(3) | figure(3) | ||
plot(x_values,ones(size(x_values))*1/2,'DisplayName', '1/2') | plot(x_values,ones(size(x_values))*1/2,'DisplayName', '1/2') | ||
| Línea 69: | 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 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> | ||
| + | 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>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=== | ||
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: | 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: | ||
| Línea 81: | 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 90: | Línea 100: | ||
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. | 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. | ||
| + | [[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 [-1,0) | ||
| + | \end{cases}</math>]] | ||
{{matlab|codigo= | {{matlab|codigo= | ||
% Definir la función a integrar | % Definir la función a integrar | ||
| Línea 101: | Línea 115: | ||
xx=-1:10^(-3):0; | xx=-1:10^(-3):0; | ||
xxx=0:10^(-3):1; | xxx=0:10^(-3):1; | ||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | % Calcular las integrales para n desde 1 hasta 20 usando el método del trapecio adaptativo | + | %número de terminos |
| − | for n = 1:i | + | 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. | ||
| + | [[Archivo:Ejercicio2FourierManuelerrores.png|650px|thumb|right|sinmarco|Errores de la aproximación por la Serie de Fourier.]] | ||
| + | {{matlab|codigo= | ||
| + | |||
| + | 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_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)); | resultado_cos = trapz(xx,fb_impar(xx, n))+trapz(xxx,fb_par(xxx, n)); | ||
| Línea 116: | Línea 184: | ||
a_k(n) = resultado_cos; | a_k(n) = resultado_cos; | ||
end | end | ||
| − | + | for n=1:j | |
| − | + | ||
| − | + | ||
| − | + | ||
| − | + | ||
| − | + | ||
| − | + | ||
| − | + | ||
| − | + | ||
| − | + | ||
| − | + | ||
| − | + | ||
| − | + | ||
| − | + | ||
| − | + | ||
| − | + | ||
| − | + | ||
| − | + | ||
| − | + | ||
| − | + | ||
| − | + | ||
| − | + | ||
| − | + | ||
| − | + | ||
| − | + | ||
| − | + | ||
| − | + | ||
| − | + | ||
| − | + | ||
| − | for n=1: | + | |
fn = @(x) b_k(n) * sin(n*pi*x) + fn(x); | fn = @(x) b_k(n) * sin(n*pi*x) + fn(x); | ||
abs_diff = @(x) abs(f(x) - fn(x)).^2; | abs_diff = @(x) abs(f(x) - fn(x)).^2; | ||
| − | integral_result(n) = sqrt( | + | integral_result(n) = sqrt(trapz(xxx,abs_diff(xxx))); |
abs_diffneg = @(x) -abs(f(x) - fn(x)); | abs_diffneg = @(x) -abs(f(x) - fn(x)); | ||
[supremo(n), x_supremo(n)] = (fminbnd(abs_diffneg, 0, 1)); | [supremo(n), x_supremo(n)] = (fminbnd(abs_diffneg, 0, 1)); | ||
end | end | ||
| − | N=zeros( | + | N=zeros(j); |
| − | for n=1: | + | for n=1:j |
N(n)=n; | N(n)=n; | ||
end | end | ||
figure(2) | figure(2) | ||
| − | hold on | + | hold on |
| − | plot(N, log( | + | plot(N, log(abs(x_supremo))) |
| − | plot(N, log( | + | plot(N, log(integral_result)) |
xlabel('n'); % Etiqueta del eje x | xlabel('n'); % Etiqueta del eje x | ||
| − | ylabel(' | + | ylabel('Error'); % Etiqueta del eje y |
| − | title(' | + | 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 | grid on; % Activar la cuadrícula | ||
| − | hold off}} | + | 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. | ||
=== Funciones discontinuas=== | === Funciones discontinuas=== | ||
| Línea 183: | Línea 227: | ||
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. | 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. | ||
| − | [[Archivo: | + | [[Archivo: hscfns.jpeg|400px|thumb|right|Función <math>fn(x)</math> para <math>n=1,5,10,50</math>]] |
| + | |||
| + | |||
{{matlab|codigo= | {{matlab|codigo= | ||
| Línea 233: | Línea 279: | ||
[supremo(n), x_supremo(n)] = fminbnd(abs_diffneg, 0, 1); | [supremo(n), x_supremo(n)] = fminbnd(abs_diffneg, 0, 1); | ||
end | 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: | ||
| + | <center> <math>S_{N}={\frac{1}{N+1}} \sum_{i=0}^{N} f_{n}</math></center> | ||
| + | Pasamos ahora a ver las gráficas. | ||
| + | [[Archivo: hscsn.jpeg|400px|thumb|right|Función <math>Sn(x)</math> para <math>n=1,5,10,50</math>]] | ||
| + | {{matlab|codigo= | ||
| + | |||
Sn = @(x) 1/(i+1) * (Sn(x)); | Sn = @(x) 1/(i+1) * (Sn(x)); | ||
| Línea 267: | Línea 320: | ||
grid on; % Activar la cuadrícula | grid on; % Activar la cuadrícula | ||
hold off | hold off | ||
| − | + | }} | |
| + | [[Archivo: HscError.jpeg|400px|thumb|right|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. | ||
| + | {{matlab|codigo= | ||
N=zeros(i); | N=zeros(i); | ||
for n=1:i | for n=1:i | ||
| Línea 286: | Línea 342: | ||
}} | }} | ||
| − | + | ||
| − | + | 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. | |
| − | + | ||
== Cambio de intervalo == | == Cambio de intervalo == | ||
| Línea 354: | Línea 409: | ||
end | end | ||
}} | }} | ||
| − | Y finalmente | + | 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> |
[[Archivo:Ejercicio4FourierManuel.png|480px|thumb|right|sinmarco|Aproximación por Serie de Fourier para <math>f(x) = xe^{-x}</math>]] | [[Archivo:Ejercicio4FourierManuel.png|480px|thumb|right|sinmarco|Aproximación por Serie de Fourier para <math>f(x) = xe^{-x}</math>]] | ||
| Línea 457: | 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 | |
Contenido
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:
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:
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.
% 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
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
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.
Esto sería en el caso de una base general, en el caso de tener una base ortonormal, dichos coeficientes quedarían así:
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:
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:
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.
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.
% 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
endEn 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.
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á:
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] :
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.
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);
endAl 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:
Pasamos ahora a ver las gráficas.
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 offEn 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
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);
endY 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]
% 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
endCon 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,
donde cada coeficiente complejo se obtiene de la siguiente manera,
En el espacio [math]L^{2}[-T,T][/math] de funciones que toman valores complejos, el producto escalar,
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á:
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.
% 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
endCon 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
- Wikipedia. Series de Fourier.
- [Libro de Sandro Salsa. Partial Differential Equations in Action: From Modelling to Theory]