Descargar

Tutorial de MATLAB para pronóstico numérico (Presentación PowerPoint)

Enviado por Pablo Turmero


    edu.red WIKIPEDIA: MATLAB es la abreviatura de MATrix LABoratory (laboratorio de matrices). Se trata de un software matemático muy versátil que ofrece un entorno de desarrollo integrado (IDE) con un lenguaje de programación propio (lenguaje M). Está disponible para las plataformas Unix, Windows y Apple Mac OS X. Entre sus prestaciones básicas se hallan: la manipulación de matrices, la representación de datos y funciones, la implementación de algoritmos, la creación de interfaces de usuario (GUI) y la comunicación con programas en otros lenguajes y con otros dispositivos hardware. El paquete MATLAB dispone de dos herramientas adicionales que expanden sus prestaciones, a saber, Simulink (plataforma de simulación multidominio) y GUIDE (editor de interfaces de usuario – GUI). Además, se pueden ampliar las capacidades de MATLAB con las cajas de herramientas (toolboxes); y las de Simulink con los paquetes de bloques (blocksets).

    edu.red Matlab tiene muchas capacidades y posibilidades. En esta breve introducción queremos resumir los comandos básicos que vamos a utilizar en las aplicaciones del curso. Definir variables numericas: eye es una función de matlab que calcula la matriz identidad del tamaño n (donde n es el número que va entre paréntesis). Algunas funciones similares son: >>rand(n,m) %Crea una matriz de numeros aleatorios entre 0 y 1 de tamaño nxm >>ones(n,m) %Idem pero una matriz de 1. >>zeros(n,m) %Matriz de ceros >>NaN(n,m) %Matriz de NaN (not a number).

    edu.red

    edu.red Matlab tiene integradas muchas funciones programadas en forma eficiente y que agilizan la programación de algoritmos más complicados. Un ejemplo de esto es la inversión de matrices que permite la resolución de sistemas lineales. En este caso, si queremos calcular la inversa de A no tenemos que programarlo sinó que podemos usar la función que viene con el programa.

    edu.red Algunas operaciones más: A’ calcula la transpuesta de A. A*B es el producto matricial entre A y B (los tamaños de A y B deben satisfacer las condiciones para que este producto se pueda calcular). A.*B es el producto interno o miembro a miembro entre A y B, para esto A y B deben tener la misma dimensión. A(:,1) me da la primera columna de A. A(1,:) me da la primera fila de A. A(1,2:4) me da las columans 2, 3 y 4 de A. A(1,[2 4]) me da las columnas 2 y 4 de A. A puede tener más de 3 dimensiones al igual que en fortran. size(A) me devuelve un vector con el tamaño de cada una de las dimensiones de A.

    edu.red Ejemplo de matriz tridimensional.

    edu.red Además de variables numéricas (matrices) el matlab permite definir variables CHARACTER y variables LOGICAS. Ejemplo de variable character A=‘/home/juan/WRF/’ %Esta es una variable character B=‘datos.dat’ C=strcat(A,B) %Esto concatena las variables. Ejemplo de variable lógica A=false

    edu.red Funciones mátemáticas disponibles….

    edu.red Funciones que actúan sobre vectores / matrices.

    edu.red Recomendaciones y aclaraciones generales

    edu.red Matlab I/O Matlab puede leer y escribir información en muchos formatos. A continuación damos algunos ejemplos simples. >>A=rand(3,3) %Defino una matriz A >>save mi_archivo.mat A %Guarda la matriz a en el archivo mi_archivo.mat >>save mi_archivo.mat %Guarda todas las variables definidas hasta el momento. El archivo mi_archivo.mat está en un formato definido por matlab. Para recuperar el valor de Guardado en el archivo, usamos el comando load. >>load mi_archivo.mat %recupera las variables guardadas en el archivo. Es importante tener en cuenta que si tenemos una variable A y hacemos load la variable A va a ser borrada y sus valores y dimensiones se cambiaran a los valores y dimensiones de la variable A guardada en el archivo.

    edu.red Matlab y Netcdf Las funciones que permiten leer y escribir archivos en formato netcdf utilizando Matlab vienen en un paquete aparte y se instalan por separado. Las funciones que permiten la lectura y escritura de archivos son las siguientes: ncload(‘mi_archivo.nc’,’variable1’,’variable2’,…) %Permite leer del archivo netcdf las variables variable1 y variable2 (si no se especifica carga todas las variables contenidas en el archivo). Esta instrucción permite leer las variables, pero no los atributos de las mismas (nombres, dimensiones, unidades, etc). ncsave(‘mi_archivo.nc’,’variable1’,’variable2’,…) %Reemplaza el valor de las variables en el archivo netcdf por el de las variables variable1… variable2. Esto permite modificar los valores, pero nuevamente no podemos cambiar las dimensiones ni los atributos de las variables o del archivo. Para modificar variables, dimensiones y atributos existen otros comandos que no vamos a utilizar en esta materia.

    edu.red Lectura y escritura en formato ASCII. Si el formato del archivo presenta solo números, y está ordenado de forma tal que tiene el mismo número de filas y columnas, entonces podemos leerlo directamente usando el comando LOAD con la opción –ascii >>load –ascii mi_archivo.txt De la misma manera podemos guardar una matriz en un archivo >>A=rand(10,10); %Defino una variable >>save –ascii mi_archivo.txt A %Guardo la variable A en forma de texto. Se puede leer archivos con formatos más complicados especificando el formato de lectura. Para eso existen los comandos fscanf , fprintf También se pueden leer archivos en formato binario como los generados por un programa fortran utilizando los comandos fread y fwrite

    edu.red SCRIPTS: Matlab posee su propio “languaje” (lenguaje “M”) que tiene elementos similares a los que se utilizan en fortran u otros lenguages. A continuación vamos a dar una breve revisión de la sintaxis de estos elementos en Matlab. A diferencia de fortran, los scripts de matlab no son programas compilados (aunque Matlab incluye una función que permite compilarlos y ejecutarlos en máquinas donde matlab no está instalado).

    edu.red IF >>If( a== 1) >> comandos si verdadero >>end Pruebas lógicas: == (igual), >, <, <=, >=, ~= (distinto). Por otra parte podemos combinar pruebas lógicas usando & (and) y | (or). If(a==1 & b==2) o bien if (a==1 | b==2) También podemos usar el ~ para negar la prueba If ~(a==1) Comandos si verdadero end En este caso la condicion resultará cierta si a no es 1. else y elseif tambíen son comandos relacionados.

    edu.red Ciclos for for i=1:30 A(i)=2*i; end La sintaxis es muy similar a la del fortran. Se puede variar el incremento en el for: for i=1:2:30 A(i)=2*i; end En este caso i aumenta de 1 a 30, pero saltando de 2 en dos 1 3 5 … El comando while también puede ser utilizado para repetir una operación mientras se cumpla una condición while condicion Repeticion end La condicion se escribe de la misma manera que en el caso del comando if.

    edu.red Funciones: Matlab brinda la posibilidad de definir nuestras propias funciones. Esto es algo análogo a lo que serían por ejemplo las subrutinas de un programa fortran. Ejemplo: %Funcion de calculo de las derivadas espaciales por diversos metodos. function [derivada]=diff_sh(variable,dx) nx=length(variable); %Para los puntos interiores. for i=2:nx-1 derivada=(variable(i+1)-variable(i-1))/(2*dx); %Veo que pasa en los bordes. Uso esquema atrasado y adelantado. derivada(1)=(variable(2)-variable(1))/dx; derivada(nx)=(variable(nx)-variable(nx-1))/dx; end Para usar la funcion uso: dudx=diff_sh(u,0.5)

    edu.red Graficado en Matlab Graficos de linea (graficado de un vector) plot(x) %Plotea el vector X como una serie de valores. plot(x,y) %Plotea los valores del vector y como función de los valores de x (x e y deben tener la misma longitud). plot(X,Y,'LineWidth',2,'Color',[.6 0 0]) %Podemos agregar atributos que controlan el espesor de la línea, el color, el estilo etc. Algunas de estas cosas se pueden abreviar. Ejemplo x = -pi:pi/10:pi; y = tan(sin(x)) – sin(tan(x)); plot(x,y,'–rs','LineWidth',2,… 'MarkerEdgeColor','k',… 'MarkerFaceColor','g',… 'MarkerSize',10)

    edu.red axis([0 1 0 1]) %Controla el rango de los ejes xmin xmax ymin ymax Si luego de hacer un gráfico queremos graficar otra curva, el gráfico orginal desaparece. Para eso debemos usar la instrucción “hold on” que nos permite graficar varias curvas en el mismo gráfico. Una vez generado el gráfico podemos ajustar muchas cosas manualmente utilizando el menú de la figura. A diferencia de GrADS, Matlab permite modificar y remodificar varios de los atributos del gráfico luego de que este fue generado. title(‘Titulo del grafico’) %El comando title permite agregar titulos a los graficos. legend(‘datos 1’,’datos 2’) %El comando legend genera un recuadro con los colores correspondientes a las lineas y nos permite nombrar cada una de ellas. xlabel(‘etiqueta del eje X') %Permite nombrar al eje x (lo mismo con ylabel para el eje y). print ('-dpng',’mi_figura.png’) %El comando print permite generar un png, gif, jpg, pdf, tiff entre otros a partir de la figura que estamos generando. Las figuras también pueden guardarse en el formato fig de matlab que permite seguir modificándolas.

    edu.red Graficado de superficies: Comandos para graficar superficies en 2D: pcolor(x,y,variable) %Plotea la variable “variable” como funcion de x y de y. Variable debe ser una matriz cuadrada, x e y pueden ser matrices o vectores. Este comando genera bordes negros entre celda y celda que se eliminan usando el comando “shading flat” o “shading interp” contour(x,y,variable) %idem pero grafico de contornos. contourf(x,y,variable) %idem pero grafico de contornos con sombreado. Para graficar una variable georeferenciada debemos tener matrices lat y lon con las coordenadas de cada punto y la matriz “variable” correspondiente a nuestros datos. pcolor(lon,lat,variable) %Plotea la matriz como función de la latitud y longitud de nuestros datos. La función quiver permite plotear vectores. “run colorbar” despliega la barra de colores una vez que hemos dibujado la matriz de datos.

    edu.red Procesamiento de archivos en formato NetCDF: En primer lugar, el importante tener en cuenta que MATLAB requiere librerías específicas para poder trabajar con los archivos *.nc. Estas librerías, Uds las tienen ubicadas en /home/alumnos/NETCDF_linux. Para poder utilizarlas, debemos agregarlas al “path” de MATLAB. – abran matlab en una terminal – Ir a: File–>set path–>add with subfolders y eligen ahí la carpeta NETCDF_linux Este procedimiento genera o modifica un archivo llamado “pathdef.m”. Para que Matlab reconozca las librerías, hay que abrirlo siempre desde el directorio en que lo creamos, o duplicar este archivo. – una manera de ver que esto haya funcionado es, en la línea de comandos de matlab escribir: >> ncbrowser Que abre una ventana que permite explorar las propiedades de un archivo *.nc. Busquen el archivo que bajaron anteriormente de los reanalisis de NCEP/NCAR y verifiquen su contenido. Comparen lo que observan con lo que obtienen escribiendo en una nueva terminal: > ncdump -h nombre_del_archivo

    edu.red Procesamiento de archivos en formato NetCDF: Otra cuestión importante a tener en cuenta es si las variables dentro del archivo están “packed” o “unpacked”. Las variables que están packed, deben ser transformadas mediante la siguiente relación para que tengan las magnitudes y unidades adecuadas: unpacked_data = ( packed_data * scale_factor ) + add_offset; Entonces, si el ncbrowser nos muestra un scale_factor distinto de 1 y un add_offset distinto de 0, debemos transformar la variable con la expresión anterior. Vamos a ver que existe un modo de evitar el tener que hacer esta transformación por nuestra cuenta … ¿Cómo abrimos el archivo en matlab? Empecemos por crear en el editor de MATLAB (o en cualquier editor de textos) el script “abre_netcdf.m”. La extensión *.m identifica los scripts de MATLAB, pero cuando queremos ejecutarlos desde la línea de comandos, hay que obviarla.

    edu.red Procesamiento de archivos en formato NetCDF: Escribimos en el script: clear all close all archivo='air.mon.ltm.nc'; nc=netcdf(archivo,'r') % el 'r' es por “read” variable='air'; temp=nc{variable,1} % el 1 implica que queremos que la transforme si la variable estuviese packed. Si no quisiera ver los resultados, incluyo el “;” size(temp) % Supongamos que queremos extraer el vector de latitudes: latitudes=nc{'lat',1}(:); longitudes=nc{'lon',1}(:); latitudes(1) % Noten que en este caso, la primera latitud corresponde al HN (90°N) ? tenemos que corregirlo porque queremos que el punto (1,1) del mapa corresponda al extremo SE

    edu.red Procesamiento de archivos en formato NetCDF: %para invertir las componentes de un vector: latitudes=flipud(latitudes); latitudes(1) %para invertir en una matriz una determinada dimensión: temp=flipdim(temp,3); % 3 es la dimensión asociada a las latitudes % calculemos el campo medio sobre todos los meses tm=squeeze(mean(temp,1)); % la dimensión 1 correponde a los tiempos % buscamos el nivel de 850 hPa y retenemos ese campo niveles=nc('level',1) for nlev=1:length(niveles) If niveles(nlev)==850 tm850=squeeze(tm(nlev,:,:)); end end

    edu.red Procesamiento de archivos en formato NetCDF: % para crear un mapa en proyección cilíndrica equidistante, se usa la % función axesm. Nosotros lo tenemos seteado en el script separado % mapa_sudamerica.m (Para conocer otras proyecciones y opciones: help axesm) mapa_sudamerica % preparamos las matrices con las coordenadas a partir de los vectores [xlon,xlat]=meshgrid(longitudes,latitudes); pcolorm(xlat,xlon,tm850) % si queremos que suavice la retícula shading interp % agregamos la barra de colores colorbar % un título title('Campo medio climatológico anual de temperatura en 850 hPa') % lo guardamos en formato png (para conocer otros formatos: help print) print('-dpng','temp_media_anual_850.png')