Práctica 1. Introducción al matlab Estadı́stica – Facultad de Fı́sica Objetivos • Puesta en marcha de matlab • Entrada y salida de datos • Manejo de matrices • Representaciones gráficas sencillas 1 matlab matlab es al mismo tiempo un lenguaje y un entorno de programación técnica que permite cálculos numéricos de alto nivel y su visualización. Integra análisis numérico, cálculo matricial, proceso de señal y gráficos en un entorno sencillo. matlab incorpora aplicaciones especı́ficas llamadas toolboxes. Estos son colecciones especializadas de funciones y programas especiales de matlab (ficheros-M porque su nombre tiene extensión .M) para trabajar en clases particulares de problemas. Uno de ellos está dedicado a la estadı́stica. Este entorno permite una fácil extensión ya que el usuario puede escribir sus propias aplicaciones. La programación es más sencilla que los lenguajes tradicionales como Fortran o C. Las aplicaciones se guardan en ficheros-M que pueden ser empleados en cualquier momento. 2 Inicio matlab corre desde windows en los ordenadores PC compatibles del aula de informática. Para ponerlo en marcha se selecciona el icono en el administrador de programas. Se abre entonces una ventana llamada Ventana de Comandos (Command Window) desde la que se teclean los comandos. Tambien puede abrirse otra Ventana de Ayuda (matlab Help) en la que el acceso a las ayudas es el estándar de windows. Otra forma de obtener ayuda es utilizando el comando Help desde dentro de la ventana de comandos. Por último podemos encontrar un comando cuyo nombre no recordamos o buscar si existe información relativa a un tema con el comando lookfor seguido de una palabra clave (por ejemplo lookfor mode). Este comando busca una cadena de caracteres en la primera linea de comentario del texto de ayuda de todos los ficheros-M. Lo más importante es que la palabra clave no necesita ser una orden de matlab . 2 3 MATRICES La ventana de comandos funciona con un editor de tal manera que si un comando ha sido mal escrito puede recuperarse y modificarse con las teclas de flecha. Este editor es muy útil y se aprende su uso enseguida; es similar a un shell. Desde esta ventana se pueden iniciar otros procesos de windows o DOS utilizando el signo !. Ası́ !dir creará una ventana donde se listará un directorio. Cuando cerremos esta ventana, tendremos de nuevo control en la Ventana de Comandos. Si al final del comando se teclea un signo & entonces se abre una nueva ventana pero se sigue teniendo control en la Ventana de Comandos. Por ejemplo !notepad & abre una ventana con un editor notepad en un proceso independiente (background). A partir de ahora se sombrearán las expresiones que deban ser tecleadas en la pantalla. Con el sı́mbolo ←֓ se indica la tecla de retorno o intro que debe pulsarse al final del comando. No sombreados aparecerán los resultados proporcionados por matlab . Se recomienda la consulta de ’matlab edición del estudiante’ que se encuentra disponible en la biblioteca de la Facultad de CC. Fı́sicas (F681.3.06MATLAB), si se desea profundizar en el estudio de matlab . 3 Matrices Se pueden generar matrices de cuatro formas diferentes: • Tecleando la lista de elementos Por ejemplo A = [1 2 3; 4 5 6 ; 9 8 7] ←֓ A = 1 4 9 2 5 8 3 6 7 y esta matriz es reservada por matlab para su uso posterior. Otra manera de crear esta matriz serı́a, ≫ A =[1 4 5 9 8 2 3 ←֓ 6 ←֓ 7] ←֓ • Por medio de un fichero M Si en un fichero de extensión .M tenemos escrito A =[ 1 4 9 2 5 8 3 6 7 ] podemos introducir en memoria esta matriz A simplemente ejecutando el fichero. Si al editarlo le hemos llamado matriza.m entonces simplemente teclearemos ≫ matriza ←֓ y entonces el programa lee el fichero y genera la matriz. Prueba a editar tu propio fichero y a cargarlo en memoria. 3 3 MATRICES • Generándola con las funciones de matlab Los elementos de una matriz pueden ser cualquier expresión de matlab ; por ejemplo ≫ x = [-1.3 sqrt(3) (1+2+3)*4/5] ←֓ genera la matriz x = -1.3000 1.7321 4.8000 • Leyéndola de un fichero de datos Esta forma nos será muy útil ya que podremos cargar un gran volumen de datos que tengamos en un fichero ASCII normal. Existen formas más o menos complicadas para leer la información de ficheros escritos con diferentes formatos. De momento nosotros utilizaremos la más sencilla: lectura de datos de un fichero ASCII. Supongamos que queremos leer un fichero (RETIROT.DAT) que contiene los datos de temperatura media mensual medida en la estación meteorológica del parque de Retiro. Estos datos se encuentran en un fichero grabados de la siguiente forma (listado sólo en parte): 1940 3.8 8.2 11.8 12.8 15.6 19.3 24.0 24.1 19.2 12.0 7.8 3.8 1941 3.4 7.0 9.6 11.1 13.1 20.0 23.2 22.2 20.0 15.0 7.5 4.4 1942 4.8 4.4 10.0 12.2 16.2 20.9 23.8 23.4 18.9 15.0 8.6 5.6 1943 6.2 6.8 9.2 14.2 17.6 23.0 22.2 24.4 18.8 14.0 7.6 5.8 .......................................................................... 1955 8.4 6.7 8.3 14.8 18.6 20.4 24.4 23.9 19.3 13.9 8.8 7.7 .......................................................................... 1988 7.8 7.6 11.7 12.5 15.5 18.2 24.2 25.3 21.6 15.5 10.3 6.6 1989 6.7 8.7 12.6 11.0 18.4 22.2 26.7 26.0 19.8 16.6 11.9 9.5 1990 6.5 11.0 11.5 11.3 17.8 23.4 26.4 25.8 22.1 14.7 9.3 5.3 Vemos que están tabulados de forma que cada fila proporciona los datos de un año y que las columnas muestran los datos de cada mes. Ası́, por ejemplo, la columna 4 de la fila 3 contiene la temperatura media de marzo de 1942 que resulta ser 10o C. Para formar una matriz con esta tabla de datos sólo debemos leer el fichero con el comando load. Nuestros ficheros se encuentran en un directorio de trabajo llamado work y que es un subdirectorio de c:\matlab. Este subdirectorio es donde el comando load busca por defecto ası́ que el comando para situarnos en él (cd c:\matlab\work) no es necesario, ≫ load retirot.dat ←֓ Si el fichero se encontrara en la unidad de disco A:, teclearı́amos, ≫ load a:retirot.dat ←֓ La tabla ya está en memoria en la variable retirot, para comprobarlo tecleamos, ≫ whos ←֓ Name a retirot x Size 3 by 3 51 by 13 1 by 3 Elements Bytes Density 9 663 3 72 5304 24 Full Full Full Complex No No No 4 MANIPULACIÓN DE VECTORES Y MATRICES 4 y podemos ver que en memoria tenemos las variables que generamos antes (a y x) y retirot que es una matriz de 51 (años) por 13 (columna 1 que da el año + 12 meses). La temperatura media de marzo de 1942 será entonces el elemento (3,4) de la matriz. ≫ retirot(3,4) ←֓ ans= 10 En el siguiente apartado aprenderemos cómo seleccionar las temperaturas medias de un mes para un intervalo de años o cómo generar un vector que contenga las temperaturas medias de un cierto año. 4 Manipulación de vectores y matrices Los elementos de una matriz pueden ser referenciados con subı́ndices entre paréntesis ( ). En lo que sigue utilizaremos el signo % para escribir comentarios en este guión junto a los comandos que se deben utilizar. Continuando el ejemplo anterior, ≫ x ←֓ x = % % -1.3000 1.7321 ≫ x(2) ←֓ % x(2) = % 1.7321 % ≫ x(5) = abs(x(1)) ←֓ % x = % -1.3000 1.7321 para preguntar cuanto vale x valor de x 4.8000 para preguntar cuanto vale el segundo elemento respuesta del programa valor de x(2) aumentamos la matriz nuevo valor de x 4.8000 0 1.300 Debe notarse que la dimensión de la matriz ha crecido automáticamente para adaptarse al nuevo elemento y que x(4) vale cero al estar indefinido. Tambien pueden construirse matrices más grandes usando como elementos otras matrices menores. Por ejemplo para añadir una fila a la matriz A del ejemplo anterior, ≫ size(A) ←֓ ans= 3 3 ≫ r= [6 8 3]; ←֓ ≫ A= [A;r] ←֓ A = 1 2 4 5 9 8 6 8 ≫ size(A) ←֓ ans= 4 3 % Nos da el tamaño de la matriz A % % % % matriz 3×3 Construimos un vector de tres elementos (; calcula la expresion pero no imprime el resultado) y lo unimos a la matriz A 3 6 7 3 % Preguntamos la nueva dimension de A % matriz 4×3 4 MANIPULACIÓN DE VECTORES Y MATRICES 5 Tambien es posible extraer matrices que son parte de matrices (bloques) usando la notación de dos puntos (:), ası́ por ejemplo, ≫ A = A(1:3,:); ←֓ toma las tres primeras filas y todas las columnas de la matriz A actual, con lo cual A vuelve a ser la matriz que tenı́amos anteriormente. En esta expresión hemos utilizado de nuevo un signo de punto y coma (;) para que matlab calcule pero no nos imprima en pantalla el resultado de la operación. Los vectores se pueden generar de una manera sencilla usando el carácter (:). Por ejemplo, ≫ x = 1:5 ←֓ x= 1 2 % vector fila que contiene los numeros del 1 al 5 % con incrementos de la unidad 3 4 5 % incrementos diferentes de la unidad estan permitidos % valores de 0 a π ≫ y = 0:pi/4:pi ←֓ y= % con incrementos de π/4 0.0000 0.7854 1.5708 2.3562 3.1416 ≫ z = 6:-1:1 ←֓ z= 6 5 4 % Tambien se pueden emplear % incrementos negativos 3 2 1 Es evidente que este método nos sirve para generar tablas. Para que el formato sea tabular (vectores columna) podemos hallar la transpuesta del vector, utilizando en su definición el sı́mbolo (’). En los siguientes comandos generaremos un vector columna, calcularemos una función para esos valores y formaremos una matriz con esos dos vectores ≫ x = (0.0:0.25:3.0)’; ←֓ ≫ y= sin(x); ←֓ ≫ [x y] ←֓ 0 0.2500 0.5000 0.7500 1.0000 1.2500 1.5000 1.7500 2.0000 2.2500 2.5000 2.7500 3.0000 0 0.2474 0.4794 0.6816 0.8415 0.9490 0.9975 0.9840 0.9093 0.7781 0.5985 0.3817 0.1411 % x es un vector columna (signo ’ al final) % vector seno de los valores de x % matriz con dos columnas x e y 4 MANIPULACIÓN DE VECTORES Y MATRICES 6 Por lo tanto, utilizando el operador transpuesta se puede cambiar el formato de vector fila a vector columna y viceversa. Si directamente deseamos generar un vector columna utilizamos (;) entre sus elementos. Comprueba el resultado del comando ≫ c=[1;2;4] ←֓ . Otra forma de generar vectores consiste en utilizar las funciones logspace, que crea vectores formados por elementos espaciados logarı́tmicamente, y linspace que permite especificar el número de puntos en lugar del incremento. ≫ k = linspace (-pi,pi,4) ←֓ k= -3.1416 -1.0472 1.0472 3.1416 Como se vió antes los elementos de las matrices pueden referenciarse por medio de los subı́ndices. Ası́ si tenemos la matriz de antes A. ≫ A ←֓ A = 1 4 9 2 5 8 3 6 7 A(3,3) = A(1,3)+A(3,1) A = 1 2 3 4 5 6 9 8 12 % proporciona Un subı́ndice puede ser un vector. Para entender ésto veamos cómo se pueden seleccionar submatrices a partir de una matriz. Si T es una matriz de 6 × 6, entonces T1 = T(1:2,2:4); genera una matriz 2 × 3 formada por las filas 1 y 2 y las columnas 2, 3 y 4. Y para seleccionar una sola columna (por ejemplo la tercera) de esa matriz escribirı́amos T2 = T(1:6,3). Se comprende que ésto nos será muy útil para seleccionar filas y columnas de una tabla de datos como veremos más adelante. Una construcción que nos será tambien de utilidad es la siguiente ≫ A = [1 2; 3 4; 5 6] ←֓ % Construimos una matriz A A = 1 2 3 4 5 6 % El vector b contiene los valores de A ≫ b = A(:) ←֓ b = 1 3 5 2 5 REPRESENTACIONES GRÁFICAS SENCILLAS 7 4 6 es decir que hemos convertido la matriz 2×2 en un vector columna. Siguiendo el ejemplo de las temperaturas medias que almacenamos en la variable retirot, seleccionemos los datos que corresponden a la temperatura de enero a lo largo de todo el intervalo 1940-1990. ≫ t1 = retirot(:,2); ←֓ ≫ fecha = retirot(:,1); ←֓ %vector temperatura de enero (2a columna) % vector fecha (1a columna) Con el segundo comando hemos almacenado en el vector fecha la serie de años que cubren nuestros datos. De igual manera podemos almacenar en un vector la variación anual de la temperatura media para 1955. Como los datos empiezan en 1940, la fila que corresponde a 1955 es la 16. Podemos comprobarlo, ≫ retirot(16,1) ←֓ ans= 1955 ≫ t1955 = retirot(16,2:13) ←֓ % Preguntamos la fecha en la linea 16 % Efectivamente es 1955, luego % contiene los valores de la linea 16 El vector t1955, que contiene los datos requeridos, es el resultado de recortar la matriz entre las columnas 2 y 13 (meses de enero a diciembre). 5 Representaciones gráficas sencillas Vamos a utilizar los ejemplos anteriores para aprender a realizar gráficas del tipo y frente a x. La variación anual de la temperatura media durante el año 1955 está almacenada en el vector t1955 y la podemos representar con el comando plot, ≫ plot(t1955) ←֓ Abre una ventana de windows para los gráficos y representa el vector t1955 frente a su ı́ndice. Se puede apreciar que la temperatura media es mayor en los meses de verano, como esperábamos. Se pueden probar alternativas en otros colores como el verde, ≫ plot(t1955,’g’) ←֓ ≫ plot(t1955,’ro’) ←֓ % en color verde o con simbolos % como un circulo (en rojo) Para ver qué sı́mbolos y qué colores puedes utilizar busca la ayuda de plot tecleando help plot o mira la tabla al final de este guión. Tambien podemos representar la variación estacional en otro año (1966 por ejemplo) y comprobar si es parecida, 5 REPRESENTACIONES GRÁFICAS SENCILLAS 8 ≫ t1966 = retirot(27,2:13) ←֓ % vector con los datos de 1966 % lo representamos ≫ plot(t1966) ←֓ si queremos ver ambas gráficas a la vez pintamos una y luego la otra pero sin borrar la anterior utilizando el comando hold que mantiene la pantalla con los dibujos anteriores hasta que tecleemos hold off, ≫ plot(t1955) ←֓ ≫ hold ←֓ ≫ plot(t1966) ←֓ % representamos los datos de 1955 % y en el mismo grafico % representamos los datos de 1966 Nosotros podemos elegir la forma y el color de la representación, por ejemplo la variación en 1955 en lı́nea verde y cı́rculos blancos y la de 1966 en cian con estrellas amarillas, ≫ ≫ ≫ ≫ ≫ ≫ hold off ←֓ plot(t1955,’g’) ←֓ hold ←֓ plot(t1955,’wo’) ←֓ plot(t1966,’c’) ←֓ plot(t1966,’y*’) ←֓ % % % % % % iniciamos un nuevo grafico representamos 1955 en verde mantenemos este grafico representamos 1955 en circulos blancos idem 1966 en cian idem 1966 en asteriscos amarillos Como ejercicio se puede representar cómo variaron a lo largo del intervalo de tiempo muestreado las temperaturas medias de enero, mayo y agosto. ≫ hold off ←֓ ≫ plot(t1) ←֓ % iniciamos un nuevo grafico % representamos enero (almacenado en vector t1) O mejor representamos un gráfico tipo y frente a x con temperaturas medias de enero para cada año ya que el indice de este vector representa años consecutivos desde 1940 que están almacenados en el vector fecha. ≫ plot(fecha,t1) ←֓ Tambien podemos elegir el color y tipo de sı́mbolo, ≫ plot(fecha,t1,’w+’) ←֓ % pinta con ’+’ de color blanco Si no estamos utilizando monitores de color, resulta útil pintar las lı́neas en estilos diferentes cuando varias funciones se representan en el mismo gráfico, 9 5 REPRESENTACIONES GRÁFICAS SENCILLAS ≫ ≫ ≫ ≫ ≫ mes = 1:12; ←֓ hold off ←֓ plot(mes,t1955) ←֓ hold on ←֓ plot(mes,t1966,’--’) ←֓ % % % % % nueva variable iniciamos un nuevo grafico otro formato plot(x,y) conservamos el grafico t1966 con otro tipo de linea Se pueden representar a la vez estas variables con un solo comando, ≫ hold off ←֓ % iniciamos un nuevo grafico ≫ plot(mes,t1955,mes,t1966,’--’) ←֓ Y ya para demostrar que el comando puede ser mucho más complicado y completo, ≫ ≫ ≫ ≫ ≫ x=linspace(0,2*pi,30); ←֓ % de 0 a 2*π en 30 pasos y1=sin(x); ←֓ % funcion seno y2=cos(x) ←֓ % funcion coseno hold off ←֓ % iniciamos un nuevo grafico plot(x,y1,’g:’,x,y2,’r--’,x,y1,’wo’,x,y2,’c+’) ←֓ Equivalencia de sı́mbolos en los gráficos Sı́mbolo y m c r g b w k yellow magenta cyan red green blue white black Color amarillo morado cian rojo verde azul blanco negro Sı́mbolo . o x + * : -- Estilo de lı́nea puntos cı́rculos aspas cruces asteriscos lı́nea continua idem punteada idem de trazos Operaciones con vectores (a,b vectores; c escalar) suma escalar multiplicacion escalar suma de vectores multiplicacion de vectores division de vectores potencia de vectores sumatorio de elementos suma acumulada de elementos productorio de elementos producto acumulado de elementos a+c = [a1 +c a2 +c ... an +c] a*c = [a1 *c a2 *c ... an *c] a+b = [a1 +b1 a2 +b2 ... an +bn ] a.*b = [a1 *b1 a2 *b2 ... an *bn ] a./b = [a1 /b1 a2 /b2 ... an /bn ] a.∧ c = [a1 ∧ c a2 ∧ c ... an ∧ c] c.∧ a=[c∧ a1 c∧ a2 ... c∧ an ] a./b = [a1 /b1 a2 /b2 ... an /bn ] sum(a)= a1 +a2 + ...+ an cumsum(a)= [a1 a1 +a2 ... a1 +a2 + ...+an ] prod(a)= a1 *a2 * ...* an cumprod(a)= [a1 a1 *a2 ... a1 *a2 * ...*an ]