Datos de las olas del mar

A medida que sopla el viento, las fuerzas de fricción entre el aire y el agua origina elevaciones de la superficie del agua, que se van incrementando de altura, pudiendo alcanzar varios metros en las situaciones de temporal.

Los factores que determinan las olas generadas por el viento son los siguientes:

  1. La velocidad del viento
  2. La duración o el tiempo durante el cual el viento actúa
  3. La distancia a lo largo de la cual el viento sopla en la misma dirección

Las olas del mar no crecen indefinidamente, a partir de cierto momento la energía que el viento transmite al agua se disipa durante la rotura de la ola. La ola está plenamente desarrollada y no crece más.

Hay dos clases de olas por ejemplo, las que genera el viento en una tormenta que parecen caóticas y aquellas alejadas del foco productor que tienen un aspecto completamente diferente, formadas por largos picos y valles bien definidos que se propagan por la superficie del océano en calma.

En general, en la superficie del océano se propagan olas de altura y periodos variables que se mueven en diferentes direcciones. Esta es la razón por la que se estudia el estado de la superficie del mar de forma estadística.

Cuando medimos el estado de la superficie del océano desde una posición fija, las medidas aparecerán ciertamente irregulares. Observaremos una gran variabilidad en las alturas y periodos de las olas que van llegando.

Datos de las olas del océano

Hemos tomado de la web CDIP "The Coastal Data Information Program" los datos para la realización del análisis con MATLAB

En esta web se explica detalladamente, el proceso de adquisión y tratamiento de los datos tomados desde boyas.

Seleccionamos la pesataña Historic y en el margen izquierdo pinchamos en Subdirectories/Buoys para elegir una estación, por ejemplo, la número 067 situada en San Nicolas Island, California. En la página web que aparece, titulada San Nicolas Island, CA Conditions + Forecast seleccionamos en el margen izquierdo Single Run/Time series (xyz)

Vemos tres gráficas que corresponden a la representación gráfica de los desplazamientos X (Norte-Sur), Y (Oeste-Este) y Z (Vertical) en función del tiempo en la fecha (año, mes, día, hora y minuto) dada por UTC (Coordinated Universal Time) que es el estándar de tiempo. Es sinónimo de GMT (Greenwich Mean Time). En la página web de Wikipedia Tiempo Universal Coordinado se explica que es UTC y las zonas horarias respecto a UTC, pero esto no es importante para el análisis de los datos.

La figura (la original es más larga) muestra parcialmente el registro del desplazamiento vertical Z de las olas que van llegando a la boya situada en esta estación, el día 26 de marzo desde las 20:15:00 hasta las 20:45:00 hora UTC.

Pulsando el botón View data vemos los datos correspondientes a los gráficos. Si deseamos descargar los datos nos tenemos que fijar en el último campo de la cabecera. Error-free vectors: 100.0%. Si no marca el 100.0% quiere decir que faltan datos y seleccionamos en la parte superior otra fecha UTC hasta encontrar un fichero completo.

Cabecera

  Station: 06701
  Deployment latitude: 33 13.241' N
  Deployment longitude: 119 52.889' W
  Water depth(m):  335.28
  Local magnetic variation(deg): 13 E
  Data type: Datawell vectors
  Gauge type: Datawell Mark 3 directional buoy
  Sample rate(Hz): 1.280
  Field software version: datawell_acq v2
  Field station type: sun
  Method of analysis: Datawell
  GPS: yes
  Start time: 20140326201500 UTC
  End time:   20140326204459 UTC
  Sample length(hh:mm:ss): 00:30:00
  Total number of vectors:  2304
  Error-free vectors: 100.0%
  -----------------------------

La cabecera contiene información básica acerca del sensor: la posición, la frecuencia de muestreo, el tipo de boya, el tiempo inicial y final de la toma de datos, el número de datos y si están todos los datos 100.0% o se han perdido algunos de ellos. Para nuestro análisis los campos más importantes están marcados en letra negrita.

La correspondencia entre los datos es la siguiente. La frecuencia de muestreo es fs=1.280 Hz, por lo que el intervalo de tiempo entre dos medidas consecutivas es Δt=1/fs=1/1.280 s. Se han tomado muestras durante T0=30 minutos, o 1800 s, por lo que el número total de datos es N=30·60·1.280=2304.

Los datos

Los datos vienen en cuatro columnas:

  1. El tiempo UTC, en el formato YYYYMMDDhhmmss (Año, mes, día, hora, minuto, segundo)
  2. El desplazamiento en centímetros en la dirección Norte-Sur, Norte es positivo.
  3. El desplazamiento en centímetros en la dirección Oeste-Este, Oeste es positivo.
  4. El desplazamiento vertical Z en centímetros
YYYYMMDDhhmmss X(cm) Y(cm) Z(cm)
20140326201500 42 56 -48
20140326201501 37 38 -12
20140326201502 9 20 -8
20140326201502 -18 33 -34
..... ... ... ...
20140326204457 15 57 36
20140326204458 -29 20 63
20140326204458 -53 -12 71
20140326204459 -43 -46 63

Preparación de los datos

Seleccionamos en la página web los datos con el puntero del ratón, los copiamos y los pegamos en un documento nuevo Microsoft Word. Eliminamos la cabecera del fichero, dejando solamente las cuatro columnas de datos. Manteniendo pulsada la tecla Alt, con el ratón seleccionamos las tres primeras columnas y las eliminamos (cortar), quedando solamente la columna Z del desplzamiento vertical de las olas del mar en cm. Guadamos el texto sin formato en una carpeta accesible a MATLAB con el nombre olasZ.txt que se descarga en este enlace.

Importamos el fichero de datos olasZ seleccionando en el menú File/Import Data, en Output Type seleccionamos Column vectors. Obtenemos un vector cuyo nombre cambiamos a olasZ en la ventana Workspace. Obtenemos un nuevo vector z restando cada elemento de su valor medio, este es el vector con el que trabajaremos por lo que podemos borrar el vector inicial olasZ de la memoria.

>> z=olasZ-mean(olasZ);
>> mean(z)
ans = -8.5117e-016
>> clear olasZ

La estadística básica es el número de elementos del vector, la desviación estándar, el valor máximo y mínimo

>> length(z)
ans =        2304
>> std(z)
ans =   65.7688
>> max(z)
ans =  214.9002
>> min(z)
ans = -204.0998

Representamos los primeros 500 datos de los desplazamientos z en función del tiempo t.

Si t=0, es el tiempo en el que se ha tomado el primer dato, los instantes t en el que se ha tomado las sucesivas medidas del desplazamiento z de calculan del siguiente modo:

>> t=(0:length(z)-1)/1.28;

Siendo fs=1.280 Hz, la frecuencia de muestreo o Δt=1/fs=1/1.280 s. el intervalo de tiempo entre dos medidas consecutivas.

>> z=olasZ-mean(olasZ);
>> clear olasZ
>> t=(0:length(z)-1)/1.28;
>> plot(t,z)
>> xlabel('tiempo (s)')
>> ylabel('Desplazamiento (cm)')
>> title('Olas')

Utilizando los iconos Zoom y Pan bajo el menú de la ventana gráfica podemos seleccionar y ampliar, para ver con más detalle, los intervalos de tiempo en los que estemos más interesados.

Ajuste a la función de distribución de Gauss

Vamos a agrupar los datos en intervalos de anchura 20 cm

Por ejemplo, los datos de los desplazamientos verticales Z de las olas comprendidos en el intervalo entre -10 a 10 cm se representan mediante una barra centrada en 0 cuya altura es proporcional al número de datos que caben en dicho intervalo y se puede obtener mediante el siguiente comando.

>> sum(z>=-10 & z<10)
ans =   297

Los datos de los desplazamientos verticales Z de las olas comprendidos entre 10 y 30 cm se representan mediante una barra centrada en 20 cm, cuya altura es proporcional al número de datos que caben en dicho intervalo y se puede obtener mediante el siguiente comando.

>> sum(z>=10 & z<30)
ans =   276

La función hist realiza la tarea completa y devuelve el número de datos que caben en cada intervalo y el centro de cada intervalo.

>>  x=-220:20:220;
>> [num,center]=hist(z,x)
num =     0     1     5    25    34    57    80   150   149   226  
 267   297   276    242   170   144    77    49    20    19    10     5     1
center =  -220  -200  -180  -160  -140  -120  -100   -80   -60  
 -40   -20     0    20     40    60    80   100   120   140   160   180  
 200   220

Como podemos apreciar, al intervalo centrado en 0 y de anchura 20 cm le corresponde 297 medidas y al intervalo centrado en 20 cm le corresponden 276 medidas.

La altura de la barra la calculamos mediante la siguiente fórmula

p( x i )= N i N·Δx

Donde Ni es el número de desplazamientos que caben en el intervalo i, y Δx=20 cm es la anchura de cada intervalo. N=2304 es el número total de datos. La razón de dividir entre Δx es que la suma de las áreas de todas las barras de anchura Δx debe dar la unidad.

i p( x i )Δx= i N i N·Δx Δx= 1 N i N i =1

Ajustamos los datos a la función de distribución de Gauss.

f(x)= 1 2π σ exp( x 2 2 σ 2 )

Como podemos comprobar con Math Symbolic el área bajo la curva es la unidad

1 2π σ exp( x 2 2 σ 2 )dx=1

>> syms a positive;
>> syms x;
>> int('exp(-x^2/(2*a^2))/(sqrt(2*pi)*a)',x,-inf,inf)
ans =1

Creamos un script que realice las siguientes tareas:

  1. Cargue mediante el comando load el fichero olasZ.txt de los datos de las alturas registradas de las olas del mar.

  2. Cree un vector de desplazamientos verticales z de las olas cuya media sea cero, para ello se resta a cada dato de desplazamiento el valor medio.

  3. Sabiendo que el valor máximo es 214.9 y el valor mínimo -204.0998 cm de las alturas, se agrupan los datos de los desplazamientos en intervalos de 20 cm de anchura desde -220 cm a 220 cm

  4. A partir del número de datos Ni en cada intervalo i determinamos la altura p(xi) de cada una de las barras de anchura Δx.

  5. Utilizando la función nlinfit para realizar el ajuste de los datos p(xi) a una función que que depende de un parámetro σ. La función nlinfit devuelve el valor del parámetro σ (en el código af) de la función f(x) que mejor ajusta a los datos. Como podemos comprobar el valor af es próximo a la desviación estandar std(z) de los datos de los desplazamientos z.

  6. Represente en la misma ventana gráfica el diagrama de barras p(xi) y la función de distribución de Gauss f(x) que mejor ajusta a los datos..

load olasZ.txt;
z=olasZ-mean(olasZ);
clear olasZ

%tabla de frecuencias
x=-220:20:220;
num=hist(z,x);
frec=num/(sum(num)*20);

%ajuste a la función de distribución de Gauss
f=@(a,x) exp(-x.^2/(2*a^2))/(sqrt(2*pi)*a);
a0=std(z);  %valor inicial del parámetro
af=nlinfit(x,frec,f,a0)

hold on 
%diagrama de frecuencias
bar(x,frec,'c');
%representa la curva de ajuste
x=linspace(-200,200,100);
y=f(af,x);
plot(x,y,'r')
title('Ajuste a la función de Gauss')
xlabel('Desplazamiento')
ylabel('Frecuencia')
hold off
title('Desplazamiento de las olas del mar')

af =   64.6194 %parámetro de ajuste (sigma)
>> std(z)  %desviación estándar
ans =   65.7688