You are on page 1of 63

cticas de Ana lisis Pra Matricial Aplicado y n de Me todos Ampliacio ricos con MATLAB Nume

Ion Zaballa

Indice general
1. Lo B asico 1.1. Introducci on . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1.2. Comienzo y Fin de una sesi on de MATLAB . . . . . . . . . . . . . . . . . . . . . 1.3. Sistema de Ayuda . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1.4. Edici on en la L nea de Comandos . . . . . . . . . . . . . . . . . . . . . . . . . . . 2. Matrices y Vectores 2.1. Generaci on de matrices expl citamente . . . . . . . . . . . . . . . . . . . . . . . . 2.1.1. Elementos de Matrices . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 2.1.2. Formatos de Salida . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 2.2. Manipulaci on de vectores y matrices . . . . . . . . . . . . . . . . . . . . . . . . . 2.3. Matrices a partir de funciones predenidas en MATLAB . . . . . . . . . . . . . . 2.4. Otras formas de generar matrices . . . . . . . . . . . . . . . . . . . . . . . . . . . 3. El Entorno de Trabajo de MATLAB 3.1. El Espacio de Trabajo . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3.1.1. Comandos save y load . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3.1.2. El Comando diary . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3.1.3. L neas de comentarios . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3.2. El Camino de b usqueda (SEARCH PATH) de MATLAB . . . . . . . . . . . . . . 3.3. Manipulaci on de cheros . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3.3.1. Ejecuci on de Programas Externos . . . . . . . . . . . . . . . . . . . . . . 4 4 5 6 7 9 9 11 12 14 20 22 24 24 25 26 26 27 29 30

3 4. Programaci on en MATLAB 4.1. Empezando a programar en MATLAB . . . . . . . . . . . . . . . . . . . . . . . . 4.1.1. Operadores relacionales y l ogicos . . . . . . . . . . . . . . . . . . . . . . . 4.1.2. Bifurcaciones y Bucles . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 4.1.3. Presentaci on de los resultados . . . . . . . . . . . . . . . . . . . . . . . . . 4.2. Scripts y Funciones . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 5. N umeros complejos y polinomio 5.1. N umeros Complejos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 5.2. C alculo con Polinomios . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 31 31 33 38 41 42 50 50 51 54 55 57 57 61 61 62

A. Funciones incorporadas en MATLAB A.1. Funciones que act uan sobre escalares . . . . . . . . . . . . . . . . . . . . . . . . . A.2. Funciones que act uan sobre vectores . . . . . . . . . . . . . . . . . . . . . . . . . A.3. Funciones que act uan sobre matrices . . . . . . . . . . . . . . . . . . . . . . . . . B. Consejos para el uso de Matlab en picasso B.1. Transferencia de cheros a picasso . . . . . . . . . . . . . . . . . . . . . . . . . . B.2. Primer uso de MATLAB . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

Cap tulo 1

Lo B asico

1.1.

Introducci on

Este documento pretende ser una gu a b asica para introducirse de forma personal en el uso de MATLAB y en relaci on con las asignaturas An alisis Matricial Aplicado y Ampliaci on de M etodos Num ericos. Por lo tanto, aqu s olo se cubrir an aquellos aspectos de MATLAB que tienen relaci on con la materia discutida en dichas asignaturas. En otros documentos, que se entregar an en clase, se plantear an ejercicios en base al contenido de esta gu a y que deben ser resueltos personalmente. Si se quiere disponer de una buena y completa gu a de MATLAB, mi recomendaci on es el libro MATLAB Guide de D. J. Higham y N. J. Higham, editado por SIAM. Aunque el origen de MATLAB estuvo ntimamente ligado a la manipulaci on y computaci on de y con matrices, durante los u ltimos a nos ha evolucionado de forma que hoy se puede considerar como un software de prop osito general para todas las ramas de la matem atica y la ingenier a desde el punto de vista num erico y computacional. Tambi en es posible el c alculo simb olico con MATLAB siempre que se disponga del toolbox apropiado; en este caso el Symbolic toolbox. Existen muchos otros toolboxes que, sobre la base del n ucleo de MATLAB, proporcionan funciones espec cas para el c alculo num erico de ciertas partes concretas de la matem atica, la ingenier a y otras ciencias. Si se quiere informaci on sobre los productos relacionados con MATLAB puede visitarse la p agina web de la empresa que lo desarrolla: www.mathworks.com. Trabajando con MATLAB se debe tener muy claro que las unidades b asicas son matrices (un escalar es, por lo tanto, una matriz 1 1), y que por lo tanto todas las operaciones se reeren a matrices. Se puede ejecutar MATLAB sobre cualquier sistema operativo. Se presupone que las pr acticas se realizar an en la sala de inform atica del Departamento de Matem atica Aplicada y EIO o en una 4

Lo B asico

de las aulas de ordenadores de la Facultad de Ciencias. En el primer caso, la sala est a compuesta de una serie de terminales gr acos conectados a un servidor de SUN Microsystems dotado del sistema operativo UNIX Solaris y cuyo nombre en internet es picasso.lc.ehu.es. En lo sucesivo hablaremos de picasso para referirnos a el. En el segundo caso se trata de un aula de ordenadores personales con sistema operativo MSWindows (en alguna de sus versiones). A partir de la versi on 6 los interfaces gr acos para los sistemas basados en MSWindows y UNIX son muy parecidos, as que hay muy pocas diferencias en el entorno de trabajo de MATLAB para ambos sistemas operativos. Adem as, las u ltimas versiones de MATLAB (desde Release 14MATLAB 7) corrigen algunas deciencias de edici on con el teclado en castellano (como la ubicaci on del s mbolo [ o el acento circunejo ^) que ten an las versiones anteriores para los sistemas UNIX. Esto signica que las explicaciones que damos en estas notas son, en su mayor a, de aplicaci on para MATLAB bajo ambos sistemas.

1.2.

Comienzo y Fin de una sesi on de MATLAB

Una sesi on de MATLAB se comienza de forma diferente seg un la plataforma sobre la que lo ejecutemos. En un PC o Mac basta hacer doble click con el bot on izquierdo del rat on sobre el icono de MATLAB. En picasso podemos ejecutar MATLAB en modo consola o utilizando un interfaz gr aco. En cualquier caso, se debe abrir primero una sesi on X: Escribir el username y password. Abrir una ventana de comandos command tool. Para ejecutar MATLAB en modo consola se debe abrir una xterminal y en ella escribir matlab -nodesktop. Para utilizar MATLAB en modo gr aco, que es m as sencillo, se debe escribir matlab y pulsar la tecla de entrada. Trabajando en picasso en modo gr aco, MATLAB puede consumir muchos recursos del sistema; principalmente si hay muchos usuarios conectados y dependiendo de la calidad de los terminales gr acos. Si este fuera el caso (que se nota por una excesiva ralentizaci on del sistema) es recomendable trabajar en modo consola. En este modo hay una serie de reglas que se recomienda utilizar y que se exponen en el Ap endice B. Trabajando en modo gr aco, bien sea bajo UNIX o MSWindows, una vez ejecutadas las acciones mencionadas, aparecer a el logotipo de MATLAB y a continuaci on una ventana parecida la que se muestra en la Figura 1.1 (la gura mostrada corresponde al release 14. En las nuevas versiones la ventana es diferente, pero todav a guarda un cierto parecido). Si es la primera vez que se ejecuta MATLAB, la ventana principal puede estar compuesta de otras varias, por ejemplo Launch Pad, Command History y Command Window. De momento s olo nos interesa la u ltima de ellas que es la ventana de comandos de MATLAB. Por ello, aunque no es estrictamente necesario, cerramos las dem as con un click del rat on en el s mbolo de cada ventana. En realidad hay otras ventanas ocultas que se pueden ir cerrando sucesivamente hasta que no quede m as que la ventana Command Window. Todas estas ventanas tienen, de momento, un inter es secundario y

Lo B asico

Figura 1.1: Ventana inicial de MATLAB. siempre se pueden volver a abrir seleccion andolas con el rat on en el men u view de la ventana principal. En la ventana de comandos de MATLAB aparece el s mbolo >> ( este es el prompt de MATLAB) y el cursor parpadeando. El programa est a preparado para recibir ordenes. Para nalizar la sesi on en cualquier sistema basta escribir el comando quit. Alternativamente se puede elegir Exit MATLAB en el men u File del men u principal. Cuando hablamos de usar un comando (por ejemplo quit), nos referimos a escribir detr as del prompt de MATLAB la palabra correspondiente (en este caso quit) y pulsar la tecla de entrada.

1.3.

Sistema de Ayuda

El sistema de ayuda de MATLAB es muy completo. Hay varios niveles de ayuda: desde demos hasta ayuda especializada para saber lo que hace una determinada funci on o comando. Empezando por lo u ltimo, si se quiere saber, por ejemplo, lo que es y hace el comando lu se teclea en la ventana de comandos help lu o helpwin lu. MATLAB responde, en la propia ventana de comandos (en el primer caso) y en una ventana aparte en formato m as bonito (en el segundo), explicando todo lo relativo a dicho comando. Lo anterior implica que se sabe lo que se busca. Hay niveles m as generales de ayuda. Por ejemplo, tecleando helpwin aparece una relaci on de las carpetas de MATLAB que contienen ayuda y una breve descripci on del contenido de cada carpeta. Pinchando en cada una de ellas se obtiene un listado con los comandos o funciones que hay en dicha carpeta. Al pinchar, de nuevo, en cada uno de ellos se obtiene una ayuda exhaustiva de lo que hace cada funci on. Los dos niveles de ayuda anteriores (help funci on y helpwin) est an disponibles tanto en modo gr aco como en modo consola. Si se trabaja en modo gr aco hay, adem as, una tercera posibilidad de ayuda m as general. Pinchando en Help en el menu principal de MATLAB y seleccionando Product Help aparecer a una nueva ventana como la de la Figura 1.2 con toda la ayuda de

Lo B asico

MATLAB. En la parte izquierda aparece un men u que se puede desplegar pinchando en el

Figura 1.2: La ventana de ayuda de MATLAB. . A partir de aqu se puede ir de un sitio a otro pinchando en el lugar apropiado s mbolo como en un navegador de internet.

1.4.

Edici on en la L nea de Comandos

Si se comete alg un error cuando se est a introduciendo un comando de MATLAB, no es necesario volver a reescribir todo de nuevo. Las teclas de echas o la combinaci on de la tecla ctrl y otra pueden ayudarte: ctrl- ctrl- Inicio Fin Esc Supr Backspace ctrl-p ctrl-n ctrl-b ctrl-f ctrl-r ctrl-l ctrl-a ctrl-e ctrl-u ctrl-d ctrl-h ctrl-k Reescribe la l nea anterior Reescribe la l nea siguiente Mueve el cursor un car acter hacia atr as Mueve el cursor un car acter hacia adelante Mueve el cursor una palabra a la derecha Mueve el cursor una palabra a la izquierda Mueve el cursor al comienzo de la l nea Mueve el cursor al nal de la l nea Borra la l nea Borra el car acter sobre el cursor Borra el car acter que est a delante del cursor Borra todo desde el cursor hasta el n de la l nea

No es necesario poner el cursor al nal de la l nea de comandos para que MATLAB reconozca la l nea entera, se puede dar entrada estando el cursor en cualquier punto de dicha l nea. Esto suele suceder cuando se ha observado un error al escribir y se mueve el cursor hacia atr as para corregir el fallo. Si se va a volver a utilizar un comando ya usado anteriormente (o parte de el), basta teclear unos pocos caracteres de dicho comando y entonces usar la tecla . MATLAB recordar a el u ltimo

Lo B asico

comando que comenzaba con esos caracteres. Sucesivas pulsaciones de producen la aparici on de los anteriores comandos que empiezan por las letras o s mbolos escritos. Tambi en se puede utilizar el cl asico sistema de copiar y pegar para producir ordenes en la l nea de comandos.

Cap tulo 2

Matrices y Vectores

Vectores y matrices son para MATLAB la misma cosa. Se pueden introducir matrices en MATLAB de varias formas: Introduciendo una lista expl cita de elementos. Generando matrices con funciones predenidas en MATLAB. Cargando matrices desde un chero de datos externo. Creando matrices con funciones denidas por el usuario/a a trav es de cheros M. En este cap tulo analizaremos cada una de estas formas de generar matrices y vectores.

2.1.

Generaci on de matrices expl citamente

La forma m as sencilla de introducir matrices es escribiendo expl citamente los elementos de la matriz. Las otras formas de generar matrices las iremos viendo posteriormente. Para obtener una matriz escribiendo sus elementos s olo hay que tener en cuenta unas pocas reglas: Los elementos de la matriz hay que introducirlos la a la. Los elementos de cada la deben estar separados por comas o espacios en blanco. Para indicar el nal de una la se debe escribir ;. La lista de todos los elementos debe estar encerrada entre corchetes, [ ]. 9

Matrices y Vectores

10

Debe observarse que el n umero de elementos en cada la debe ser el mismo; en caso contrario, MATLAB producir a un mensaje de error. Por ejemplo para introduir la matriz 16 3 2 13 5 10 11 8 A= 9 6 7 12 4 15 14 1 escribir amos: >> A=[16 3 2 13; 5 10 11 8; 9 6 7 12; 4 15 14 1] La respuesta de MATLAB, una vez pulsada la tecla de retorno, ser a: A = 16 3 2 5 10 11 9 6 7 4 15 14 13 8 12 1

A veces el n umero de elementos en cada la es muy grande y es preferible introducir una la en cada l nea, lo u nico que hay que hacer es terminar la l nea con tres puntos: . . . y teclear retorno. Por ejemplo >> A=[16 5 9 4 3 2 13; ... 10 11 8;... 6 7 12;... 15 14 1 ]

produce la misma matriz. De cualquiera de las formas la matriz introducida queda asignada a la variable A. Debe observarse que con MATLAB no hay que declarar las variables. Se podr a haber introducido la matriz sin asign arsela de forma espec ca a una variable. Por ejemplo, si escribimos >> [16 3 2 13; 5 10 11 8; 9 6 7 12; 4 15 14 1] MATLAB responde: ans = 16 3 2 5 10 11 9 6 7 4 15 14

13 8 12 1

Matrices y Vectores

11

Aunque nosotros no hemos asignado la matriz a ninguna variable, MATLAB se la asigna a la variable ans, que es una variable predenida en el sistema. Esta variable es como las dem as. Dado que A y ans son dos variables a las que les hemos asignado el mismo valor, el resultado de multiplicar A por s misma debe ser el mismo que el de multiplicar ans por s misma: >> A*A ans = 341 261 285 269

285 301 309 261

261 309 301 285

269 285 261 341

>> ans*ans ans = 341 285 261 301 285 309 269 261

261 309 301 285

269 285 261 341

MATLAB distingue entre may usculas y min usculas de forma que a y A son dos variables distintas. Para saber las variables que tienes denidas puedes usar el comand who. Estas tambi en aparecen en la ventana workspace. En el siguiente cap tulo se explica c omo acceder a esta ventana y lo que signica.

2.1.1.

Elementos de Matrices

En el ejemplo anterior los elementos de la matriz eran n umeros enteros, pero en realidad los elementos de una matriz pueden ser cualquier expersi on v alida de MATLAB. Por ejemplo >> x=[ -1.3 produce x = -1.3000 1.7321 4.8000 sqrt(3) (1+2+3)*4/5]

MATLAB dispone de un gran n umero de funciones elementales matem aticas, incluyendo valor absoluto abs, ra z cuadrada sqrt , exponencial exp , seno sin , etc. Todas ellas se usan m as o menos igual. As , para calcular 3 escribir amos sqrt(3). MATLAB no produce un error si se le pide la ra z cuadrada o el logaritmo de un n umero negativo, sino que devuelve el correspondiente n umero complejo. Tambi en proporciona muchas funciones matem aticas avanzadas como las funciones de Bessel o la funci on Gamma. Una lista de todas las funciones elementales con su uso se puede obtener utilizando la ayuda interactiva:

Matrices y Vectores >> helpwin

12

y haciendo doble click en /matlab/elfun y /matlab/specfun. En el Ap endice A se resumen algunas de la funciones m as importantes de MATLAB. Tambi en hay una serie de constantes predenidas: pi i j eps realmin realmax inf nan 3.14159265. . . la unidad imaginaria, 1. lo mismo que i. precisi on relativa de los n umeros en coma otante, 252 = 2,204e 16. Es decir distancia de 1.0 al siguiente n umero m as pr oximo en coma otante. n umero en coma otante m as peque no, 21022 . n umero en coma otante m as grande, (2 eps)21023 . innito. Se produce al dividir un n umero distinto de cero por cero. Not-A-Number. Se produce al evaluar expresiones como 0/0 o inf-inf.

2.1.2.

Formatos de Salida

En el ejemplo de m as arriba hemos podido observar que aparentemente MATLAB siempre responde redondeando los resultados de las operaciones correspondientes a cuatro cifras decimales. En realidad, los resultados puede presentarlos de diversas formas. Para ello se dispone del comando format. Estos son los posible formatos format format format format format format format format short long hex bank short e short g long e loose coma ja con 4 decimales(formato por defecto) coma ja con 15 decimales cifras hexadecimales n umeros con dos cifras decimales notaci on cient ca con 4 decimales notaci on cient ca o decimal, dependiendo del valor notaci on cient ca con 15 decimales intercala algunas l neas en blanco en las salida para facilitar la lectura (por defecto) elimina las l neas en blanco del fomat loose aproxima los n umeros a cocientes de enteros; i.e. n umeros racionales

format compact format rat

MATLAB aplica un factor de escala general a las matrices cuando los elementos m as grandes o m as peque nos son superiores o inferiores, respectivamente, a una determinada cantidad (103 y 103 ).

Matrices y Vectores

13

Las expresiones se pueden construir con n umeros (reales o complejos) y utilizando los operadores aritm eticos y las reglas de precedencia habituales (en caso de duda siempre se pueden utilizar par entesis): + / \ adici on sustracci on multiplicaci on divisi on por la derecha divisi on por la izquierda potenciaci on transposici on

Estos mismos operadores se utilizan con matrices, por eso se incluye la transposici on y la divisi on por la izquierda. Si A y B son matrices y A es invertible entonces A \ B = A1 B y B/A = BA1 . Ambas producen lo mismo cuando son aplicadas a n umeros. As 1/4 y 1 \ 4 producen el mismo valor num erico: 0,25. De la misma forma A es la transpuesta de A y si a es un n umero a = a. Si A no es invertible A \ B es una matriz C tal que A C es aproximadamente B (en cierto sentido que estudiaremos en teor a). De la misma forma B/A es una matriz C tal que C A es aproximadamente B . En otras palabras A \ B y B/A son soluciones ( unicas si A es invertible) de las ecuaciones AX = B y XA = B , respectivamente. Hay otras operaciones especiales para matrices: . ./ .\ . multiplicaci on t ermino a t ermino divisi on a la derecha t ermino a t ermino divisi on a la izquierda t ermino a t ermino potenciaci on t ermino a t ermino

Dadas dos matrices A y B no es lo mismo A*B que A.*B, ni A/B que A./B. Los primeros son el producto y la divisi on (en el sentido de m as arriba) habituales. Cuando estos operadores est an precedidos por un punto, la operaci on se realiza elemento a elemento. As >> [1 2; 3 4]*[0 1; 2 3] ans = 4 7 8 15 >> [1 2; 3 4].*[0 1; 2 3] ans = 0 2 6 12 Cuando la operaci on se hace entre una matriz y un escalar el resultado es el mismo:

Matrices y Vectores >> 2\[1 2; 3 4] ans = 0.5000 1.0000 1.5000 2.0000 >> 2.\[1 2; 3 4] ans = 0.5000 1.5000 1.0000 2.0000

14

Qu e responder a MATLAB a la siguiente orden? >> 2/[1 2; 3 4] Para una matriz A tampoco es lo mismo A^3 que A.^3. Lo primero es el resultado de multiplicar A por s misma tres veces; s olo es aplicable a matrices cuadradas. Lo segundo es la matriz cuyos elementos son los cubos de los elementos de A; es aplicable a cualquier matriz. En algunos sistemas UNIX puede haber problemas para escribir el signo de potenciaci on en MATLAB. Para evitar el uso de este s mbolo tenemos la siguiente alternativa: A.^3=power(A,3) A^3=mpower(A,3)

2.2.

Manipulaci on de vectores y matrices

Puesto que las unidades b asicas de MATLAB son las matrices, dispone de varias formas de crear vectores y matrices de forma casi autom atica, y de manipular los elementos de una matriz. El operador dos puntos, : , es uno de los m as importantes. Sirve para generar vectores y matrices cuyos elementos est an igualmente espaciados. As >> x=1:5 produce un vector cuyas componentes van de 1 a 5 en incrementos de 1: x = 1 Mientras que >> y=0:pi/4:pi proporciona un vector entre 0 y con incrementos de /4: 2 3 4 5

Matrices y Vectores y = 0 0.7854 1.5708 2.3562 3.1416

15

Tambi en son posibles incrementos negativos: >> z=6:-.5:3 z = 6.0000

5.5000

5.0000

4.5000

4.0000

3.5000

3.0000

El comando linspace se puede utilizar para generar un vector en el que se especica las componentes primera y u ltima y el n umero de ellas: >> k=linspace(-sqrt(3),pi,5) k = -1.7321 -0.5136 0.7048

1.9232

3.1416

El n umero de componentes por defecto es 100. Esto signica que una sentencia del tipo >> k=linspace(-sqrt(3),pi); asignar a a la variable k un vector de 100 componentes igualmente espaciadas entre 3 y (hemos escrito ; al nal del comando para que el resultado no sea mostrado). Por otra parte, dada una matriz A, el elemento de la la i y la columna j , se denota por A(i,j). As , con la matriz A de m as arriba (que utilizaremos a lo largo de esta secci on): >>A=[16 3 2 13; 5 10 11 8; 9 6 7 12; 4 15 14 1] A = 16 3 2 13 5 10 11 8 9 6 7 12 4 15 14 1 el elemento en la posici on (2, 4) es 8. Si escribimos >> A(2,4) MATLAB nos devuelve: ans = 8 Se puede modicar el elemento de cualquier posici on sin m as que cambiar su valor. La respuesta de MATLAB es toda la matriz con el nuevo valor en dicha posici on. Para seguir manteniendo, para los siguientes ejemplos, la misma matriz A, primero almacenamos en c el elemento que vamos a cambiar y a continuaci on recuperamos la matriz original::

Matrices y Vectores >> c=A(2,4),A(2,4)= 3*sqrt(A(1,4))-1/log10(A(3,4)) c = 8 A = 16.0000 3.0000 2.0000 13.0000 5.0000 10.0000 11.0000 9.8900 9.0000 6.0000 7.0000 12.0000 4.0000 15.0000 14.0000 1.0000 >> A(2,4)=c A = 16 3 2 13 5 10 11 8 9 6 7 12 4 15 14 1

16

En la primera l nea de comandos hemos puesto dos ordenes: c=A(2,4),A(2,4)= 3*sqrt(A(1,4)) -1/log10(A(3,4)). Tal y como se ha mencionado m as arriba escribir ; despu es de una orden produce el efecto de que el resultado no se escribe en la pantalla. En cada l nea de comandos podemos poner cuantas ordenes queramos separadas bien sea por comas (en cuyo caso los resultados correspondientes aparecer an sucesivamente en la pantalla) o bien por ; para que los resultados no aparezcan en la pantalla. (M as abajo hay un ejemplo). Por otra parte, si pedimos el valor del elemento en la posici on (4, 5), MATLAB nos devuelve un mensaje de error porque el tama no de A es 4 4: >> A(4,5) ??? Index exceeds matrix dimensions. Desde la versi on 5 de MATLAB se puede usar end para indicar el u ltimo elemento de una matriz, respecto de una dimensi on dada. As : >> a=4:10 a = 4 5 >> a(end) ans = 10 >> A(end,end) ans = 1 >> A(2,end) ans = 15 >> A(end,2) ans = 8

10

Matrices y Vectores

17

No s olo se puede extraer cada elemento de una matriz sino cualquier submatriz. Para ello basta expresar la submatriz deseada en notaci on vectorial. As , para obtener el subvector de a formado por los u ltimos 5 primeros elementos escribir amos: >> a(1:5) ans = 4

y el formado por los u ltimos 4: >> a(end-3:end) ans = 7 8

10

Para obtener la submatriz formada por los elementos que ocupan las posiciones donde se interceptan las las 1 y 3 y las columnas 3 y 4 escribir amos: >> C=A([1 3],[3 4]) C = 2 13 7 12 Si queremos la submatriz formada por las dos primeras las podemos utilizar el comando dos puntos: >> A([1 2],:) ans = 16 3 5 10

2 11

13 8

O, utilizando el comando end: >> A(end-2:end, end-1:end) ans = 11 8 7 12 14 1 Podemos hacer uso de esta t ecnica para generar submatrices correspondientes a las o columnas igualmente espaciadas. Por ejemplo, si A fuera una matriz 1015, el comando A(2:2:10,1:3:15) nos devolver a la submatriz formada por las las pares y las columnas 1,4,7,10 y 13. Si a una matriz le especicamos un solo sub ndice, MATLAB cuenta los elementos por columnas y nos devuelve el elemento correspondiente:

Matrices y Vectores >> A(7) ans = 6 >> A(12) ans = 14

18

Por el mismo motivo la orden A(:) nos devuelve el vector columna formado por los elementos de la matriz colocados columna tras columna: >> A(:) ans = 16 5 9 4 3 10 6 15 2 11 7 14 13 8 12 1 La notaci on vectorial para los sub ndices de una matriz puede utilizarse para permutar las o columnas de una matriz. As para obtener una matriz B con las las primera y segunda, y las columnas segunda y cuarta de A permutadas, har amos lo siguiente: >> B=A([2 1 3 4],[1 4 3 2]) B = 5 8 11 10 16 13 2 3 9 12 7 6 4 1 14 15 Y si s olo queremos permutar las dos primeras las: >> B=A([2 1 3 4],:) B =

Matrices y Vectores 5 16 9 4 10 3 6 15 11 2 7 14 8 13 12 1

19

Dada una matriz A podemos a nadirle las y columnas sin m as que especicar el vector con los elementos que se quiere a nadir. Por ejemplo, si a nuestra matriz A le queremos a nadir la la [1 3 5 7] har amos lo siguiente: >> C=[A;[1 3 5 7]] C = 16 3 2 5 10 11 9 6 7 4 15 14 1 3 5

13 8 12 1 7

Claro que tambi en podr amos denir primero el vector la que vamos a a nadir y luego a nadirlo: >> r=1:2:7; C=[A;r] C = 16 3 2 5 10 11 9 6 7 4 15 14 1 3 5

13 8 12 1 7

Si lo que queremos es a nadir una columna actuar amos por transposici on (recordemos que r es la transpuesta de r): >> [A r] ans = 16 5 9 4 3 10 6 15 2 11 7 14 13 8 12 1 1 3 5 7

Esta forma de crear matrices a partir de otras m as peque nas nos permite ir creando matrices sobre la marcha empezando desde una matriz vac a. En efecto, la orden >> B=[] nos devuelve una matriz sin elementos a la que podemos ir a nadi endole las o columnas como hemos hecho m as arriba: >> B=[]

Matrices y Vectores B = [] >> c1=1:3:7; c2=2:3:8; c3=3:3:9; B1=[B c1 c2 c3], B2=[B;c1;c2;c3] B1 = 1 2 3 4 5 6 7 8 9 B2 = 1 4 7 2 5 8 3 6 9

20

Tambien podemos eliminar las y/o columnas con ayuda de la matriz vac a. Simplemente igualamos a [] la submatriz que queramos eliminar: >> B2(:,2)=[] B2 = 1 7 2 8 3 9 nos devuelve la submatriz de B2 que se obtiene al suprimir la segunda columna.

2.3.

Matrices a partir de funciones predenidas en MATLAB

Hay un buen n umero de funciones de matrices predenidas en MATLAB. Una relaci on de todas ellas con la descripci on de su uso la puedes encontar escribiendo helpwin y en la ventana que aparece haciendo doble click en matlab/elmat. Describimos aqu las funciones para generar las matrices m as elementales: zeros(m,n) ones(m,n) rand(m,n) randn(m,n) eye(m,n) diag(v,k) Crea una matriz de tama no m n cuyos elementos son todos 0. Crea una matriz de tama no m n cuyos elementos son todos 1. Crea una matriz de tama no m n con elementos aleatorios distribu dos uniformemente entre 0 y 1 Crea una matriz de tama no m n con elementos aleatorios elegidos con una distribuci on normal de media 0 y varianza y desviaci on standrad 1 Crea una matriz de tama no m n con 1s en la diagonal principal El argumento v es un vector y el argumento k es opcional pero si se da, debe ser un n umero entero. MATLAB crea una matriz cuadrada de tama no n + |k |, con todos lo elementos cero excepto los de la k - esima diagonal que son los elementos del vector v. Poner k = 0 o no dar un valor expl cito produce el mismo resultado: una matriz diagonal con el vector v en la diagonal principal. Si k > 0 el vector v aparece en la k - esima

Matrices y Vectores

21

diag(A,k)

supradiagonal y si k < 0 en la k - esima subdiagonal. El argumento A es una matriz y el agumento k es opcional pero si se da, debe ser un n umero entero. MATLAB produce un vector: la k -esima diagonal de la matriz A.

Algunos ejemplos: >> Z=zeros(2,4) Z = 0 0 0 0

0 0

0 0

>> F=5*ones(3,3) F = 5 5 5 5 5 5 5 5 5 >> N=10*rand(2,5) N = 9.5013 6.0684 8.9130 4.5647 8.2141 2.3114 4.8598 7.6210 0.1850 4.4470 >> I=2*eye(2,4) I = 2 0 0 0 0 2 0 0 >> G=diag(-3:3) + diag(ones(6,1),1) + diag(-1*ones(6,1),-1) G = -3 1 0 0 0 0 0 -1 -2 1 0 0 0 0 0 -1 -1 1 0 0 0 0 0 -1 0 1 0 0 0 0 0 -1 1 1 0 0 0 0 0 -1 2 1 0 0 0 0 0 -1 3 >> diag(G),diag(G,1),diag(G,-1) ans = -3 -2 -1 0 1 2

Matrices y Vectores 3 ans = 1 1 1 1 1 1 ans = -1 -1 -1 -1 -1 -1

22

2.4.

Otras formas de generar matrices

Hay otras formas de producir matrices. Comentamos a continuaci on c omo generar matrices a partir de cheros externos. Estos son cheros almacenados en el disco duro y que han sido producidos bien por MATLAB o bien por nosotros mismos. En cualquier caso, conviene tener un directorio espec co donde almacenar estos y otros posibles cheros. Hablaremos m as extensamente sobre este tema y otros relacionados cuando estudiemos el entorno de trabajo de MATLAB. Ahora comentamos s olo lo necesario para crear matrices a partir de cheros externos. Me referir e a matlabdir como el directorio donde se guardar an todos los cheros de MATLAB creados por nosotros mismos. El nombre real de este directorio para cada cu al puede ser diferente. En primer lugar se debe crear. Para ello conviene comprobar primero en qu e directorio del sistema de archivos nos encontramos. Esto se hace con el comando pwd. Se puede cambiar al directorio que se desee con el comando cd y crear entonces el directorio matlabdir con la orden habitual: mkdir matlabdir. Hay otras ordenes correspondientes al sistema operativo que se ver an m as adelante. Tambi en se pueden consultar con el sistema de ayuda: helpwin y entonces matlab/general. Lo siguiente que tenemos que hacer es posibilitar que MATLAB reconozca el directorio matlabdir. Es decir, que sepa de su existencia para que pueda encontrar los cheros all depositados. Para ello debemos a nadirlo al path de MATLAB con el comando addpath. Por ejemplo: addpath /ruta completa/matlabdir. Si ahora tecleamos path, en la primera l nea deber a aparecer la ruta completa hasta nuestro directorio matlabdir. Analizamos ahora la forma de generar matrices desde cheros externos: Con el comando load. Este comando puede leer cheros externos binarios, producidos por sesiones anteriores de MATLAB, o de texto. Para obtener matrices de cheros de texto externos estos deben estar organizados como una tabla rectangular de n umeros, separados

Matrices y Vectores

23

por espacios en blanco, con una la por l nea y con igual n umero de elementos en cada la. Por ejemplo, con un editor de texto (textedit en picasso o notepad en MSWindows) podemos crear un chero de texto que contenga estas cuatro l neas: 16,0 3,0 2,0 13,0 5,0 10,0 11,0 8,0 9,0 6,0 7,0 12,0 4,0 15,0 14,0 1,0 Guardamos este chero bajo el nombre de magico.dat en el directorio matlabdir. El comando >> load magico.dat lee el chero y asigna a la variable magico la matriz contenida en el chero. >> magico magico = 16 5 9 4 3 10 6 15 2 11 7 14 13 8 12 1

Creando un chero M con el contenido de una o m as matrices. Los cheros M son parte fundamental de MATLAB y los analizaremos posteriormente. Por ahora s olo necesitamos saber que si con nuestro editor creamos un chero de texto que contenga las siguientes 5 las: A = [... 16,0 3,0 2,0 13,0 5,0 10,0 11,0 8,0 9,0 6,0 7,0 12,0 4,0 15,0 14,0 1,0 ]; y salvamos este chero como magico.m, entonces el comando magico en MATLAB lee el chero y crea la variable A que contiene la matriz del chero. Por supuesto, el chero debe estar en el directorio matalbdir.

Cap tulo 3

El Entorno de Trabajo de MATLAB

3.1.

El Espacio de Trabajo

El espacio de trabajo (workspace en ingl es) es el area de memoria accesible desde la l nea de comandos de MATLAB. Si estamos trabajando en modo gr aco hay dos formas de acceder a el: abriendo la ventana correspondiente o mediante los comandos who y whos. Empezando por lo segundo, estos dos comandos muestran el contenido del espacio de trabajo en cada momento. El comando who proporciona una lista corta, mientras que whos da, adem as, el tama no y alguna informaci on adicional sobre almacenamiento de las variables que se han utilizado. He aqu un ejemplo: >> who Your variables are: A a b >> whos Name Size A a b 3x4 1x7 1x100

Bytes 96 56 800

Class double array double array double array

Grand total is 119 elements using 952 bytes Para abrir la ventana correspondiente al espacio de trabajo procedemos de la siguiente manera: desplegamos el men u Desktop (versi on 7) o View (versiones anteriores a la 7), que est a en el 24

El Entorno de Trabajo de MATLAB

25

men u principal de MATLAB, y all seleccionamos workspace. Cualquier otra ventana de las disponibles en Desktop (View) se abre igual. Puede suceder que la ventana workspace, o cualquier otra que se desee abrir, ya est e abierta aunque no se vea. Ello es debido a que puede estar oculta por alguna otra ventana. Para saberlo hay que ir a Window en el men u principal y ver si est a all relacionada. Si no lo est a se abre como se ha mencionado m as arriba. Y si lo est ay no se ve es que est a abierta pero oculta. En este caso, basta pinchar en el nombre de la ventana que se quiere consultar (en nuestro caso workspace) para que pase a primer plano. Pegada a la ventana de comandos nos aparecer a la ventana del espacio de trabajo con la informaci on que proporciona el comando whos(ver la gura 3.1)

Figura 3.1: Ventana del Espacio de Trabajo. Esta informaci on puede ser interesante cuando se est an consumiendo grandes recursos para saber la cantidad de memoria que se utiliza o, sobre todo, cuando se quieren conocer los nombres de las variables que ya se han usado a n de no sobreescribir alguna que pueda ser importante. Para cerrar la ventana del espacio de trabajo basta seleccionar, de nuevo, Workspace en el . men u Desktop (o View para versiones anteriores a la 7) o pinchar en el s mbolo Para borrar todas las variables del espacio de trabajo se utiliza el comando clear.

3.1.1.

Comandos save y load

En muchas ocasiones puede resultar interesante interrumpir el trabajo con MATLAB y poderlo recuperar m as tarde en el mismo punto en el que se dej o (con las mismas variables denidas, con los mismos resultados intermedios, etc.). Hay que tener en cuenta que al salir del programa todo el contenido de la memoria se borra autom aticamente. Tambi en en este caso tenemos dos formas de hacerlo: mediante los comandos save y load o eligiendo Save Workspace As ... (para salvar el trabajo) o Import Data (para recuperarlo) en el men u File. Esta segunda forma de hacerlo es muy intuitiva y no requiere comentarios. Los comandos save y load apenas los usaremos en estas pr acticas y se puede encontrar todo lo relativo a ellos usando helpwin

El Entorno de Trabajo de MATLAB matlab/general

26

3.1.2.

El Comando diary

Los comandos save y load crean cheros binarios o ASCII con el estado de la sesi on, pero no sirven para guardar todo lo que hemos ido tecleando y ha ido saliendo en la ventana de comandos. Existe una forma sencilla de almacenar todos estos datos en un chero de texto. Esto se hace con el comando diary. El uso general es de la forma siguiente: >> diary filename.txt De esta forma se va escribiendo en el chero filename.txt todo lo que aparece, l nea tras l nea, en la ventana de comandos de MATLAB con posterioridad a la utilizaci on del comando. Esto signica que si se quiere guardar todo lo que vaya apareciendo en la ventana de comandos desde el principio, se debe utilizar este comando en cuanto se empieza la sesi on. Ojo! si se quieren salvar distintas sesiones se deben guardar en archivos con nombres diferentes. Salvo que se especique el path completo en el que se quiere guardar el chero, este se salva (en Windows) en el subdirectorio work del directorio principal de MATLAB (es decir, en la subcarpeta work de la carpeta de instalaci on de MATLAB) y en un sistema UNIX en el directorio home de cada usuario. Si se quiere interrumpir el proceso basta escribir >> diary off y para reanudarlo de nuevo >> diary on El simple comando diary pasa de on a off y viceversa. Para poder acceder al chero lename.txt con un editor de texto es necesario que diary est e en off porque si no MATLAB mantiene abierto el chero y no es accesible desde el exterior. No obstante, en la ventana Command History que se puede abrir desde el men u Desktop se guardan las sesiones anteriores (hasta cierto punto) especicadas por el d a y la hora en que se comenzaron.

3.1.3.

L neas de comentarios

Para MATLAB el car acter tanto por ciento ( %) indica comienzo de comentario. Cuando aparece en una l nea de comandos, el programa supone que todo lo que va desde ese car acter hasta el n de la l nea es un comentario y por lo tanto no lo lee. Raramente se usan en la ventana de comandos, pero son muy u tiles cuando se escriben programas (cheros M) tal y como veremos m as adelante.

El Entorno de Trabajo de MATLAB

27

3.2.

El Camino de b usqueda (SEARCH PATH) de MATLAB

El search path de MATLAB es una lista de directorios que se puede ver y modicar a partir de la l nea de comandos. El comando path hace que se escriba el search path de MATLAB (el resultado depende de en qu e directorio est a instalado MATLAB): >> path MATLABPATH /home/Ion/matlab /home/Ion/matlab/prog /home/Ion/matlab/prog/clase/anal_matr /usr/local/share/matlab6/toolbox/matlab/general /usr/local/share/matlab6/toolbox/matlab/ops /usr/local/share/matlab6/toolbox/matlab/lang /usr/local/share/matlab6/toolbox/matlab/elmat /usr/local/share/matlab6/toolbox/matlab/elfun /usr/local/share/matlab6/toolbox/matlab/specfun /usr/local/share/matlab6/toolbox/matlab/matfun Para ver c omo MATLAB utiliza el search path sup ongase que se utiliza la palabra nombre1 en un comando. El proceso que sigue MATLAB para tratar de conocer qu e es nombre1 es el siguiente: 1. Comprueba si nombre1 es una variable previamente denida por el usuario. 2. Comprueba si nombre1 es una funci on del usuario (hablaremos m as adelante de las funciones en MATLAB). 3. Comprueba si nombre1 es una funci on interna o intr nseca de MATLAB. 4. Comprueba si hay un chero llamado nombre1.mex o nombre1.m en el directorio actual (de los cheros M hablaremos m as adelante, los cheros .mex tienen un signicado especial para MATLAB del que no hablaremos aqu ). 5. Comprueba si hay cheros llamados nombre1.mex o nombre1.m en los directorios incluidos en el search path de MATLAB. Estos pasos se realizan en el orden indicado. En cuanto se encuentra lo que se est a buscando se detiene la b usqueda y se utiliza el chero que se ha encontrado. Si no se encuentra en todo el proceso MATLAB produce un error: >> nombre1 ??? Undefined function or variable nombre1.

El Entorno de Trabajo de MATLAB

28

El Path Browser es el programa que ayuda a denir la lista de directorios donde MATLAB debe buscar los cheros de comandos y las funciones, tanto del sistema como de usuario. Para abrir el Path Browser se elige Set Path en el men u File. Una vez seleccionado se abre otra nueva ventana en la que se muestra la lista de directorios en la que MATLAB buscar a (MATLAB search path) (ver Figura 3.2. Seleccionando Add Folder se pueden a nadir nuevos directorios.

Figura 3.2: Ventana con el path de MATLAB. Se puede especicar, adem as que se incorporen al search path todos los subdirectorios del directorio seleccionado. Tambi en se pueden quitar directorios con la opci on Remove (es mejor que ni lo intentes salvo que est es seguro/a de lo que haces). El nuevo directorio se puede a nadir al comienzo o nal de la lista. Tal y como hemos mencionado, el orden de la lista es muy importante porque reeja el orden de la b usqueda: si una funci on est a en dos directorios, se utilizar a la que primero se encuentre. Las operaciones realizadas se pueden salvar utilizando Save. En MATLAB bajo Windows el listado de directorios salvado se hace permanente, de forma que la pr oxima vez que se empieza una sesi on de MATLAB las carpetas a nadidas aparecer an en el path browser. Este no es el caso en sistemas UNIX porque la posibilidad de escribir de forma permanente en el directorio donde est a instalado MATLAB es exclusiva del administrador del sistema. Para a nadir permanentemente unos directorios al search path en UNIX hay que hacerlo a trav es del chero startup.m del que hablaremos enseguida. Tambi en se puede incluir un directorio de b usqueda desde la l nea de comandos de MATLAB. La forma de hacerlo depende del sistema operativo sobre el que est e instalado MATLAB. Lo mejor es utilizar el comando helpwin y consultar en matlab/general lo relativo a los comandos path, addpath y rmpath. El chero responsable de los par ametros con los que se inicia cada sesi on de MATLAB es matlabrc.m que se encuentra en el subdirectorio toolbox/local de la instalaci on de MATLAB (en sistemas UNIX). En sistemas multiusuario, como picasso, s olo puede modicarlo el administrador. En Windows puede hacerlo cualquiera, pero es altamente recomendable que no lo hagas. Ahora bien, cada usuario puede escribir un chero para que cada vez que se empiece una sesi on de MATLAB, este se inicie con los par ametros que cada cual desee. Este chero se debe llamar startup.m y debe estar, en sistemas UNIX, en el subdirectorio home/izaballa/matlab del correspondiente ususario. Bajo Windows este chero se debe colocar en la subcarpeta work de la carpeta donde est a instalado MATLAB (posiblemente C:\matlabr14 o algo as ). Por ejemplo, un chero startup.m que contenga las siguientes l neas:

El Entorno de Trabajo de MATLAB cd \$HOME/matlab format compact addpath /usr/alu/julen/matlab/practicas -end !texedit disp(Kaixo)

29

har a lo siguiente cuando el usuario correspondiente (en este caso posiblemente Julen) empiece una sesi on de MATLAB en picasso: Cambiar a al directorio matlab, donde posiblemente se encuentren los trabajos de MATLAB de Julen. Utilizar a el formato compact para exponer las salidas producidas por MATLAB (este formato, como ya se dijo en el Cap tulo 2, suprime algunos saltos de l nea y presenta las salidas m as compactas). A nadir a el directorio /usr/alu/julen/matlab al nal del search path. Abrir a el editor de openxt y Escibir a Kaixo como primera l nea en la ventana de comandos de MATLAB. Bajo Windows el chero que producir a algo parecido ser a cd c:\matlabr14\programas format compact addpath c:\matlabr14\programas -end edit disp(Kaixo) De forma an aloga, al abandonar la ejecuci on de MATLAB con el comando quit se ejecuta autom aticamente el chero finish.m, siempre que se encuentre en alguno de los directorios del search path. Este chero se puede utilizar por ejemplo para guardar el espacio de trabajo de MATLAB (recuerda el comando save).

3.3.

Manipulaci on de cheros

Los comandos dir, type, delete y cd implementan un conjunto de comandos del sistema operativo que corre por debajo de MATLAB. Los nombres con los que se corresponden en los sistemas operativos MS-DOS-Windows y Unix se muestran en la siguiente tabla MATLAB dir type delete cd pwd Windows dir type del o erase cd UNIX ls cat rm cd pwd

El Entorno de Trabajo de MATLAB

30

Como en todos los sistemas operativos se pueden utilizar los caracteres comod n, pathnames y nombres de los discos o directorios en la forma habitual. As los comandos >> cd c:\matlab >> delete *.dos producir an, bajo MS-DOS o Windows, un cambio al directorio matlab que se encuentra en el disco C (en caso de que tal directorio exista; si no, produce un mensaje de error). Y a continuaci on se borrar an todos los cheros cuya extensi on es dos en dicho directorio. En un sistema UNIX los discos habitualmente no se designan con las letras a, c, etc..., sino que todos los directorios cuelgan del directorio ra z: /. Por lo tanto, para cambiar al directiorio /usr/alu/Julen/matlab deberemos utilizar el comando: cd /usr/alu/Julen/matlab Desde la ventana de comandos de MATLAB siempre se puede utilizar el comando pwd (como en UNIX) para conocer en qu e directorio nos encontramos trabajando.

3.3.1.

Ejecuci on de Programas Externos

El cierre de exclamaci on, !, indica que el resto de la l nea es un comando del sistema operativo. Esto puede ser u til porque permite ejecutar programas o invocar utilidades del sistema operativo sin salir de MATLAB aunque rara vez se utiliza cuando el sistema operativo es Windows. Por ejemplo, en UNIX de Solaris (que es el sistema operativo de picasso) >> !textedit parabola.m &

es una orden para abrir el editor de cheros Text Editor que trae por defecto el sistema Open windows de Solaris y cargar en el el chero parabola.m. El s mbolo & le pide al sistema operativo que lo ejecute en background; es decir, que deje la ventana de comandos de MATLAB libre para seguir tecleando nuevas ordenes.

Cap tulo 4

Programaci on en MATLAB

4.1.

Empezando a programar en MATLAB

Lo interesante de MATLAB no es que realiza operaciones individuales sobre matrices y vectores, sino que es un verdadero lenguaje de programaci on con cantidad de funciones primitivas que facilitan mucho la tarea de programar. Un ejemplo muy simple es el siguiente: supongamos que queremos dibujar la par abola x = t2 en el intervalo [2, 2]. El comando para dibujar curvas en el plano es plot. Este comando admite muchos argumentos incluyendo la posibilidad de dibujar varias curvas al mismo tiempo. Nosotros s olo lo usaremos de la forma m as sencilla, pero si quieres saber todo lo que puede hacer, puedes usar el comando helpwin graph2d plot. Por ahora la u nica informaci on pertinente es que plot(t,x) dibuja el vector t versus el vector x. Esto quiere decir que si el vector t es t = [t1 t2 t3 . . .] y x = [x1 x2 x3 . . .] entonces plot(t,x) dibuja una poligonal que une los puntos (t1 , x1 ), (t2 , x2 ), t3 , x3 ), etc. Si estos puntos est an sucientemente pr oximos el efecto visual es una curva. As pues, para dibujar la curva x = t2 tenemos que dar tres pasos: denir el vector t, denir el vector x = t2 , y ordenar a MATLAB que dibuje; i.e. teclear plot(t,x). En este caso tan simple, se pueden dar las tres ordenes en la misma l nea de comando (recuerda las dicultades que hay para usar en picasso y que este operador se puede sustituir por power): 31

Programaci on en MATLAB >> t=-2:0.1:2; x=t.^2; plot(t,x) o preferiblemente >> t=linspace(-2,2);x=t.^2; plot(t,x)

32

Recuerda tambi en que linspace(a,b) forma un vector de 100 componentes igualmente espaciadas entre a y b. Si estos puntos no est an muy alejados entre s , cada componente del vector est a muy pr oxima a la siguiente. Otra posibilidad es escribir cada orden en una l nea: >> t=linspace(-2,2); >> x=t.^2; >> plot(t,x) Y hay una tercera posibilidad que es la m as interesante: escribir el conjunto de ordenes en un chero, mediante un editor. Ya se ha dicho m as arriba c omo hacerlo tanto en picasso (mediante !texedit) como en Windows (con edit) (ver Figura4.1 Esto es lo que se llama un script, un

Figura 4.1: Ventanas de comando y de edici on para escribir programas de MATLAB programa (en este caso peque no) con c odigo ejecutable por MATLAB. La traducci on de script en castellano es algo as como gui on pero seguiremos utilizando el original en ingl es. Una vez escrito, se salvar a con el nombre que se desee, por ejemplo parabola.m (la extensi on .m es obligatoria, es la forma en que MATLAB sabe que es un chero con c odigo ejecutable). Para ejecutar las ordenes contenidas en este chero basta escribir su nombre en la ventana de comandos; en este caso parabola: >> parabola El resultado es una nueva ventana, como la de la gura 4.2, que contiene la gr aca de la par abola. Si a = (a1 , . . . , an ) es un vector de n componentes plot(a) dibuja una poligonal uniendo los

Programaci on en MATLAB

33

Figura 4.2: Ventana gr aca con la par abola producida por el script parabola.m puntos (1, a1 ), (2, a2 ), . . . . Si lo que se quiere es se nalar con el s mbolo los puntos (x1 , y1 ), (x2 , y2 ),. . . , (xn , yn ) pero sin unirlos a trav es de una poligonal basta crear los vectores x e y y usar el comando plot(x,y,*).

4.1.1.

Operadores relacionales y l ogicos

Para programar en MATLAB se pueden usar bucles de la forma for . . . end, o bifurcaciones de la forma while . . . end, if. . . end y switch . . . case Su sintaxis es como en cualquier otro lenguaje de programaci on. La idea es que cierta acci on se realice dependiendo de si una condici on es verdadera o no. La verdad o falsedad de estas condiciones se suele evaluar comparando dos expresiones. Para ello existen operadores relacionales y l ogicos. MATLAB dispone de los siguiente operadores relacionales: < > <= >= == ~= menor que mayor que menor o igual que mayor o igual que igual que distinto que

En MATLAB los operadores relacionales pueden aplicarse a vectores y matrices, y eso hace que tengan un signicado especial. Por ejemplo, dada una matriz A la comparaci on abs(A)<eps genera una matriz de 0s y 1s con el mismo tama no de A. El elemento (i, j ) de dicha matriz es 1 si |Aij | < eps, siendo eps el epsilon de la m aquina (=2.204e-16). >> A=[-1 2 0; 0 -1 -3; 1 -1 0] A = -1 2 0 0 -1 -3 1 -1 0

Programaci on en MATLAB >> B=(abs(A)<eps) B = 0 0 1 1 0 0 0 0 1

34

La sentencia any(abs(A)<eps) genera un vector de 0s y 1s; 0 si la correspondiente columna es cero y 1 en caso contrario. Es decir, any responde true si alg un elemento no es cero y false si todos son cero. >> any(B) ans = 1

Y la sentencia any(any(abs(A)<eps)) produce un 0 (i.e. false) si todos los elementos de any(B) son cero y 1 (true) en caso contrario. >> any(any(B)) ans = 1 As pues, la sentencia any(any(abs(A)<eps)) se puede utilizar como una condici on. Ser a verdadera si y s olo si alg un elemento de A es, en m odulo, m as peque no que eps. En caso contrario es falsa. Hay un operador l ogico similar: all. Responde true si todos los elementos del vector son distintos de cero; en caso contrario, responde false. Con la matriz A de m as arriba: >> all(A) ans = 0

En efecto, la u nica columna de A con todos sus elementos distintos de cero es la segunda. Pero como ninguna columna de A tiene todos sus elementos menores que eps: >> all(abs(A)<eps) ans = 0 0 0 Vemos en estos ejemplos que al igual que en otros lenguajes de programaci on, si una comparaci on se cumple el resultado es 1 (true), mientras que si no se cumple es 0 (false). Rec procamente, cualquier valor distinto de cero es considerado como true y el cero equivale a false. Cuando los operadores relacionales de MATLAB se aplican a dos matrices o vectores del mismo tama no, la comparaci on se realiza elemento a elemento, y el resultado es otra matriz de unos y ceros del mismo tama no, que recoge el resultado de cada comparaci on entre elementos. Por ejemplo:

Programaci on en MATLAB >> A=[1 2;0 3]; B=[4 2;1 5]; >> A==B ans = 0 1 0 0 >> A~=B ans = 1 0 1 1 >> A>2 ans = 0 0 0 1 Para saber si dos matrices son iguales, se puede usar la expresi on isequal(A,B) >> isequal(A,B) ans = 0

35

La expresi on isequal(A,B) es equivalente a all(all(A==B)). Por otra parte, isequal es una de las muchas funciones l ogicas que empiezan por is. He aqu una selecci on de ellas. Para obtener un listado completo escribe doc is tras el prompt de MATLAB ischar isempty isequal isfinite isfloat isinf isinteger isnan isnumeric isprime is real isvector verdadero si la entrada es un vector de caracteres verdadero si la entrada es un vector vac o verdadero si los vectores son iguales detecta los elementos nitos de un vector verdadero si el vector es de elementos en coma otante detecta los elementos innitos de un vector verdadero si el vector es de n umeros enteros detecta los elementos que son NaN en un vector veradero si el vector es de n umeros (no de caracteres) detecta los n umeros primos en un vector verdadero si todos los n umeros del vector son reales verdadero si se trata de un vector

Algunos ejemplos adicionales con la matriz A de m as arriba >> A A = 1 2 0 3 >> isfinite(A)

Programaci on en MATLAB ans = 1 1 1 1 >> isnumeric(A) ans = 1 >> isreal(A) ans = 1 >> isvector(A) ans = 0

36

Adem as una condici on puede constar de una o m as operaciones relacionales. Estas normalmente est an concatenadas con expresiones l ogicas cuya verdad o falsedad sigue las leyes de la l ogica formal. Los operadores l ogicos de MATLAB son los siguientes: & | ~ xor any all Algunos ejemplos >> x=[-1 1 1]; y=[ 1 2 -3]; >> x>0, y>0 ans = 0 1 1 ans = 1 1 0 >> x>0 & y>0 ans = 0 1 0 >> x>0 | y>0 ans = 1 1 1 >> xor(x>0,y>0) ans = 1 0 1 >> any(x>0) ans = 1 >> all(x>0) y o negaci on l ogica o excluyente verdad si cualquiera de los elementos de un vector es no cero verdad si todos lo elemntos de un vector son no cero

Programaci on en MATLAB ans = 0 >>

37

Para terminar con los operadores l ogicos estudiamos otro comando muy u til: find. Este comando devuelve los ndices (los lugares que ocupan) los elementos no nulos de un vector. Por ejemplo >> x=[-3 1 0 -inf 0] x = -3 1 0 -Inf >> f=find(x) f = 1 2 4

Una primera aplicaci on es extraer de x los elementos no nulos: >> x(f) ans = -3

-Inf

Podemos extraer los elementos nitos > x(find(isfinite(x))) ans = -3 1 0 0 o reemplazar las componentes negativas por cero: >> x(find(x<0))=0 x = 0 1 0

Cuando find se aplica a una matriz se hace mir andola como un vector; es decir al vector A(:) que se obtiene -recordemos- poniendo las columnas de A una debajo de otra. Por ejemplo >> A=[ 4 2 16; 12 4 3], B=[12 3 1; 10 -1 7] A = 4 2 16 12 4 3 B = 12 3 1 10 -1 7 >> C=A<B

Programaci on en MATLAB C = 1 1 0 0 >> C(:) ans = 1 0 1 0 0 1 >> find(A<B) ans = 1 3 6 0 1

38

Otro posible uso de find con matrices es [i,j]=find(A) que devuelve vectores i y j con los ndices de las las y columnas de A distintos de cero, respectivamente. As >> [i,j]=find(A<B) i = 1 1 2 j = 1 2 3 nos dice que en las posiciones (1, 1), (1, 2) y (2, 3) est an los elementos de A que son menores que los de B .

4.1.2.

Bifurcaciones y Bucles

Tal y como hemos dicho m as arriba las bifurcaciones de MATLAB son while . . . end, if. . . end y switch . . . case. Este u ltimo tipo de bifurcaciones no lo vamos a comentar; se puede consultar la ayuda de MATLAB para saber como funciona. Tambi en se dispone de bucles for . . . end. La forma m as simple de una bifurcaci on del tipo if. . . end es la siguiente if condicion sentencias end

Programaci on en MATLAB

39

Existe tambi en la bifurcaci on m ultiple, en la que pueden concatenarse tantas condiciones como se desee, y que tiene la forma: if condicion1 bloque1 elseif condicion2 bloque2 elseif condicion3 bloque3 else % opci on por defecto para cuando no se cumplan las condiciones 1,2,3 bloque4 end donde la opci on por defecto else puede ser omitida: si no est a presente no se hace nada en caso de que no se cumpla ninguna de las condiciones que se han chequeado. Exponemos un ejemplo a continuaci on. Recordemos que los operadores l ogicos se pueden combinar con los relacionales para poder comprobar el cumplimiento de condiciones m ultiples. Ejemplo 4.1.1 .- El siguiente programa comprueba si un n umero es positivo, si no lo es produce un mensaje de error con el comando disp que sirve para escribir mensajes en la pantalla (m as adelante se explica con detalle la acci on de este comando). A continuaci on comprueba si, siendo positivo, es par . La orden rem(p,q) calcula el resto de la divisi on eucl dea de p por q . Si el n umero es positivo lo divide por 2 y en caso contrario, le suma 1 y el resultado lo divide por 2. if n<0 | n==0 disp(Introduce un n umero positivo); elseif rem(n,2)==0 a=n/2; else a=(n+1)/2 end Naturalmente la condici on n<0 | n==0 podr a sustituirse por la m as compacta n<=0. Se ha escrito de la forma expuesta para hacer uso de una condici on con dos relaciones y un operador l ogico.

SENTENCIA WHILE.- La estructura del bucle while es muy similar a la de cualquier otro
lenguaje de programaci on. Su sintaxis es la siguiente: while condicion sentencias end

Programaci on en MATLAB

40

donde condici on puede ser una expresi on vectorial o matricial. Las sentencias se siguen ejecutando mientras haya elementos distintos de cero en condicion; es decir, mientras haya alg un o algunos elementos true. El bucle se termina cuando todos los elementos de condicion son false (es decir, cero). Ejemplo 4.1.2 .- En el siguiente ejemplo se ejecutan una serie de operaciones sobre un cierto n umero n mientras este se mantenga mayor que 1. Concretamente, si n es par se divide por 2 y si es impar se multiplica por 3 y se le suma 1: while n>1 if rem(n,2)==0 n=n/2 else n=3*n+1 end; end; Crees que este proceso tiene n cualquiera que sea el valor de n? (Conjetura de Collatz, misterio de Siracusa, problema de Kakutani, algoritmo de Hasse o problema de Ulam). Finalmente, los bucles del tipo for . . . end tienen la siguiente sintaxis: for variable= expresi on sentencias end Habitualmente la expresi on es un vector de la forma i:s:j y las sentencias se ejecutan sucesivamente con la variable igual a cada elemento de la expresi on. Por ejemplo, para sumar los 25 1 primeros t erminos de la serie n : >> n=0; >> for i=1:25 n=n+1/i; end >> n n = 3.8160 Otra forma de denir una expresi on es usando notaci on vectorial: >> for x=[pi/6 pi/4 pi/3] disp([x, sin(x)]) end 0.5236 0.5000 0.7854 0.7071 1.0472 0.8660

Programaci on en MATLAB

41

Y por supuesto, se pueden encajar m ultiples bucles for. . . end unos dentro de otros. El siguiente i c odigo proporciona una matriz sim etrica 5 5 con el elemento j en la posici on (i, j ) para i j : >> n=5; A=eye(n); >> for j=2:n for i=1:j-1 A(i,j)=i/j; A(j,i)=i/j; end end >> A A = 1.0000 0.5000 0.5000 1.0000 0.3333 0.6667 0.2500 0.5000 0.2000 0.4000

0.3333 0.6667 1.0000 0.7500 0.6000

0.2500 0.5000 0.7500 1.0000 0.8000

0.2000 0.4000 0.6000 0.8000 1.0000

4.1.3.

Presentaci on de los resultados

Si en MATLAB hacemos >> v=1:5 la respuesta es la exposici on del resultado v = 1 2 3 4 5

A veces, sin embargo se quiere disponer de un formato de salida un poco m as estructurado. Por ejemplo se quiere mostrar una tabla de los valores de sen(2t) para 10 valores de t igualmente espaciados en el intervalo [0,1].Con el comando disp lo podemos hacer f acilmente. Escribimos un chero con el siguiente contenido t=linspace(0,1,10); y=sin(2*pi*t); disp( t sen(2*pi*t) ) disp(--------------------------) disp([t y]) Lo salvamos con el nombre, por ejemplo, seno2pit.m en nuestro directorio de trabajo de MATLAB, y lo ejecutamos en la ventana de comandos:

Programaci on en MATLAB >> seno2pit t sen(2*pi*t) -------------------------0 0 0.1111 0.6428 0.2222 0.9848 0.3333 0.8660 0.4444 0.3420 0.5556 -0.3420 0.6667 -0.8660 0.7778 -0.9848 0.8889 -0.6428 1.0000 -0.0000

42

El comando disp lo que hace es mostrar en pantalla el contenido de un vector (o matriz). Lo que sucede es que hay vectores de n umeros como >> v=[1 2 3] v = 1 2

y hay vectores de letras o caracteres o strings como >> v=ke kosa v = ke kosa As , una frase entre acentos es un vector de caracteres. Por eso en el programa de m as arriba escribimos disp( t sen(2*pi*t) ) para que en la pantalla aparezca exactamente la frase t sen(2*pi*t) . Si se quieren conseguir formatos m as especiales se puede usar el comando sprintf. Su uso en MATLAB es muy parecido al del comando hom onimo en lenguaje C.

4.2.

Scripts y Funciones

El nombre que se utiliza para los programas en MATLAB es el de M-les o cheros M. Hay dos tipos de cheros M: los scripts y las funciones. Son el equivalente a programas, funciones, subrutinas o procedimientos de otros lenguajes de programaci on como FORTRAN, C, Pascal o Java. Los cheros M son, por lo tanto, secuencias de comandos de MATLAB que se almacenan en cheros y que tienen alg un prop osito concreto. Un chero M puede hacer referencia a otros cheros M e incluso a s mismos (es decir, est a permitida la autorecursividad). Los cheros M son especialmente apropiados para

Programaci on en MATLAB

43

experimentar con algoritmos escribi endoles en un chero sobre el que poder hacer correcciones en vez de reescribir cada vez que se quiere experimentar una larga lista de comandos, guardar el resultado de un experimento num erico, como una lista de comandos y variables que producen un determinado resultado num erico o gr aco, construir programas que pueden ser utilizados con posterioridad varias veces, o, simplemente, intercambiar con alg un amigo o colega cheros de mutuo inter es. En la p agina web de Mathworks mencionada en la Introducci on pueden encontrarse numerosos cheros M escritos con distintos prop ositos, desde puramente computacionales a did acticos o por puro placer. Hay dos tipos de cheros M: Sripts o cheros de comandos. Por lo general no tienen argumentos de entrada ni de salida y operan con las variables del espacio de trabajo. Es decir, recogen variables ya existentes e interact uan con ellas para producir resultados num ericos o gr acos y quiz a nuevas variables. Funciones. Deben contener una primera l nea en la que aparece la palabra function. Se diferencian de los scripts en que aceptan entradas y devuelven salidas. Las variables internas son locales a la funci on (salvo que sean declaradas como global) Ya hemos visto en la secci on anterior c omo hacer cheros M de tipo script. Simplemente son cheros que ejecutan sucesivamente varios comandos de MATLAB con un objetivo espec co y siempre que se ejecutan producen el mismo resultado. Volveremos sobre ellos m as adelante para recalcar su diferencia con el otro tipo de cheros M, y que son los m as importantes: las funciones. Las funciones en MATLAB guardan una gran similitud con las funciones en lenguaje C o Pascal. Lo que exponemos a continuaci on est a inspirado en el primer cap tulo del libro Introduction to Scientic Computation de Charles F. van Loan. Sabemos de c alculo elemental que la serie de Taylor
n

Tn (x) =
k=0

xk k!

aproxima la funci on exponencial, ex , cerca de x = 0. Nuestro objetivo es estudiar esta aproximaci on. Es decir, cu an cerca est a Tn (x) de ex para los diversos valores de n? Te oricamente cuanto mayor es n m as cerca est a Tn (x) de ex . Para qu e valores de n nuestro ordenador no distingue entre Tn (x) y ex ?. Para ello damos por bueno el c alculo que hace MATLAB de la exponencial y creamos una funci on de MATLAB que nos devuelva el valor de Tn (x) en funci on de x y n. Esta funci on ser a la siguiente: function y= miexp1(x,n) % %Precondiciones: acepta dos valores x=n umero real y

Programaci on en MATLAB % n=entero positivo. % %Postcondiciones: devuelve en y la aproximacion de % orden n de la serie de Taylor de exp(x). y=1; t=1; for k=1:n t=x*t/k; y=y+t; end

44

Al igual que con los scripts debemos escribir estas l neas en un chero de texto y salvarlo con el nombre miexp1.m en un directorio (o carpeta) que est e en el path de MATLAB; por ejemplo, en nuestro directorio de trabajo. Debe observarse que ahora el nombre del chero s olo puede ser el que hemos dado a la funci on. Debemos tener cuidado, adem as, con que el nombre de la funci on no coincida con un nombre ya existente en el path de MATLAB. Como las distribuciones de MATLAB incorporan innidad de funciones debemos elegir nombres signicativos para nosotros pero no demasiado standard; por ejemplo, podemos empezar los nombres de nuestras funciones con el prejo mi. . . o escoger un nombre en euskera, etc. Al escribir una funci on en MATLAB debes seguir unas pocas, simples e importantes reglas: El chero debe empezar con la palabra function y tiene la siguiente estructura function variables de salida= Nombre de la funci on(variables de entrada) % % Comentarios que denen completamente las variables que deben pasarse a la funci on % (variables de entrada) y el resultado que produce la funci on (variables de salida) % cuerpo de la funci on: comanos de MATLAB En alg un sitio del cuerpo de la funci on se debe pasar a la variable de salida el valor deseado. Los comentarios que denen completamente la funci on deben hacerse inmediatamente despu es de la denici on de la funci on. Esto es importante porque cuando en la ventana de comandos se escriba help nombredelafuncion, MATLAB responder a escribiendo los comentarios que ah se escriban. Opcionalmente, y es recomendable hacerlo, se pueden escribir comentarios en otros lugares del cuerpo de la funci on para claricar el objetivo de uno o varios de los comandos que se utilizan. Estos comentarios deben ir siempre precedidos del s mbolo %. Las variables de entrada y salida son par ametros formales (es decir, letras). Cuando se llama a la funci on para que realice la acci on que se desea, deben ser sustitu dos por par ametros reales (es decir, n umeros, vectores, matrices,...). Por ejemplo, la funci on miexp1 debe ser llamada con dos n umeros concretos. x=miexp1(0.1,3) devolver a en la variable x el valor de la aproximaci on de Taylor de tercer orden en 0,1.

Programaci on en MATLAB

45

Las variables que se denan en el interior de la funci on (en nuestro caso t y k) son variables locales. Puede haber otras con el mismo nombre en el espacio de trabajo de MATLAB sin ning un problema. El chero que contiene la funci on debe estar en el path de MATLAB. Lo importante de las funciones de MATLAB, sean nativas o creadas por nosotros mismos, es que pueden ser llamadas por cualquier otro programa de MATLAB, bien sea un script u otra funci on. Por ejemplo, si queremos las gr acas para cuatro valores de n = 4, 8, 16, 20 del error x relativo que se comete al aproximar e por Tn (x) en el intervalo [-1,1], podemos crear un script como el que sigue m=100; x=linspace(-1,1,m); y=[]; exacto=exp(x); k=0; for n=[4 8 16 20] for i=1:m y(i)=miexp1(x(i),n); end errorrel=abs(exacto-y)./exacto; k=k+1; subplot(2,2,k) plot(x,errorrel) title(sprintf(n=%2.0f,n)) end Si escribimos estas l neas en un chero .m (por ejemplo, smiexp1.m) tenemos un script que al ejecutarlo en MATLAB >> smiexp1 nos produce cuatro gr acas (gura 4.3), cada una correspondiente a un valor de n, con el error relativo de la aproximaci on. Obs ervese el efecto del comando subplot(n,m,p). Crea una matriz de n m guras y asigna a la p- esima el siguiente comando plot. As p=1 corresponde a la gura en al posici on (1, 1), p=2 a la gura en la posici on (1, 2), etc. Todos los dem as comandos en el script ya son conocidos. En el script hemos creado el vector x=linspace(-1,1,100) de 100 componentes y se lo hemos pasado a la funci on exponencial obteniendo otro vector de 100 componentes que hemos llamado exacto. Sin embargo, para calcular Tn (x) hemos tenido que hacerlo componente a componente. Ello es debido a que la funci on miexp1 s olo acepta escalares y devuelve escalares. MATLAB est a pensado para trabajar con vectores, y como veremos enseguida lo hace m as r apido. Conviene que modiquemos nuestra funci on para que admita vectores y produzca vectores. La modicaci on es muy sencilla: hay que redenir y y t para que sean vectores del mismo tama no que x y cuyas componentes sean todas igual a 1. Adem as hay que usar el producto componente a componente entre x y t.

Programaci on en MATLAB
n= 4 0.02 7 6 0.015 5 4 0.01 3 0.005 2 1 0 1 0.5 0 0.5 1 0 1 0.5 0 0.5 1
6

46
n= 8

x 10

x 10 8

15

n=16 7 6

x 10

16

n=20

5 4

4 3 2 2 1 0 1 0.5 0 0.5 1 0 1 0.5 0 0.5 1

Figura 4.3: Error relativo al aproximar por Tn (x) function y= miexp2(x,n) % %Precondiciones: acepta dos valores x=vector de n umeros reales y % n=entero positivo. % %Postcondiciones: devuelve en el vector y la aproximacion de % orden n de la serie de Taylor de exp(x). y=ones(size(x)); t=ones(size(x)); for k=1:n t=x.*t/k; y=y+t; end Esto simplica mucho el correspondiente script para hallar el error relativo: x=linspace(-1,1,100); exacto=exp(x); errorrel=abs(exacto-miexp2(x,n))./exacto El resto del script ser a igual que en el caso anterior. As pues las variables de entrada y de salida pueden ser cualquier tipo de variable soportada por MATLAB. No s olo eso, pueden aparecer mezcladas. Por ejemplo las variables de entrada de la funci on miexp2 son un vector y un n umero. Tambi en las variables de salida pueden ser varias

Programaci on en MATLAB

47

y de distintos tipos. Por ejemplo, la siguiente funci on calcula el tiempo que tarda MATLAB en crear (no escribir en pantalla, sino poner en la memoria del ordenador) m matrices aleatorias de tama no n n y nos proporciona la u ltima matriz creada. Es un ejemplo un poco articial pero sirve para ilustrar las ideas que estamos comentando: la salida es un vector formado por dos variables, la primera es un n umero y la segunda una matriz. function [t,A]=tgmaf(n,m) % Precond: dos enteros positivos n y m, % Postcond: el tiempo,t, que tarda MATLAB en generar % m matrices aleatorias nxn y la ultima matriz generada, A %ponemos en marcha el reloj t0=clock; for j=1:m-1 rand(n); end A=rand(n); %Paramos el reloj t1=clock; % etime cuenta el tiempo transcurrido t=etime(t1,t0); Utilizamos aqu dos nuevos comandos (en realidad como todos los comandos de MATLAB, se trata de funciones del propio sistema, bien sean precompiladas o denidas a partir de cheros M): clock asigna a la variable correspondiente la hora del sistema y etime cuenta el tiempo (en segundos) que ha pasado entre dos instantes obtenidos con clock. Podemos hacer uso de estas dos funciones para comprobar que MATLAB emplea menos tiempo cuando trabaja con vectores como un todo que cuando trabaja componente a componente. El siguiente script nos sirve para comprobar el tiempo que tarda MATLAB en calcular el valor de Tn (x) para un determinado valor de n y para vectores x de distinto tama no con componentes en el intervalo [-1,1]: disp(length(x) miexp1(x) miexp2(x)) disp( tiempo tiempo ) disp(------------------------------------------------) for k=1000:1000:10000 x=linspace(-1,1,k); ti=clock; y=[]; for i=1:k y(i)=miexp1(x(i),17); end tf=clock; t1=etime(tf,ti); ti=clock;

Programaci on en MATLAB y=miexp2(x,17); tf=clock; t2=etime(tf,ti); disp(sprintf(%6.0f %16.2f %16.4f ,k ,t1 ,t2)) end

48

El resultado de este script depende de cada ordenador porque la rapidez con la que MATLAB realiza las operaciones no s olo depende del c odigo que se emplee sino, sobre todo, de las caracter sticas del propio ordenador (procesador, memoria, bus,. . . ). La salida debe parecerse a una tabla con la siguiente forma length(x) miexp1(x) miexp2(x) tiempo tiempo -----------------------------------------------1000 0.11 0.0006 2000 0.20 0.0007 3000 0.25 0.0010 4000 0.35 0.0013 5000 0.43 0.0016 6000 0.52 0.0020 7000 0.61 0.0023 8000 0.71 0.0025 9000 0.81 0.0029 10000 0.93 0.0033 Una u ltima observaci on. Se podr a querer tener tablas comparativas para diversos valores de n y de la longitud de x. Para conseguirlo bastar a convertir el script anterior en una funci on: function fetmiexp(k,n) % Precond: un vector de enteros k y un entero n % % Postcond: fetmiexp produce una tabla % que compara el tiempo que se tarda en % calcular la aproximaci on de exp(x) mediante % la aproximaci on de orden n de la serie de Taylor % para un vector x de k componentes. Cada fila de % la tabla corresponde a cada componente de k. % disp(length(x) miexp1(x) miexp2(x)) disp( tiempo tiempo ) disp(------------------------------------------------) for j=k x=linspace(-1,1,j); ti=clock;

Programaci on en MATLAB y=[]; for i=1:j y(i)=miexp1(x(i),17); end tf=clock; t1=etime(tf,ti); ti=clock; y=miexp2(x,17); tf=clock; t2=etime(tf,ti); disp(sprintf(%6.0f %16.2f %16.4f ,j ,t1 ,t2)) end

49

Si en MATLAB hacemos >> fetmiexp(1000:1000:10000,17) obtenemos la misma tabla de m as arriba. La ventaja es que ahora podemos probar con diversos valores de k y n sin tener que modicar el script cada vez. Debe notarse que no hay variable de salida. Esta funci on produce un resultado: una tabla con la comparativa de tiempos pero no almacena esta salida en ninguna variable. El rec proco, que una funci on tenga variables de salida pero no de entrada, tambi en es posible pero muy poco frecuente.

Cap tulo 5

N umeros complejos y polinomio

MATLAB trabaja indistintamente con n umeros reales o complejos, pero hay algunas propiedades espec cas de estos u ltimos que hay que tener en cuenta. Polinomios son vectores cuyas componentes son los coecientes del polinomio. Sumar polinomios es como sumar vectores, pero tambi en se puede multiplicar y dividir polinomios. MATLAB tiene una serie de funciones que ayudan a trabajar con polinomios c omodamente.

5.1.

N umeros Complejos

El comando abs(a) devuelve el valor absoluto o el m odulo del n umero a seg un que este sea real o complejo. De la misma forma abs(A) devuelve una matriz cuyos elementos son los m odulos o los valores absolutos de los elementos de A seg un que estos sean n umeros complejos o reales. Adem as, como ya se dijo en el Cap tulo 2, MATLAB no produce un error si se le pide la ra z cuadrada o el logaritmo de un n umero negativo sino que devuelve el correspondiente n umero complejo. La unidad imaginaria es una constante predenida en MATLAB. Las letras que la designan son bien i, bien j. Hay que tener cuidado con la trasposici on. Si A es una matriz de n umeros complejos entonces A es la transpuesta conjugada de A (lo que nosotros solemos designar como A ). Si queremos la transpuesta de A debemos usar A. . Por ejemplo >> A=[1-i 2+i; 3+i i] A = 1.0000 - 1.0000i 2.0000 + 1.0000i 50

N umeros complejos y polinomio 3.0000 + 1.0000i >> Atc=A Atc = 1.0000 + 1.0000i 2.0000 - 1.0000i >> At=A. At = 1.0000 - 1.0000i 2.0000 + 1.0000i 3.0000 + 1.0000i 0 + 1.0000i 3.0000 - 1.0000i 0 - 1.0000i 0 + 1.0000i

51

Finalmente, el comando plot cuando se emplea con n umeros complejos tiene un signicado especial: Si y es un vector de n umeros complejos la sentencia plot(y) es equivalente a plot(real(y),imag(y)).

5.2.

C alculo con Polinomios

Tal y como hemos dicho Para MATLAB un polinomio es el vector de sus coecientes. Por ejemplo, el polinomio: p(x) = x4 8x2 + 6x 10 se puede representar mediante el vector >>[1, 0, -8, 6, -10]. MATLAB puede realizar diversas operaciones sobre el, como por ejemplo evaluarlo para un determinado valor de x (funci on polyval()) y calcular las ra ces (funci on roots()): >> pol=[1 0 -8 6 -10] pol = 1 0 -8 6 -10

>> roots(pol) ans = -3.2800 >> polyval(pol,1) 2.6748 0.3026 + 1.0238i 0.3026 - 1.0238i

N umeros complejos y polinomio ans = -11

52

Hay una funci on similar a polyval pero para matrices: la funci on plyvalm. Dada una matriz A y polinomio p() = pol, la funci on polyvalm(pol,A) devuelve la matriz p(A). As con el polinomio pol=[1 0 -8 6 -10] denido m as arriba: >> A=ceil(rand(3,3)*5-7) A = -2 -5 -3 -4 -2 -3 -4 -6 -2

>> polyvalm(pol,A) ans = 3130 3818 2568 2896 3526 2370 3688 4476 2998

Para calcular el producto de polinomios MATLAB utiliza una funci on llamada conv() (de producto de convoluci on). En el siguiente ejemplo se va a ver c omo se multiplica un polinomio de segundo grado por otro de tercer grado: >> pol1=[1 -2 4] pol1 = 1

-2

>> pol2=[1 0 3 -4] pol2 = 1

-4

>> pol3=conv(pol1,pol2) pol3 = 1

-2

-10

20

-16

Para dividir polinomios existe otra funci on llamada deconv(). Las funciones orientadas al c alculo con polinomios son las siguientes: poly(A) polinomio caracter stico de la matriz A

N umeros complejos y polinomio poly(v) roots(pol) polyval(pol,x) polyvalm(pol,A) conv(p1,p2) [c,r]=deconv(p,q) residue(p1,p2) polyder(pol) polyder(p1,p2) polyfit(x,y,n) polinomio cuyas ra ces son los elementos de v ra ces del polinomio pol evaluaci on del polinomio pol para el valor de x. Si x es un vector, pol se eval ua para cada elemento de x evaluaci on del polinomio pol de la matriz A producto de convoluci on de dos polinomios p1 y p2 divisi on del polinomio p por el polinomio q. En c se devuelve el cociente y en r el resto de la divisi on descompone el cociente entre p1 y p2 en suma de fracciones simples (ver >> help residue) calcula la derivada de un polinomio calcula la derivada del producto de polinomios calcula los coecientes de un polinomio p(x) de grado n que se ajusta a los datos (xi , yi ), en el sentido de los m nimos cuadrados.

53

Existen tambi en algunas funciones orientadas a la interpolaci on polinomial que no vamos a considerar aqu . Si quieres saber algo sobre ellas utiliza la ayuda.

Ap endice A

Funciones incorporadas en MATLAB


En este ap endice se relacionan algunas (muchas) funciones nativas de MATLAB. Algunas de ellas est an incorporadas al n ucleo de MATLAB y otras son cheros M. Nosotros no vamos a distinguir entre ambos tipos de funciones. Las hemos clasicado de acuerdo a su prop osito general pero algunas de ellas podr an estar en varios grupos. Se describe brevemente lo que hacen y en muchos casos tanto las variables de entrada (los tipos de variables que aceptan) como las de salida (lo que producen) son m as de las que se relacionan. Es decir, se explica su objetivo principal pero pueden hacer m as cosas de las que se mencionan. Por ejemplo, si v = [1 2 3 4] entonces >> v=[1 2 3 4]; >> diag(v) ans = 1 0 0 2 0 0 0 0

0 0 3 0

0 0 0 4

Es decir, diag(v) devuelve la matriz diagonal cuya diagonal es el vector v. Pero >> diag(v,1) ans = 0 1 0 0 0 0 0 0 0 0

0 2 0 0 0

0 0 3 0 0

0 0 0 4 0

devuelve una matriz 5 5 cuya superdiagonal es v. Tanto para una explicaci on m as detallada de cada una de las funciones como de toda su potencialidad se recomienda utilizar el sistema de ayuda. Conociendo el nombre de la funci on lo m as 54

Funciones incorporadas en MATLAB r apido es utilizar el comando help funci on.

55

A.1.

Funciones que act uan sobre escalares

Hay funciones matem aticas elementales que operan de modo escalar. Estas funciones, que comprenden las funciones matem aticas trascendentales y otras funciones b asicas, act uan sobre cada elemento de la matriz como si se tratase de un escalar. Se aplican de la misma forma a escalares, vectores y matrices. Algunas de las funciones de este grupo son las que se relacionan a continuaci on. Se debe entender que si el argumento o argumentos sobre los que act ua la funci on son matrices o vectores entonces dicha funci on act ua t ermino a t ermino. As , si x es una matriz, sin(x) devuelve una matriz cuyos elementos son los senos de los elementos de la matriz x. TRIGONOMETRICAS sin(x) cos(x) tan(x) cot(x) sec(x) csc(x) asin(x) acos(x) atan(x) atan2(x,y) acot(x) asec(x) acsc(x) sinh(x) cosh(x) tanh(x) coth(x) sech(x) csch(x) asinh(x) acosh(x) atanh(x) acoth(x) asech(x) acsch(x) seno coseno tangente cotangent secante cosecante arco seno arco coseno arco tangente (devuelve un angulo entre /2 y +/2) arco tangente (devuelve un angulo entre y + ); se le pasan 2 argumentos, proporcionales al seno y al coseno arco cotangente arco secante arco cosecante seno hiperb olico coseno hiperb olico tangente hiperb olica cotangente hiperb olica secante hiperb olica cosecante hiperb olica arco seno hiperb olico arco coseno hiperb olico arco tangente hiperb olica arco cotangente hiperb olica arco secante hiperb olica arco cosecante hiperb olica

Funciones incorporadas en MATLAB EXPONENCIALES exp(x) log(x) log10(x) log2(x) sqrt(x) realpow(x) reallog(x) realsqrt(x) funci on exponencial logaritmo natural (neperiano) logaritmo decimal logaritmo en base 2 ra z cuadrada potencia que da error si x no es real logaritmo neperiano de n umeros reales ra z cuadrada de n umeros mayores o iguales a cero

56

COMPLEJAS abs(x) angle(x) complex(x,y) conj(x) real(x) imag(x) isreal(x) valor absoluto o m odulo si x es un n umero complejo argumento del n umero complejo x devuelve el n umero complejo x + iy complejo conjugado parte real parte imaginaria devuelve 1 si x es real y 0 si x tiene parte imaginaria

DE REDONDEO Y RESTO sign(x) devuelve -1 si x < 0, 0 si x = 0 y 1 si x > 0. Aplicada a un n umero complejo, devuelve un vector unitario en la misma direcci on que x resto de la divisi on de x entre y . Los argumentos son n umeros reales (no necesariamente enteros) similar a rem (Ver diferencias con el sistema de ayuda) redondeo hacia el entero m as pr oximo redondea hacia el entero m as pr oximo a 0 valor entero m as pr oximo hacia valor entero m as pr oximo hacia + m aximo com un divisor m nimo com un m ultiplo

rem(x,y) mod(x,y) round(x) fix(x) floor(x) ceil(x) gcd(x,y) lcm(x,y)

Funciones incorporadas en MATLAB

57

Hay otras funciones escalares que pueden ser consultadas a trav es de la ayuda en el apartado matlab/specfun.

A.2.

Funciones que act uan sobre vectores

Las siguientes funciones act uan sobre vectores. Aqu se presentan s olo algunas funciones. Una relaci on completa de todas las funciones soportadas por MATLAB se puede obtener consultando la ayuda: matlab/datafun. length(x) [vM,pM]=max(x) [vm, pm]=min(x) sum(x) cumsum(x) devuelve la longitud del vector x m aximo elemento de un vector. Devuelve el valor m aximo vM y la posici on que ocupa pM en el vector m nimo elemento de un vector. Devuelve el valor m nimo y la posici on que ocupa suma de los elementos de un vector devuelve el vector suma acumulativa de los elementos de un vector. Es decir, el primer elemento del nuevo vector es el mismo que el de x, el segundo es la suma de los dos primeros de x, el tercero es la suma de los tres primeros vectores de x, y as sucesivamente valor medio de los elementos de un vector desviaci on t pica producto de los elementos de un vector devuelve el vector producto acumulativo de los elementos de un vector (como en cumsum pero respecto al producto) ordenaci on de menor a mayor de los elementos de un vector x. Devuelve el vector ordenado y , y un vector i con las posiciones iniciales en x de los elementos en el vector ordenado

mean(x) std(x) prod(x) cumprod(x) [y,i]=sort(x)

En realidad estas funciones se pueden aplicar tambi en a matrices , pero en ese caso se aplican por separado a cada columna de la matriz, dando como valor de retorno un vector resultado de aplicar la funci on a cada columna de la matriz considerada como vector. Si estas funciones se quieren aplicar a las las de la matriz basta aplicar dichas funciones a la matriz traspuesta.

A.3.

Funciones que act uan sobre matrices

Las siguientes funciones exigen que el/los argumento/s sean matrices. En este grupo aparecen algunas de las funciones m as u tiles y potentes de MATLAB. No est an todas las que soporta MATLAB. La relaci on completa se puede consultar a trav es de la ayuda: matlab/elmat y matlab/matfun principalmente. Se clasicar an en varios subgrupos:

Funciones incorporadas en MATLAB FUNCIONES MATRICIALES ELEMENTALES A A. calcula la traspuesta (conjugada) de la matriz A calcula la traspuesta (sin conjugar) de la matriz A. Si la matriz A es de n umeros reales A. y A producen el mismo resultado. devuelve la traza de la matriz cuadrada A devuelve el n umero de las m y de columnas n de una matriz rectangular A devuelve el n umero de elementos de la matriz A.

58

trace(A) [m,n] = size(A) numel(A)

FUNCIONES MATRICIALES ESPECIALES power(A,b) power(b,A) exp(A) sprt(A) log(A) mpower(A,n) expm(A) sqrtm(A) logm(A) Si A = [aij ] devuelve la matriz cuyos elementos son ab ij . a ij devuelve la matriz cuyos elementos son b . devuelve una matriz cuyos elementos son exp(aij ) = eaij . devuelve una matriz cuyos elementos son aij . devuelve una matriz cuyos elementos son ln(aij ). devuelve la matriz A . . . A n veces, si n es un entero. devuelve la exponencial de A; i.e. eA . devuelve A; i.e. una matriz que multiplicada por s misma da A. devuelve la matriz ln(A); i.e. una matriz B tal que eB = A.

Los comandos A.^n y A^ n son equivalentes a las funciones power(A,n) y powerm(A,n) respectivamente. FUNCIONES PARA MANIPULAR MATRICES cat(Dim,A,B) concatena las matrices A y B , i.e. las pone una junto a la otra. Si Dim=1 B debajo de A y si Dim=2 pone B detr as de A cambia el tama no de A a una matriz m n dependiendo del argumento se emplea para construir una matriz diagonal o para extraer la diagonal de una matriz construye una matriz diagonal por bloques extrae la parte triangular inferior de A extrae la parte triangular superior de A permuta las columnas de A: la u ltima pasa a ser la primera, la ante ultima pasa a ser la segunda, etc..

reshape(A,m,n) diag blkdiag(A,B) tril(A) triu(A) fliplr(A)

Funciones incorporadas en MATLAB flipud(A) rot90(A) [I,J,V]= find(A) lo mismo que fliplr pero por las rota A 90 grados encuentra las las y columnas donde est an los elementos no nulos de A y los almacena en I y J , respectivamente. En V pone el vector de elementos no nulos. devuelve el u ltimo ndice de A

59

end(A)

FUNCIONES DE ANALISIS MATRICIAL n=norm(v) n=normest(A) norma 2 del vector v o de la matriz, si el argumento es una matriz.Hay variantes para otras normas estimaci on de la norma 2 de la matriz A. Se usa cuando el tama no de A es muy grande y se consume mucho tiempo en calcular norm(A) rango de la matriz A determinante de A traza de A las columnas de N forman una base del n ucleo de A las columnas de Q forman una base ortonormal del espacio imagen de A angulo entre los subespacios generados por las columnas de AyB

r=rank(A) d=det(A) t=trace(A) N=null(A) Q=orth(A) subspace1(A,B)

DE MATRICES Y FUNCIONES DE FACTORIZACION DE RESOLUCION DE SISTEMAS LINEALES /y\ B = inv(A) c = cond(A) U = chol(A) [L,U] = lu(A) soluci on de sistemas lineales (ver la ayuda help slash) inversa de A n umero de condici on de A en la norma 2 . Hay una variante para otras normas descomposici on de Cholesky de una matriz denida positiva descomposici on LU (con pivotamiento) de la matriz A. Es decir, P A = LU , P una matriz de permutaci on, L triangular inferior con 1s en la diagonal y U una matriz triangular superior. descomposici on QR de A Determinante de la matriz cuadrada A reducci on a forma de escalera por las de una matriz rectangular A descomposici on de Cholesky de una matriz denida positiva

[Q,R]=qr(A) d = det(A) E = rref(A) U = chol(A)

Funciones incorporadas en MATLAB P=pinv(A) pseudoinversa (o inversa de Moore-Penrose) de A

60

FUNCIONES PARA CALCULO DE VALORES PROPIOS Y SINGULARES E=eig(A) [U,S,V]=svd(A) P=poly(X) devuelve el vector E con los valores propios de A descomposici on de A en valores singulares: A = U SV si X es una matriz cuadrada, P es un vector cuyas componentes son los coecientes del polinomio caracter stico de X . Si X es un vector, P es un polinomio cuyas ra ces son las componentes de X forma Hessenberg de A forma de Schur de A. U es la matriz unitaria tal que A = U SU transforma la forma de Schur real en la compleja. La forma de Scur compleja es la habitual: una matriz triangular superior con los valores propios (posiblemente complejos) en la diagonal. La forma real de Schur se reere a una matriz real cuyos valores propios complejos aparecen en pares conjugados. La matriz R de la forma de Schur es real y en ella aparecen bloques diagonales 2 2 asociados a los valores propios complejos conjugados. el rec proco del anterior. Convierte la forma diagonal compleja de Schur de una matriz real a la forma real.

H=hess(A) [U,S]=schur(A) [U,S]=rsf2csf(U,R)

[U,S]=cdf2rdf(U,R)

Ap endice B

Consejos para el uso de Matlab en picasso


B.1. Transferencia de cheros a picasso

Para transferir cheros a picasso desde el aula de ordenadores sigue las siguientes instrucciones: 1. Selecciona Programas ->FileZilla Ftp Client ->Filezilla . Ver as el siguiente icono:

2. Aparecer a la siguiente ventana

3. En la ventanita Servidor escribe la direcci on de picasso: 158.227.5.31, En Nombre de ususario escribe el nombre de tu cuenta. En Contrase~ na tu contrase na y puerto escribe 22. A continuaci on pulsa la tecla Entrar. 4. Conrma la conexi on si as te lo pide. 5. Aparecer a una ventana como la siguiente: 61

Consejos para el uso de Matlab en picasso

62

Las ventanas de la izquierda muestran el contenido del ordenador en el que est as actuando (el cliente) y las de la derecha el de tu cuenta en picasso (servidor). 6. En picasso cambia al directorio matlab pinchando sobre el. Si todav a no lo has creado procede de la siguiente forma: Pincha con el bot on derecho del rat on en cualquiera de las ventanas correspondientes a picasso. Te aparece un men u en el que puedes seleccionar crear directorio. Una vez hecho, aparece una ventanita con el path completo del directorio que se crear a. Comprueba que es correcto y escribe el nombre del directorio; en este caso, matlab (en min usculas). 7. Para trasladar cheros entre el cliente y el servidor mu evete al directorio que contiene el chero que quieres transferir y al directorio de destino. Arrastra entonces el chero de una ventana a la otra. Comprueba que la transferencia ha sido correcta. Una vez terminada la transferencia, sal de FileZilla. Este programa de transferencia segura de cheros puedes obtenerlo de forma gratuita en la red. Para ello busca e instala los programas putty y FileZilla.

B.2.

Primer uso de MATLAB

La primera vez que vayas a usar MATLAB en el servidor del Departamento de Matem atica Aplicada y EIO, picasso, debes hacer lo siguiente: 1. Abre una ventana de comandos o x-terminal 2. Escribe en ella matlab 3. Una vez abierto MATLAB, pincha sucesivamente en File Preferences Editor/Debugger. 4. Selecciona Text Editor 5. Escribe en el espacio en blanco: /usr/bin/gedit 6. Pincha en OK

Consejos para el uso de Matlab en picasso

63

La raz on es que el editor que tiene por defecto MATLAB no funciona bien (en la versi on instalada en picasso) con el sistema operativo Solaris y hay que denir uno que s lo haga. Hemos elegido gedit como editor por defecto, pero si preeres otro (hay varios posibles) basta sustituir /usr/bin/gedit por el correspondiente comando. Puedes automatizar el modo de abrir MATLAB a nadiendo un icono al escritorio de modo que al pinchar sobre el se lance MATLAB. El procedimiento es el siguiente: 1. Coloca el rat on en cualquier punto libre del escritorio y haz click con el bot on derecho. Aparece un men u. 2. Pincha sobre Create Launcher. Aparece un cuadro con recuadros para rellenar. 3. En el recuadro Name escribe MATLAB 4. En el recuadro Command escribe /opt/matlab2007/bin/matlab 5. Los dem as recuadros puedes dejarlos en blanco. 6. Pincha sobre el cuadradito que sirve para seleccionar Run in terminal 7. Pincha en el cuadro grande en el que pone No Icon. Se abrir a una ventana con posibles dibujos a utilizar. 8. En el recuadro superior pone /usr/share/pixmaps. Sustit uyelo por /opt/matlab2007/X11/icons/matlab48c icon.xpm y pincha en OK. Aparecer a el icono de MATLAB en tu escritorio. Ahora pinchando (doble click) sobre el se deber a abrir MATLAB. No olvides cambiar el editor.

You might also like