Una primera sesión de trabajo con MATLAB Grupo FMI Departamento de Matemática Aplicada, Universidad de Zaragoza http://www.unizar.es/fmi Versión actualizada en agosto de 2006 Índice 1. Aritmética elemental y asignaciones 3 2. Vectores y matrices 5 3. Listas implı́citas 7 4. Funciones 8 5. Vectorización de operaciones aritméticas 9 6. Algunos gráficos elementales 11 7. Detalles útiles 13 Esta guı́a ha sido desarrollada dentro del marco del Proyecto de Innovación Docente Guı́as de aprendizaje de Matlab para alumnos y profesores por los siguientes miembros de grupo Formación Matemática en Ingenierı́a: Francisco Javier Sayas (coordinador), Mercedes Arribas, Natalia Boal, José Manuel Correas, Francisco José Gaspar, Dolores Lerı́s, Andrés Riaguas y Marı́a Luisa SeinEchaluce. MATLAB (MATrix LABoratory) es un paquete interactivo para cálculo cientı́fico (aritmético y simbólico), basado en matrices. MATLAB es fácil de emplear y, en principio, no requiere del conocimiento de un lenguaje de programación. MATLAB concentra en un sólo programa un buen número de posibilidades de cálculo cientı́fico y es, hoy por hoy, uno de los entornos de trabajo más empleados en muy distintos campos de la Ingenierı́a. MATLAB sirve para: realizar cálculos aritméticos (como una calculadora); realizar cálculo simbólico (con la posibilidad de hacer operaciones como derivar funciones, calcular primitivas, etc) y exacto; programar en un lenguaje no compilado; realizar gráficos en dos y tres dimensiones; acceder a paquetes con aplicaciones tan diversas como el tratamiento de señales, la simulación de circuitos, métodos numéricos avanzados, simulación de sistemas dinámicos, redes neuronales etc. Hay dos modos de trabajo con MATLAB: trabajo interactivo (Workspace), donde el usuario realiza una consulta (escribe una operación) y el programa la ejecuta; trabajo programado (M-files), donde el usuario genera uno o varios ficheros con conjuntos de instrucciones MATLAB, que se pueden ejecutar repetidas veces (con distintos datos) desde el modo interactivo. De esta forma, el usuario puede incrementar las funciones disponibles en MATLAB, añadiendo las suyas propias. La versión de MATLAB utilizada en esta pequeña guı́a de iniciación es la 6.0. Advertencia. Como lenguaje de programación, MATLAB emplea las estructuras tradicionales de un lenguaje de nivel medio (bucles, condicionales, etc), pero sus posibilidades de manipulación de arrays o las estructuras de datos avanzadas lo hacen un lenguaje de muy alto nivel. Esta guı́a permite realizar una visita general por algunas órdenes sencillas de MATLAB mientras trabajamos de forma interactiva en el entorno Workspace, la sesión de trabajo que aparece por defecto cuando se abre la aplicación. Para avanzar en el conocimiento de MATLAB, recomendamos continuar con el Curso de MATLAB que hemos desarrollado los miembros del Grupo FMI. Por defecto, la carpeta de trabajo es la carpeta work aunque ésta se puede cambiar (véase la figura 1). A lo largo de esta guı́a de iniciación, cuando se muestran instrucciones en MATLAB, esto es, lı́neas precedidas del sı́mbolo “ %”, por simplicidad de edición se han omitido todas las tildes y caracteres no estándar (por ejemplo, la letra ñ). 2 Figura 1: Pantalla que se obtiene al iniciar una sesión de trabajo de MATLAB 1. Aritmética elemental y asignaciones El sı́mbolo >> es el prompt de MATLAB e indica que está listo para aceptar órdenes. Para ejecutar una orden basta pulsar la tecla ENTER. El nombre que se asigna por defecto a la salida es ans (abreviatura de answer). >> 2+2 ans = 4 >> 3-4 ans = -1 >> 2*2 ans = 4 >> 2/3 ans = 0.6667 >> (-2)^10 ans = 1024 3 >> a=3 a = 3 >> 5*a ans = 15 >> b=a/7 b = 0.4286 >> b=3*a; >> -b ans = -9 Unos breves comentarios sobre estas lı́neas: Las asignaciones en MATLAB se realizan como en cualquier lenguaje de programación, pero no requieren ningún tipo de declaración de variables (en una primera aproximación). Más adelante veremos que, por defecto, todas las variables son matrices y que los escalares se toman como un caso particular de matrices 1 × 1. Las operaciones se realizan siempre en aritmética de coma flotante de doble precisión. Un poco más adelante veremos cómo visualizar más cifras de un resultado. Lo que enseña MATLAB por defecto es (mucha) menos precisión de la que ha calculado. El efecto de escribir un punto y coma (;) al final de una instrucción es evitar que se muestre por pantalla su resultado, aunque sı́ se ejecuta. Si se utiliza el sı́mbolo %, a partir de allı́ se considera que la lı́nea está comentada. Para poder realizar operaciones con números complejos, MATLAB tiene reservada la letra i para la unidad imaginaria. Esto es una preasignación de la variable i, que no está bloqueada de ningún modo. Advertencia. En muchos contextos es más común llamar j a la unidad imaginaria. Por defecto MATLAB también tiene reservada esa letra para la unidad imaginaria. Si se realiza una asignación sobre cualquiera de las variables se pierde su valor. Para recuperarlo se puede borrar su valor (instrucción clear i) o reasignarlo (instrucción i=sqrt(-1)). >> i ans = 0 + >> i^2 ans = -1 >> (2+3i)/(4-i) 1.0000i % para multiplicar por i no hace falta * 4 ans = 0.2941 + 0.8235i >> (1+i)^2 ans = 0 + 2.0000i MATLAB distingue entre mayúsculas y minúsculas, razón por la cual la variable a y la variable A son distintas. El nombre de las variables sigue las reglas habituales de un lenguaje de programación: debe comenzar por una letra, aunque puede contener números; no debe contener espacios en blanco ni algún tipo de sı́mbolo reservado (coma, punto y coma, dos puntos, guión,...). Advertencia. Aunque MATLAB sı́ distingue entre mayúsculas y minúsculas, y por tanto es seguro emplear combinaciones de ambas en nombres de variables, las implementaciones en Windows no hacen estas distinciones para los nombres de los ficheros y, por consiguiente, de las funciones definidas sobre ficheros. Volveremos sobre este detalle en su momento. 2. Vectores y matrices Por defecto, todas las variables en MATLAB se tratan como arrays con dos ı́ndices, esto es, como matrices. No obstante, es más simple comenzar aprendiendo a manipular vectores, es decir, arrays numerados con un único ı́ndice. Advertencia. MATLAB distingue entre vectores fila y columna. Esto resulta poco natural si se entienden los vectores como algo distinto de las matrices (como ocurre en la mayorı́a de los lenguajes de programación), pero es conveniente acostumbrarse pronto a este detalle, puesto que es parte integrante de la filosofı́a matricial de MATLAB. >> a=[3,1,-5] % tambien se puede escribir [3 1 -5] a = 3 1 -5 >> a(3) % tercer elemento del vector a ans = -5 >> 3*a % escalar * vector ans = 9 3 -15 >> b=[-4 10 -6] b = -4 10 -6 >> a+b % vector + vector ans = -1 11 -11 >> 2+a % escalar + vector (!) 5 ans = 5 3 -3 >> b/2 % vector / escalar ans = -2 5 -3 >> d=[-1; 2] % vector columna d = -1 2 >> c=b’ % b’ = transpose(b) c = -4 10 -6 >> c=[-4;10;-6] % forma directa de escribir un vector columna c = -4 10 -6 La operación de adición de un escalar a cada elemento de un vector (o de una matriz) es matemáticamente chocante, pero se incluyó en versiones recientes de MATLAB por ser de gran utilidad en numerosas situaciones. La matrices se definen entre corchetes escribiéndolas por filas y se utiliza el punto y coma para separar una fila de otra. También se pueden separar los elementos de las filas con comas. Cada elemento de una matriz se reconoce por dos ı́ndices. >> A=[3 1 5; 2 1 2] % o con comas para separar los elementos de una fila A = 3 1 5 2 1 2 >> A’ % trasponemos la matriz, igual que ejecutar transpose(A) ans = 3 2 1 1 5 2 >> A(1,3) % elemento en la posicion (1,3) ans = 5 >> B=[2,-1,4;5,2,3] % ahora separando los elementos de una fila por comas B = 2 -1 4 5 2 3 >> A+B % suma de matrices ans = 6 5 7 >> C=[2 3 C = 2 -1 6 >> A+C ??? Error >> A+C’ ans = 5 5 >> D = [1 D = 1 5 1 >> 3*D ans = 3 15 3 >> A*D ans = 0 9 3 5 ; -1 3; 6 -2] 3 3 -2 % cuidado con las dimensiones using ==> + Matrix dimensions must agree. % dimensiones correctas para sumar 0 11 4 0 -1; 5 -4; 1 6] -1 -4 6 -3 -12 18 % funciona el producto de matrices 13 23 9 6 >> A*B % de nuevo las dimensiones... ??? Error using ==> * Inner matrix dimensions must agree. 3. Listas implı́citas las listas implı́citas son listas de números en las que se especifica el primer y último elementos y el incremento entre cada elemento de la lista. Su empleo es muy común en MATLAB, tanto para desarrollo de las capacidades gráficas como en cualquier nivel de programación. El resultado es siempre un vector fila. >> a=1:10 % si no se especifica nada, por defecto el incremento es 1 a = 1 2 3 4 5 6 7 8 9 10 >> b=1:2:10 b = 7 1 3 5 >> c=10:-1:1 c = 10 9 8 >> d=0:0.1:1 d = Columns 1 through 6 0 0.1000 Columns 7 through 11 0.6000 0.7000 7 9 7 6 5 4 3 0.2000 0.3000 0.4000 0.8000 0.9000 1.0000 2 1 0.5000 Otra forma de generar listas de número equidistantes es utilizando la función linspace en la cual hay que especificar como argumentos el primer elemento, el último elemento y el número total de elementos en la lista. >> linspace(0,20,11) ans = 0 2 4 4. 6 8 10 12 14 16 18 20 Funciones Las funciones básicas (trigonométricas, exponencial, logaritmo) están incorporadas a MATLAB. Puesto que el entorno MATLAB ha sido diseñado en un marco de fuerte componente matemática y numérica, el logaritmo log es el neperiano, no el decimal. >> sqrt(2) % raiz cuadrada ans = 1.4142 >> sqrt(-1) % recuperacion de la unidad imaginaria i ans = 0 + 1.0000i >> sin(3*pi/2) % pi esta predefinido ans = -1 >> cos(16) ans = -0.9577 >> log(3) % logaritmo neperiano ans = 8 1.0986 >> log(0) Warning: Log of zero. ans = -Inf >> log(exp(4)) ans = 4 >> abs(-5) % valor absoluto ans = 5 En el caso de vectores o matrices, estas funciones actúan sobre cada uno de los elementos. En el argot de MATLAB se dice que estas funciones ya están vectorizadas. La sección siguiente trata de este tema. >> a=[1,2,3]; >> sqrt(a) ans = 1.0000 1.4142 1.7321 >> sin(3*a) ans = 0.1411 -0.2794 0.4121 >> log(5*a) ans = 1.6094 2.3026 2.7081 >> A=[3 1 5; 2 1 2; 1 2 0]; >> sqrt(A) % raiz cuadrada elemento a elemento ans = 1.7321 1.0000 2.2361 1.4142 1.0000 1.4142 1.0000 1.4142 0 >> abs([1,-2,3,-5]) ans= 1 2 3 5 Advertencia. En el caso de matrices cuadradas exp(A) y sin(A) no son las funciones analı́ticas exponencial y seno ya que están funciones de MATLAB actúan elemento a elemento. Por la misma razón sqrt(A)*sqrt(A) no es A. 5. Vectorización de operaciones aritméticas El producto es, por defecto, la operación de producto de matrices. De la misma manera, las potencias de una matriz son los productos repetidos de una matriz por sı́ misma. El sı́mbolo 9 de división tiene un significado más complejo, relacionado con el producto por la inversa del denominador. Para realizar productos y divisiones elemento a elemento (operaciones vectorizadas), hay que emplear los sı́mbolos .* ./ mientras que .^2 (o expresiones parecidas con otros exponentes) sirve para elevar cada componente de una matriz o vector al exponente indicado. >> a=[1 6 -8]; >> b=[-2 3 -4]; >> a.*b % multiplicacion elemento a elemento ans = -2 18 32 >> a./b % division elemento a elemento ans = -0.5000 2.0000 2.0000 >> a^2 ??? Error using ==> ^ Matrix must be square. >> a.^2 % potencia elemento a elemento ans = 1 36 64 >> A=[1 6;-8 1]; >> B=[-2 3;-4 2]; >> A*B % producto matricial ans = -26 15 12 -22 >> A.*B % producto elemento a elemento ans = -2 18 32 2 >> A./B % dividimos elemento a elemento ans = -0.5000 2.0000 2.0000 0.5000 >> A.^2 ans = 1 36 64 1 >> A^2 % al ser una matriz cuadrada es equivalente a A*A ans = 10 -47 12 -16 -47 >> C=[4 1; 1 9] C = 4 1 1 9 >> C.^(1/2) % igual que ejecutar sqrt(C) ans = 2 1 1 3 >> C^(1/2) ans = 1.9899 0.2007 0.2007 2.9933 6. Algunos gráficos elementales Una de las caracterı́sticas más interesantes de MATLAB es la calidad, sencillez y portabilidad de sus capacidades gráficas. Vamos simplemente a crear unas gráficas sencillas para ir apreciando qué puede hacer MATLAB. Comenzamos con una gráfica lineal (bidimensional), que mostramos en la Figura 2. >> x=0:.01:2*pi; >> y=sin(x).^2; >> plot(y) 1 0.9 0.8 0.7 0.6 0.5 0.4 0.3 0.2 0.1 0 0 100 200 300 400 500 600 700 Figura 2: Representación gráfica de y = senx2 utilizando la orden plot(y) Observa la diferencia entre las figuras 2 y 3 y cuál es la diferencia entre las órdenes en MATLAB utilizadas. 11 >> plot(x,y) 1 0.9 0.8 0.7 0.6 0.5 0.4 0.3 0.2 0.1 0 0 1 2 3 4 5 6 7 Figura 3: Representación gráfica de y = senx2 utilizando la orden plot(x,y) El menú gráfico que incluye la ventana de gráficos del MATLAB permite con gran sencillez añadir texto, lı́neas y flechas a una gráfica, e incluso realizar un zoom La siguiente gráfica es tridimensional (Figura 4). >> >> >> >> >> x=-3:0.2:3; y=x; [xx,yy]=meshgrid(x,y); z=xx.^2+3*yy.^2; plot3(xx,yy,z) 40 35 30 25 20 15 10 5 0 3 2 3 1 2 0 1 0 −1 −1 −2 −2 −3 −3 Figura 4: Representación gráfica de z(x, y) = x2 + 3y 2 utilizando la orden plot3 12 Veamos la misma gráfica con la orden surf (Figura 5). Para cambiar el punto de vista se puede emplear el icono correspondiente a rotación del menú gráfico. >> >> >> >> >> x=-3:0.2:3; y=x; [xx,yy]=meshgrid(x,y); z=xx.^2+3*yy.^2; surf(x,y,z) 40 35 30 25 20 15 10 5 0 3 2 3 1 2 0 1 0 −1 −1 −2 −2 −3 −3 Figura 5: Representación gráfica de z(x, y) = x2 + 3y 2 utilizando la orden surf La cuestión gráfica en MATLAB llega a altos grados de sofisticación, ası́ que le dedicaremos un capı́tulo entero del curso que amplı́a esta guı́a. 7. Detalles útiles La orden clc limpia la pantalla de comandos. La orden clear elimina todas las variables no permanentes. Es posible borrar únicamente algunas de las variables del espacio de trabajo con la orden clear nombre_variable Y si tienes dudas sobre alguna función de MATLAB, tenemos la orden help nombre_funcion para consultar cualquier función del programa. Además hay un menú de ayuda más detallado en la parte superior derecha de la barra de menús. Se interrumpe una ejecución con Ctrl + C. Las teclas ↑ y ↓ permiten recuperar órdenes ejecutadas anteriormente. Tecleando primero un grupo de caracteres y empleando las flechas se puede recuperar un histórico de órdenes ejecutadas anteriormente que comienzan por esos caracteres. 13 Si se quiere guardar todo lo hecho, la orden diary nombre_fichero.txt permite grabar en un fichero texto la sesión de trabajo. Con diary off y diary on desactivamos y activamos la grabación en el fichero. who indica qué variables se están utilizando. whos da una información más amplia sobre el tamaño y tipo de variable. MATLAB tiene algunas variables especiales: pi es el número π. eps es el ε máquina, es decir, el número positivo más pequeño tal que 1 + ε 6= 1 en la unidad de coma flotante del ordenador. >> eps ans = 2.2204e-016 inf Infinito NaN (not–a–number) es una magnitud no numérica y se obtiene, por ejemplo, como resultado de indeterminaciones matemáticas del tipo (0/0) ó (∞ − ∞). realmin y realmax los números reales positivos, más pequeño y más grande respectivamente, que se pueden utilizar. MATLAB no tiene aritmética entera incorporada. Las operaciones con enteros son realizadas exactamente mientras ocurran dentro de la precisión máquina (hasta unas dieciséis cifras). Aún ası́, MATLAB reconoce en cierto modo que se trata de números enteros y devuelve los resultados como si estuviera realizando aritmética entera. En general MATLAB trabaja en aritmética de coma flotante de doble precisión. El usuario elige el usuario el formato de salida. Algunos formatos: format short es el formato por defecto; punto fijo y cuatro dı́gitos decimales format short e notación cientı́fica con cuatro dı́gitos decimales format long punto fijo y catorce dı́gitos decimales format long e notación cientı́fica con quince dı́gitos decimales format rat aproximaciones al número racional más cercano . 14 >> 2/3 ans = 0.6667 % formato por defecto >> format long >> 2/3 ans = 0.66666666666667 >> format long e >> 2/3 ans = 6.666666666666666e-001 >> format short >> 2/3 ans = 0.6667 >> format short e >> 2/3 ans = 6.6667e-001 >> format rat >> 2/3 ans = 2/3 >> format short >> 3^(-32) ans = 5.3966e-016 >> format long >> 3^(-32) ans = 5.396595277354290e-016 >> format rat >> 3^(-32) ans = 1/1853020188851841 15