Ajuste de datos a funciones armónicas

Vamos a emplear el procedimiento de mínimos cuadrados para ajustar un conjunto de datos (ti,xi) a la función

x= A0+A1cos(ωt)+ B1sin(ωt)

El criterio de ajuste se toma como aquél en el que la desviación cuadrática media sea mínima, es decir, debe de ser mínima la suma

S= i=1 N { x i ( A 0 + A 1 cos(ω t i )+ B 1 sin(ω t i )) } 2 S A 0 =0N· A 0 +( i=1 N cos(ω t i ) ) A 1 +( i=1 N sin(ω t i ) ) B 1 = i=1 N x i S A 1 =0( i=1 N cos(ω t i ) ) A 0 +( i=1 N cos 2 (ω t i ) ) A 1 +( i=1 N sin(ω t i )cos(ω t i ) ) B 1 = i=1 N x i cos(ω t i ) S B 1 =0( i=1 N sin(ω t i ) ) A 0 +( i=1 N cos(ω t i )sin(ω t i ) ) A 1 +( 1 N sin 2 (ω t i ) ) B 1 = i=1 N x i sin(ω t i ) ( N i=1 N cos(ω t i ) i=1 N sin(ω t i ) ( i=1 N cos(ω t i ) ) ( i=1 N cos 2 (ω t i ) ) i=1 N sin(ω t i )cos(ω t i ) i=1 N sin(ω t i ) i=1 N cos(ω t i )sin(ω t i ) i=1 N sin 2 (ω t i ) )( A 0 A 1 B 1 )=( i=1 N x i i=1 N x i cos(ω t i ) i=1 N x i sin(ω t i ) )

Resolvemos el sistema de tres ecuaciones con tres incógnitas mediante el operador \ división a la izquierda para obtener el valor de los coeficientes A0, A1, B1.

Ejemplo:

La temperatura media en cada uno de los meses del año en un cierto lugar ha sido la siguiente

Mes Enero Febrero Marzo Abril Mayo  Junio  Julio  Agosto 
Temperatura 18.9 21.1 23.3 27.8 32.2 37.2 38.0 36.1
Mes Septiembre  Octubre  Noviembre  Diciembre 
Temperatura 34.4 29.4 23.3 18.9

El periodo P=12 meses, la frecuencia angular ω=2π/360 rad/dia.

Para crear una tabla (ti,xi), asignamos el valor de la temperatura media del mes al día correspondiente a la mitad del mes, suponiendo que todos los meses tengan los mismos días.

t=(1:12)-0.5; 
x=[18.9 21.1 23.3 27.8 32.2 37.2 38.0 36.1 34.4 29.4 23.3 18.9];
w=2*pi/12;

M=[length(t), sum(cos(w*t)), sum(sin(w*t))
sum(cos(w*t)), sum(cos(w*t).^2), sum(sin(w*t).*cos(w*t))
sum(sin(w*t)),sum(sin(w*t).*cos(w*t)), sum(sin(w*t).^2)]

C=[sum(x);sum(x.*cos(w*t));sum(x.*sin(w*t))];
A=M\C

hold on
plot(t,x,'ro','markersize',4,'markerfacecolor','r')
y=@(t) A(1)+A(2)*cos(w*t)+A(3)*sin(w*t);
fplot(y,[t(1),t(end)]);
xlabel('mes')
ylabel('temperatura °C')
title('Ajuste a funciones armónicas')
grid on
hold off

Corremos el script en la ventana de comandos

    M =
   12.0000   -0.0000    0.0000
   -0.0000    6.0000    0.0000
    0.0000    0.0000    6.0000
    A =
   28.3878
   -9.2559
   -2.8002

La función que mejor ajusta a los datos es

x=28.38789.2559cos( π 6 t )2.8002sin( π 6 t )

Observamos que los elementos de la matriz de los coeficientes del sistema de tres ecuaciones con tres incógnitas M son nulos excepto los de la diagonal principal. Esto se debe a las propiedades de las funciones armónicas (véase la figura más abajo). Cuando realizamos N=12 observaciones equiespaciadas tn=n-0.5, n=1,2...N. separadas Δt=P/N, siendo P=12 el periodo, se verifica que

i = 1 N sin ( ω t i ) = 0 i = 1 N cos ( ω t i ) = 0 i = 1 N sin 2 ( ω t i ) N = 1 2 i = 1 N cos 2 ( ω t i ) N = 1 2 i = 1 N sin ( ω t i ) cos ( ω t i ) = 0

Para demostrarlo, calculamos la suma de la progresión geométrica

n=1 12 exp( i 2π 12 ( n 1 2 ) ) =exp( i 2π 6 ) n=1 12 exp( i 2π 12 n ) = exp( i 2π 6 ) 1 ( exp( i 2π 12 ) ) 12 1exp( i 2π 12 ) =exp( i 2π 6 ) 1exp( 2πi ) 1exp( i 2π 12 ) =0

>> t=(1:12)-0.5;
>> sum(sin(2*pi*t/12))
ans =  -3.8858e-16
>> sum(cos(2*pi*t/12))
ans =  -6.6613e-16
>> sum(sin(2*pi*t/12).*cos(2*pi*t/12))
ans =  -3.8858e-16

Este resultado se puede generalizar para N medidas igualmente espaciadas en el periodo P

Despejamos los coeficientes A0, A1, B1en el sistema de tres ecuaciones con tres incógnitas

( N 0 0 0 N/2 0 0 0 N/2 )( A 0 A 1 B 1 )=( i=1 N x i i=1 N x i cos(ω t i ) i=1 N x i sin(ω t i ) ) A 0 = i=1 N x i N A 1 = 2 N i=1 N x i cos(ω t i ) B 1 = 2 N i=1 N x i sin(ω t i )

El análisis anterior se puede extender a un modelo general

x= A0+A1cos(ωt)+ B1sin(ωt)+ A2cos(2ωt)+ B2sin(2ωt)+...+ Amcos(mωt)+ Bmsin(mωt)

Para datos igualmente espaciados, los coeficientes valen

A 0 = i=1 N x i N A k = 2 N i=1 N x i cos(kω t i ) B k = 2 N i=1 N x i sin(kω t i ) k=1,2,...m

Posición del asteriode Pallas

Gauss estaba interesado en calcular de un modo preciso la órbita del asteroide Pallas, a partir de las observaciones de su posición.

Ascensión 0 30 60 90 120 150 180 210 240 270 300 330
Declinación 408 89 -66 10 338 807 1238 1511 1583 1462 1183 804

Disponía de 12 pares de datos (xi,yi) que deseaba interpolar con seis funciones armónicas.

y= A0+A1cos(ωx)+ B1sin(ωx)+ A2cos(2ωx)+ B2sin(2ωx)+...+ A6cos(6ωx)+ B6sin(6ωx)

x=0:30:330; 
y=[408 89 -66 10 338 807 1238 1511 1583 1462 1183 804];
hold on
plot(x,y,'ro','markersize',4,'markerfacecolor','r')

n=length(y);
w=2*pi/360;
a0=sum(y)/n;
k=1:6;
a=cos(w*k'*x)*y'*2/n;
b=sin(w*k'*x)*y'*2/n;

x=0:360;
y=a0+a'*cos(w*k'*x)+b'*sin(w*k'*x);
plot(x,y)

xlim([0 360])
xlabel('Ascensión (grados)')
ylabel('Declinación (minutos)')
title('Posición del asteroide Pallas')
grid on
hold off

Ejercicios

Ajustar un conjunto de datos (ti,xi) a la función

x= A0+A1cos(ωt)+ B1sin(ωt)

Mes Enero Febrero Marzo Abril Mayo  Junio  Julio  Agosto 
Iluminación 144 188 245 311 351 359 308 287
Mes Septiembre  Octubre  Noviembre  Diciembre 
Iluminación 260 211 159 131

ω=2π/12

t 0 0.15 0.3 0.45 0.6 0.75 0.9 1.05 1.2 1.35
x 2.2 1.595 1.031 0.722 0.786 1.2 1.805 2.369 2.678 2.614

ω=2π/1.5