Anda di halaman 1dari 13

Series de Fourier

Las ondas armónicas continuas no existen realmente, ya que todos los movimientos ondulatorios están limitados
tanto espacial como temporalmente. Utilizando el análisis de Fourier y la transformada de Fourier se pueden
describir formas de ondas más complejas como las que producen los instrumentos musicales.
El análisis de Fourier surgió a partir del intento de éste matemático francés por hallar la solución a un problema
práctico, la conducción del calor en un anillo de hierro. Demostró que se puede obtener una función discontinua a
partir de la suma de funciones continuas. Esta tesis fue defendida por Fourier ante la Academia Francesa, lo que
motivó severas objeciones de los matemáticos más importantes de su época como Lagrange, Laplace, etc.

Funciones armónicas
En primer lugar, vamos a distinguir entre las magnitudes: amplitud A, frecuencia f y fase φ en la función
armónica
x=Asin(2πf·t+φ).
Dos amplitudes distintas, A=10 y A=5 y la misma frecuencia f=100 Hz, (el tiempo se mide en milisegundos, ms)

subplot(2,1,1)
t=0:0.1:50;
x=10*sin(2*pi*0.1*t); %amplitud 10
plot(t,x,'r')
xlabel('t(ms)')
ylabel('x')
title('Distinta amplitud')
ylim([-11,11])
grid on

subplot(2,1,2)
x=5*sin(2*pi*0.1*t); %amplitud 5
plot(t,x,'r')
ylim([-10,10])
xlabel('t(ms)')
ylabel('x')
ylim([-11,11])
grid on
La misma amplitud A=10, dos frecuencias distintas f=100 y f=200 Hz

subplot(2,1,1)
t=0:0.1:50;
x=10*sin(2*pi*0.1*t); %frecuencia, 100 Hz
plot(t,x,'r')
xlabel('t(ms)')
ylabel('x')
title('Distinta frecuencia')
ylim([-11,11])
grid on

subplot(2,1,2)
x=10*sin(2*pi*0.2*t); %frecuencia, 200 Hz
plot(t,x,'r')
xlabel('t(ms)')
ylabel('x')
ylim([-11,11])
grid on

Fases iniciales distintas: 0, π/2, π,3π/2, misma frecuencia f=100 Hz y misma amplitud A=10

subplot(4,1,1)
t=0:0.1:50;
x=10*sin(2*pi*0.1*t);
plot(t,x,'r')
xlabel('t(ms)')
ylabel('x')
title('Distinta fase inicial')
ylim([-11,11])
grid on

subplot(4,1,2)
x=10*sin(2*pi*0.1*t+pi/2);
plot(t,x,'r')
xlabel('t(ms)')
ylabel('x')
ylim([-11,11])
grid on

subplot(4,1,3)
x=10*sin(2*pi*0.1*t+pi);
plot(t,x,'r')
xlabel('t(ms)')
ylabel('x')
ylim([-11,11])
grid on

subplot(4,1,4)
x=10*sin(2*pi*0.1*t+3*pi/2);
plot(t,x,'r')
xlabel('t(ms)')
ylabel('x')
ylim([-11,11])
grid on
Una función periódica resultado de la superposición de tres funciones armónicas con distintas frecuencias,
amplitudes y fases iniciales
x=200sin(2πf·100+π/2)+100sin(2πf·200+π)+100sin(2πf·400+3π/2)

f=[100,200,400]; %frecuencias
A=[200,100,100]; %amplitudes
phi=[90,180,270]; %fases

subplot(2,2,1)
stem(f,A)
axis([0,500,0,210])
xlabel('Frecuencia')
ylabel('Amplitud')

subplot(2,2,2)
stem(f,phi)
axis([0,500,0,360])
xlabel('Frecuencia')
set(gca,'YTick',0:90:360)
set(gca,'YTickLabel',{'0',90','180','270','360'})
ylabel('Fase')

subplot(2,2,3:4) %resultante
t=(0:0.1:30)/1000; %milisegundos
x=zeros(1,length(t));
for i=1:length(f)
x=x+A(i)*sin(2*pi*f(i)*t+phi(i)*pi/180);
end
plot(t,x,'r')
xlabel('t(ms)')
ylabel('x')
title('Resultante')
ylim([-410,410])
set(gca,'XTick',(0:5:30)/1000)
set(gca,'XTickLabel',{'0','5','10','15','20','25','30'})
grid on
Función periódica
Una función es periódica de periodo P si hay un número P>0 tal que f(t+P)=f(t). Cualquier múltiplo n entero de P
es también periodo f(t+nP)=f(t)
La función f(t)=cos(2πt)+cos(4πt)/2, es la suma de dos funciones periódicas de periodos 1 y 0.5, respectivamente.
Como podemos ver en la gráfica f(t) es periódica con periodo P=1.
Las funciones cos(t) y cos (√2 t) son periódicas de periodo 2π y 2π/√2 respectivamente, pero la suma
f (t) = cos (t) + cos (√ 2 t)

no es periódica.

t=0:0.05:10;
x=cos(2*pi*t)+cos(4*pi*t)/2;
subplot(2,1,1)
plot(t,x);
xlabel('t')
ylabel('x')

subplot(2,1,2)
x=cos(2*pi*t)+cos(2*pi*sqrt(2)*t);
plot(t,x);
xlabel('t')
ylabel('x')
Serie de Fourier
A primera vista, parece que el problema de analizar formas de ondas complejas representa una tarea formidable.
Sin embargo, si la forma de la onda es periódica, se puede representar con una precisión arbitraria, mediante la
superposición de un número suficientemente grande de ondas senoidales que forman una serie armónica.
Toda función f(t) periódica de periodo 2P, se puede representar en forma de una suma infinita de funciones
armónicas, es decir,

a0 kπt kπt
f (t) = + ∑ (a k cos + b k sin )
2 P P
k=1

donde a0 a1 ...ak ... y b1 b2 .... bk .... son los denominados coeficientes de Fourier.
Teniendo en cuenta los resultados de las integrales
P π

mπt nπt P
∫ cos sin dt = ∫ cos(mt) sin(nt)dt = 0
P P π
−P −π

>> syms t m n;
>> evalin(symengine,'assume(n,Type::Integer)');
>> evalin(symengine,'assume(m,Type::Integer)');
>> int('sin(m*t)*cos(n*t)',t,-pi,pi)
ans =0

P π

mπt nπt P
∫ cos cos dt = ∫ cos(mt) cos(nt)dt
P P π
−P −π

P 0 m ≠ n
∫ (cos ((m + n)t) + cos ((m − n)t)) ⋅dt =  {
2π P  m = n
−π

>> y=int('cos(m*t)*cos(n*t)',t,-pi,pi)
y=(2*(m*cos(pi*n)*sin(pi*m) - n*cos(pi*m)*sin(pi*n)))/(m^2 - n^2)
>> limit(y,m,n)
ans =pi*cos(pi*n)^2

Como n es entero, la respuesta es pi (π)

sin sin dt = sin(mt) sin(nt)dt


P π

mπt nπt P
∫ sin sin dt = ∫ sin(mt) sin(nt)dt
P P π
−P −π

P 0 m ≠ n
∫ (− cos ((m + n)t) + cos ((m − n)t)) ⋅dt =  {
2π P  m = n
−π

>> y=int('sin(m*t)*sin(n*t)',t,-pi,pi)
y =-(2*(m*cos(pi*m)*sin(pi*n) - n*cos(pi*n)*sin(pi*m)))/(m^2 - n^2)
>> limit(y,m,n)
ans =pi*cos(pi*n)^2

Los coeficientes del desarrollo en serie valen


P

1 kπt
ak = ∫ f (t) cos dt 
P P
−P

1 kπt
bk = ∫ f (t) sin dt
P P
−P

La suma parcial de las series de Fourier es


n
a0 kπt kπt
s n (t) = + ∑ (a k cos + b k sin )
2 P P
k=1

Si la función f(t) tiene simetría, algunos de los coeficientes resultan nulos.


Si f(t) es una función par,f(t)=f(-t), los términos bk son nulos
Si f(t) es impar f(t)=-f(-t), los coeficientes ak son nulos

Función par

Por ejemplo, para el pulso rectangular simétrico de anchura 1, y periodo 2 se obtienen los siguientes coeficientes.

0.5

1
a0 = ∫ dt = 1
1
−0.5

0.5
⎧ 0 k par
1 2 kπ
ak = ∫ cos (kπt) dt = (sin ( ))  ⎨ 2 (k−1)/2
1 kπ 2 ⎩ (−1)  k impar
−0.5 kπ

Vamos a reconstruir la función f(t) a partir del desarrollo en serie de Fourier.


1 2 cos(πt) 2 cos(3πt) 2 cos(5πt) 2 cos(7πt)
s n (t) = + − + − + ...
2 π 3π 5π 7π

Elaborar el script fourier_1 en el que


Se establezca mediante el comando input el número n de términos del desarrollo en serie, sin contar el primero
a0/2.
Dibuje la función f(t) entre -1 y +1 en color azul y con ancho de línea 2.
Dibuje la aproximación a la función sumando n términos del desarrollo en serie en color rojo de anchura de
línea 1.
n=input('Número de términos: ');
hold on
x=[-1 -0.5 -0.5 0.5 0.5 1];
y=[0 0 1 1 0 0];
plot(x,y,'b')
x=linspace(-1,1,100);
y=zeros(length(x),1);
for i=1:length(x)
y(i)=1/2;
for k=1:2:n
y(i)=y(i)+(-1)^((k-1)/2)*2*cos(k*pi*x(i))/(k*pi);
end
end
plot(x,y, 'r');
title(sprintf('Aproximación de Fourier: %i términos',n))
xlabel('t'); ylabel('f(t)')
hold off

Función impar

Sea ahora la función

Es una función impar, los coeficientes akson nulos


0 1
⎧ 0 k par
1
bk = ∫ sin (kπt) dt − ∫ sin (kπt) dt = (−2 + 2 cos(kπ)) = ⎨ −4
kπ ⎩  k impar
−1 0 kπ

El desarrollo en serie es
4 sin(πt) 4 sin(3πt) 4 sin(5πt) 4 sin(7πt)
s n (t) = − − − − + ...
π 3π 5π 7π
Escribir el script fourier_2 en el que
Se establezca mediante el comando input el número n de términos del desarrollo en serie.
Dibuje la función f(t) entre -1 y +1 en color azul y con ancho de línea 2.
Dibuje la aproximación a la función sumando n términos del desarrollo en serie en color rojo de anchura de
línea 1.

n=input('Número de términos: ');


hold on
x=[-1 -1 0 0 1 1];
y=[0 1 1 -1 -1 0];
plot(x,y,'b','linewidth',2)
x=linspace(-1,1,100);
y=zeros(length(x),1);
for i=1:length(x)
y(i)=0;
for k=1:2:n
y(i)=y(i)-4*sin(k*pi*x(i))/(k*pi);
end
end
plot(x,y, 'r');
title(sprintf('Aproximación de Fourier: %i términos',n))
xlabel('t'); ylabel('f(t)')
hold off

Desarrollo en serie de Fourier con MATLAB


En MATLAB la función heaviside(t) se define del siguiente modo:
⎧ 0 t < 0

u(t) = ⎨ 0.5 t = 0


1 t > 0

Vamos a elaborar un script que nos permita obtener el desarrollo en serie de Fourier de una función f(t) periódica
de periodo 2P.
Definimos primero, la función escalón

0 t < a
f (t) = {
1 t ≥ a

Describimos la función escalón mediante la llamada a la función heaviside(t-a)


La función pulso rectangular del primer ejemplo,
⎧ 0  t < −a

f (t) = ⎨ 1  − a ≤ t ≤ a


0 t > a

la definimos en MATLAB como heaviside(t+a)-heaviside(t-a), tal como vemos en la figura


La función f(t) cualesquiera que toma valores distintos de cero en el intervalo [a,b] se escribe
⎧ 0 t < a

(u(t − a) − u(t − b)) f (t) = ⎨ f (t) a ≤ t ≤ b




0 t > b

syms t k P n;
evalin(symengine,'assume(k,Type::Integer)');
a=@(f,t,k,P) int(f*cos(k*pi*t/P),x,-P,P)/P;
b=@(f,t,k,P) int(f*sin(k*pi*t/P),x,-P,P)/P;
fs=@(f,t,n,P) a(f,t,0,P)/2+symsum(a(f,t,k,P)*cos(k*pi*t/P)+b(f,t,k,P)*sin(k*pi*t/P),k,1,n);
f=heaviside(t+0.5)-heaviside(t-0.5);
P=1; %semiperiodo
pretty(fs(f,t,10,P))

En la ventana de comandos vemos el desarrollo en serie de Fourier de esta función periódica para n=10 términos

2 cos(pi t) 2 cos(3 pi t) 2 cos(5 pi t) 2 cos(7 pi t) 2 cos(9 pi t)


----------- - ------------- + ------------- - ------------- + ------------- + 1/2
pi 3 pi 5 pi 7 pi 9 pi

Para obtener el desarrollo en serie del segunda función solamente tenemos que cambiar la definición de la
función f(t) y del semiperiodo P.
⎧ 0  t < −1




1  − 1 ≤ t < 0
f (t) = ⎨
⎪ −1 0 ≤ t < 1




0 t ≥ 1

Esta función se escribe en MATLAB como, heaviside(t+1)-heaviside(t)-heaviside(t)+heaviside(t-1)=


heaviside(t+1)-2·heaviside(t)+heaviside(t-1)

....
f=heaviside(t+1)-2*heaviside(t)+heaviside(t-1);
P=1; %semiperiodo
pretty(fs(f,x,10,P))

En la ventana de comandos vemos el desarrollo en serie de Fourier de esta función periódica para n=10 términos

4 sin(pi t) 4 sin(3 pi t) 4 sin(5 pi t) 4 sin(7 pi t) 4 sin(9 pi t)


- ----------- - ------------- - ------------- - ------------- - -------------
pi 3 pi 5 pi 7 pi 9 pi

Sea la función periódica f(t)=t entre -1 y 1, vamos a dibujar la función y sus distintas aproximaciones.

syms t k P n;
evalin(symengine,'assume(k,Type::Integer)');
a = @(f,t,k,P) int(f*cos(k*pi*t/P),t,-P,P)/P;
b = @(f,t,k,P) int(f*sin(k*pi*t/P),t,-P,P)/P;
fs=@(f,t,n,P) a(f,t,0,P)/2+symsum(a(f,t,k,P)*cos(k*pi*t/P)+b(f,t,k,P)*sin(k*pi*t/P),k,1,n);

%definición de la fuerza y su semiperiodo P


%f=heaviside(t+0.5)-heaviside(t-0.5);
%f=heaviside(t+1)-2*heaviside(t)+heaviside(t-1);
f=t;
P=1;

N=6; %términos del desarrollo en serie


pretty(fs(f,t,N,P))

hold on
ezplot(f,[-P P])
hg=ezplot(fs(f,t,N,P),[-P P]);
set(hg,'color','r')
hold off
xlabel('t')
ylabel('f(t)')
title('Serie de Fourier')

%armónicos
figure
k=1:N;
ak=a(f,t,k,P);
bk=b(f,t,k,P);
subplot(2,1,1)
stem(ak)
xlabel('k');
ylabel('a(k)')

subplot(2,1,2)
stem(bk)
xlabel('k');
ylabel('b(k)')

Para estudiar otra función periódica basta cambiar la definición de la función f y el valor de su semiperiodo P.
Cambiando el valor de N se muestran más o menos términos del desarrollo en serie.

2 sin(pi t) sin(2 pi t) 2 sin(3 pi t) sin(4 pi t) 2 sin(5 pi t) sin(6 pi t)


----------- - ----------- + ------------- - ----------- + ------------- - -----------
pi pi 3 pi 2 pi 5 pi 3 pi

En la gráfica se representa la contribución de los N=6 primeros armónicos cada uno de los armónicos, en la parte
superior los coeficientes ak, y en la parte inferior los coeficientes bk. Por ser f(t)=t una función impar, ak=0,
La forma compleja de las series de Fourier
Teniendo en cuenta las relaciones
−iωt
e = cos ωt − i sin ωt

iωt
e = cos ωt + i sin ωt

El desarrollo en serie de Fourier



a0 kπt kπt
f (t) = + ∑ (a k cos ( ) + b k sin ( ))
2 P P
k=1

se expresa de la siguiente forma alternativa



a0 ak ikπt/P −ikπt/P
bk ikπt/P −ikπt/P
f (t) = + ∑( (e + e ) + (e − e ))
2 2 2i
k=1

a0 a k − ib k a k + ib k
c0 =  c k =  c −k =
2 2 2

ikπt/P −ikπt/P
f (t) = c 0 + ∑ (c k e + c −k e )

k=1

P

t 1 t
f (t) = ∑ c k exp (ikπ )   c k = ∫ f (t) exp (−ikπ ) dt
P 2P P
−∞
−P

donde P es el semiperiodo de la función periódica de periodo 2P

Pulso rectangular
P = π

⎧ A

a ⎪ k = 0 c 0 = a
1 −ikt
A π
ck = ∫ Ae dt = sin (ka) = ⎨
2π −a
kπ ⎪ A
⎩ k ≠ 0 c
⎪ k = sin (ka)

Escribir el script fourier_3 en el que


Se establezca mediante el comando input
el número n de términos del desarrollo en serie.
La semianchura a del pulso rectangular (menor que π)
Dibuje la función f(t) entre -π y +π en color azul y con ancho de línea 2.
Dibuje la aproximación a la función sumando n términos del desarrollo en serie (positivos y negativos) en color
rojo de anchura de línea 1.
Tomar A=1

a=input('Semianchura del pulso rectangular a<pi: ');


n=input('Número de términos: ');
hold on
x=[-pi -a -a a a pi];
y=[0 0 1 1 0 0];
plot(x,y,'b','linewidth',2)
x=linspace(-pi,pi,100);
y=zeros(length(x),1);
for j=1:length(x)
y(j)=0;
for k=-n:n
if k==0
y(j)=y(j)+a/pi;
else
y(j)=y(j)+sin(k*a)*exp(i*k*x(j))/(k*pi);
end
end
end

%ejes
plot([-4 4],[0 0],'k')
plot([0 0],[-0.2 1.2],'k')
%serie de Fourier
plot(x,real(y),'r');
title(sprintf('Aproximación de Fourier: %i términos',n))
xlabel('t'); ylabel('f(t)')
hold off

Pulso diente de sierra

P = π
π
1 A −ikt
A A k
ck = ∫ te dt = i cos (kπ) = (−1) i
2π −π
π kπ kπ

Escribir el script fourier_3 en el que


Se establezca mediante el comando input
el número n de términos del desarrollo en serie.
Dibuje la función f(t) entre -π y +π en color azul y con ancho de línea 2.
Dibuje la aproximación a la función sumando n términos del desarrollo en serie (positivos y negativos) en color
rojo de anchura de línea 1.
Tomar A=1

u n=inp t('Número de términos: ');


hold on
plot([-pi,pi],[-1 1],'b','linewidth',2)
x=linspace(-pi,pi,100);
y=zeros(length(x),1);
for j=1:length(x)
y(j)=0;
for k=-n:n
y(j)=y(j)+(-1)^k*1i*exp(i*k*x(j))/(k*pi);
end
end
%ejes
plot([-4 4],[0 0],'k')
plot([0 0],[-1.5 1.5],'k')
%serie de Fourier
plot(x,real(y), 'r');
title(sprintf('Aproximación de Fourier: %i términos',n))
xlabel('t'); ylabel('f(t)')
hold off

Energías Renovables ©EUITI de Eibar