´ cticas de Ampliacio ´n Pra ´todos Nume ´ricos de Me con MATLAB
Ion Zaballa
´Indice general 1. Lo B´ asico
4
1.1. Introducci´ on . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
4
1.2. Comienzo y Fin de una sesi´ on de MATLAB . . . . . . . . . . . . . . . . . . . . .
5
1.3. Sistema de Ayuda . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
6
1.4. Edici´ on en la L´ınea de Comandos . . . . . . . . . . . . . . . . . . . . . . . . . . .
7
2. Matrices y Vectores
9
2.1. Generaci´ on de matrices expl´ıcitamente . . . . . . . . . . . . . . . . . . . . . . . .
9
2.1.1. Elementos de Matrices . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
11
2.1.2. Formatos de Salida . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
12
2.2. Manipulaci´ on de vectores y matrices . . . . . . . . . . . . . . . . . . . . . . . . .
14
2.3. Matrices a partir de funciones predefinidas en MATLAB . . . . . . . . . . . . . .
20
2.4. Otras formas de generar matrices . . . . . . . . . . . . . . . . . . . . . . . . . . .
22
3. El Entorno de Trabajo de MATLAB
24
3.1. El Espacio de Trabajo . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
24
3.1.1. Comandos save y load . . . . . . . . . . . . . . . . . . . . . . . . . . . .
25
3.1.2. El Comando diary . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
26
3.1.3. L´ıneas de comentarios . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
26
3.2. El Camino de b´ usqueda (SEARCH PATH) de MATLAB . . . . . . . . . . . . . .
27
3.3. Manipulaci´ on de ficheros . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
29
3.3.1. Ejecuci´ on de Programas Externos
2
. . . . . . . . . . . . . . . . . . . . . .
30
3 4. Programaci´ on en MATLAB
31
4.1. Empezando a programar en MATLAB . . . . . . . . . . . . . . . . . . . . . . . .
31
4.1.1. Operadores relacionales y l´ogicos . . . . . . . . . . . . . . . . . . . . . . .
33
4.1.2. Bifurcaciones y Bucles . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
38
4.1.3. Presentaci´ on de los resultados . . . . . . . . . . . . . . . . . . . . . . . . .
41
4.2. Scripts y Funciones . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
42
5. N´ umeros complejos y polinomio
50
5.1. N´ umeros Complejos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
50
5.2. C´alculo con Polinomios
51
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
A. Funciones incorporadas en MATLAB
54
A.1. Funciones que act´ uan sobre escalares . . . . . . . . . . . . . . . . . . . . . . . . .
55
A.2. Funciones que act´ uan sobre vectores . . . . . . . . . . . . . . . . . . . . . . . . .
57
A.3. Funciones que act´ uan sobre matrices . . . . . . . . . . . . . . . . . . . . . . . . .
57
B. Consejos para el uso de Matlab en picasso
61
B.1. Transferencia de ficheros a picasso . . . . . . . . . . . . . . . . . . . . . . . . . .
61
B.2. Primer uso de MATLAB . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
62
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´ıficas 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 refieren 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
5
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´ aficos 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´aficos 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 14–MATLAB 7) corrigen algunas deficiencias de edici´on con el teclado en castellano (como la ubicaci´on del s´ımbolo [ o el acento circunflejo ^) que ten´ıan las versiones anteriores para los sistemas UNIX. Esto significa 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´afico. 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´afico, que es m´as sencillo, se debe escribir matlab y pulsar la tecla de entrada. Trabajando en picasso en modo gr´ afico, MATLAB puede consumir muchos recursos del sistema; principalmente si hay muchos usuarios conectados y dependiendo de la calidad de los terminales gr´aficos. 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´ afico, 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 figura 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
6
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 finalizar 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´afico como en modo consola. Si se trabaja en modo gr´afico 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
7
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 flechas 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 final 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 fin de la l´ınea
No es necesario poner el cursor al final 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
8
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 predefinidas en MATLAB. Cargando matrices desde un fichero de datos externo. Creando matrices con funciones definidas por el usuario/a a trav´es de ficheros 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 fila a fila. Los elementos de cada fila deben estar separados por comas o espacios en blanco. Para indicar el final de una fila 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 fila 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 fila es muy grande y es preferible introducir una fila 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´ıfica 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 predefinida 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 definidas 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 significa.
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
sqrt(3) (1+2+3)*4/5]
produce x = -1.3000
1.7321
4.8000
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
12
>> helpwin 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 predefinidas: pi i j eps realmin realmax inf nan
2.1.2.
3.14159265. . . √ la unidad imaginaria, −1. lo mismo que i. precisi´ on relativa de los n´ umeros en coma flotante, 2−52 = 2,204e − 16. Es decir distancia de 1.0 al siguiente n´ umero m´as pr´oximo en coma flotante. n´ umero en coma flotante m´as peque˜ no, 2−1022 . n´ umero en coma flotante m´as grande, (2 − eps)21023 . infinito. 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.
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
format compact format rat
coma fija con 4 decimales(formato por defecto) coma fija con 15 decimales cifras hexadecimales n´ umeros con dos cifras decimales notaci´ on cient´ıfica con 4 decimales notaci´ on cient´ıfica o decimal, dependiendo del valor notaci´ on cient´ıfica 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
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 10−3 ).
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 = A−1 B y B/A = BA−1 . Ambas producen lo mismo cuando son aplicadas a n´ umeros. As´ı 1/4 y 1 \ 4 producen el mismo 0 valor num´erico: 0,25. De la misma forma A es la transpuesta de A y si a es un n´ umero a0 = 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
14
>> 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
¿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
2
3
4
5
Mientras que >> y=0:pi/4:pi proporciona un vector entre 0 y π con incrementos de π/4:
Matrices y Vectores
15
y = 0
0.7854
1.5708
2.3562
3.1416
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 especifica 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 significa 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 final del comando para que el resultado no sea mostrado). Por otra parte, dada una matriz A, el elemento de la fila 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 modificar 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
16
>> 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 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
6
7
8
9
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
5
6
7
8
y el formado por los u ´ltimos 4: >> a(end-3:end) ans = 7 8
9
10
Para obtener la submatriz formada por los elementos que ocupan las posiciones donde se interceptan las filas 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 filas 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 filas o columnas igualmente espaciadas. Por ejemplo, si A fuera una matriz 10×15, el comando A(2:2:10,1:3:15) nos devolver´ıa la submatriz formada por las filas pares y las columnas 1,4,7,10 y 13. Si a una matriz le especificamos un solo sub´ındice, MATLAB cuenta los elementos por columnas y nos devuelve el elemento correspondiente:
Matrices y Vectores
18
>> A(7) ans = 6 >> A(12) ans = 14
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 filas o columnas de una matriz. As´ı para obtener una matriz B con las filas 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 filas: >> B=A([2 1 3 4],:) B =
Matrices y Vectores 5 16 9 4
10 3 6 15
11 2 7 14
19 8 13 12 1
Dada una matriz A podemos a˜ nadirle filas y columnas sin m´as que especificar el vector con los elementos que se quiere a˜ nadir. Por ejemplo, si a nuestra matriz A le queremos a˜ nadir la fila [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 definir primero el vector fila 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 r0 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 filas o columnas como hemos hecho m´as arriba: >> B=[]
Matrices y Vectores
20
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 Tambien podemos eliminar filas 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 predefinidas en MATLAB
Hay un buen n´ umero de funciones de matrices predefinidas 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 1’s 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
diag(A,k)
21
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
22
3 ans = 1 1 1 1 1 1 ans = -1 -1 -1 -1 -1 -1
2.4.
Otras formas de generar matrices
Hay otras formas de producir matrices. Comentamos a continuaci´on c´omo generar matrices a partir de ficheros externos. Estos son ficheros 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´ıfico donde almacenar estos y otros posibles ficheros. 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 ficheros externos. Me referir´e a matlabdir como el directorio donde se guardar´an todos los ficheros 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 ficheros 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 ficheros externos: Con el comando load. Este comando puede leer ficheros externos binarios, producidos por sesiones anteriores de MATLAB, o de texto. Para obtener matrices de ficheros 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 fila por l´ınea y con igual n´ umero de elementos en cada fila. Por ejemplo, con un editor de texto (textedit en picasso o notepad en MSWindows) podemos crear un fichero 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 fichero bajo el nombre de magico.dat en el directorio matlabdir. El comando >> load magico.dat lee el fichero y asigna a la variable magico la matriz contenida en el fichero. >> magico magico = 16 5 9 4
3 10 6 15
2 11 7 14
13 8 12 1
Creando un fichero M con el contenido de una o m´as matrices. Los ficheros M son parte fundamental de MATLAB y los analizaremos posteriormente. Por ahora s´olo necesitamos saber que si con nuestro editor creamos un fichero de texto que contenga las siguientes 5 filas: 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 fichero como magico.m, entonces el comando magico en MATLAB lee el fichero y crea la variable A que contiene la matriz del fichero. Por supuesto, el fichero 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´afico 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´a y 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 figura 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 fin 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 definidas, 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
26
matlab/general
3.1.2.
El Comando diary
Los comandos save y load crean ficheros 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 fichero 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 fichero 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 significa 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 especifique el path completo en el que se quiere guardar el fichero, ´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 fichero filename.txt con un editor de texto es necesario que diary est´e en off porque si no MATLAB mantiene abierto el fichero 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) especificadas 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 fin 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 (ficheros M) tal y como veremos m´as adelante.
El Entorno de Trabajo de MATLAB
3.2.
27
El Camino de b´ usqueda (SEARCH PATH) de MATLAB
El search path de MATLAB es una lista de directorios que se puede ver y modificar 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 definida 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 fichero llamado nombre1.mex o nombre1.m en el directorio actual (de los ficheros M hablaremos m´ as adelante, los ficheros .mex tienen un significado especial para MATLAB del que no hablaremos aqu´ı). 5. Comprueba si hay ficheros 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 fichero 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 definir la lista de directorios donde MATLAB debe buscar los ficheros 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 especificar, 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 final de la lista. Tal y como hemos mencionado, el orden de la lista es muy importante porque refleja 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 fichero 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 fichero 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 modificarlo el administrador. En Windows puede hacerlo cualquiera, pero es altamente recomendable que no lo hagas. Ahora bien, cada usuario puede escribir un fichero para que cada vez que se empiece una sesi´ on de MATLAB, ´este se inicie con los par´ametros que cada cual desee. Este fichero se debe llamar startup.m y debe estar, en sistemas UNIX, en el subdirectorio home/izaballa/matlab del correspondiente ususario. Bajo Windows este fichero se debe colocar en la subcarpeta work de la carpeta donde est´ a instalado MATLAB (posiblemente C:\matlabr14 o algo as´ı). Por ejemplo, un fichero startup.m que contenga las siguientes l´ıneas:
El Entorno de Trabajo de MATLAB
29
cd \$HOME/matlab format compact addpath ’/usr/alu/julen/matlab/practicas’ -end !texedit disp(’Kaixo’) 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 final 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 fichero 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 fichero finish.m, siempre que se encuentre en alguno de los directorios del search path. Este fichero se puede utilizar por ejemplo para guardar el espacio de trabajo de MATLAB (recuerda el comando save).
3.3.
Manipulaci´ on de ficheros
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 ficheros 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 ficheros Text Editor que trae por defecto el sistema Open windows de Solaris y cargar en ´el el fichero 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 suficientemente pr´oximos el efecto visual es una curva. As´ı pues, para dibujar la curva x = t2 tenemos que dar tres pasos: definir el vector t, definir 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 dificultades que hay para usar ˆ en picasso y que este operador se puede sustituir por power): 31
Programaci´on en MATLAB
32
>> t=-2:0.1:2; x=t.^2; plot(t,x) o preferiblemente >> t=linspace(-2,2);x=t.^2; plot(t,x) 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 fichero, 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 fichero con c´odigo ejecutable). Para ejecutar las ´ ordenes contenidas en este fichero basta escribir su nombre en la ventana de comandos; en este caso parabola: >> parabola El resultado es una nueva ventana, como la de la figura 4.2, que contiene la gr´afica 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´ afica 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 significado especial. Por ejemplo, dada una matriz A la comparaci´on abs(A)> A=[-1 2 0; 0 -1 -3; 1 -1 0] A = -1 2 0 0 -1 -3 1 -1 0
Programaci´on en MATLAB
34
>> B=(abs(A)> any(B) ans = 1
0
1
Y la sentencia any(any(abs(A)> any(any(B)) ans = 1 As´ı pues, la sentencia any(any(abs(A)> all(A) ans = 0
1
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)
Programaci´on en MATLAB
35
>> 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 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 finitos de un vector verdadero si el vector es de elementos en coma flotante detecta los elementos infinitos 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
36
ans = 1 1 1 1 >> isnumeric(A) ans = 1 >> isreal(A) ans = 1 >> isvector(A) ans = 0 ´ 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
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
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)
Programaci´on en MATLAB
37
ans = 0 >> 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
0
Una primera aplicaci´ on es extraer de x los elementos no nulos: >> x(f) ans = -3
1
-Inf
Podemos extraer los elementos finitos > 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
0
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
Programaci´on en MATLAB
38
C = 1 1 0 0 >> C(:) ans = 1 0 1 0 0 1 >> find(A
0 1
Otro posible uso de find con matrices es [i,j]=find(A) que devuelve vectores i y j con los ´ındices de las filas y columnas de A distintos de cero, respectivamente. As´ı >> [i,j]=find(A
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 fin 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 primeros t´erminos de la serie n1 : >> n=0; >> for i=1:25 n=n+1/i; end >> n n = 3.8160 Otra forma de definir 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 c´odigo proporciona una matriz sim´etrica 5 × 5 con el elemento ji 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
4.1.3.
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
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(2πt) para 10 valores de t igualmente espaciados en el intervalo [0,1].Con el comando disp lo podemos hacer f´acilmente. Escribimos un fichero 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
42
>> 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 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
3
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-files o ficheros M. Hay dos tipos de ficheros 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 ficheros M son, por lo tanto, secuencias de comandos de MATLAB que se almacenan en ficheros y que tienen alg´ un prop´ osito concreto. Un fichero M puede hacer referencia a otros ficheros M e incluso a s´ı mismos (es decir, est´a permitida la autorecursividad). Los ficheros M son especialmente apropiados para
Programaci´on en MATLAB
43
experimentar con algoritmos escribi´endoles en un fichero 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´afico, construir programas que pueden ser utilizados con posterioridad varias veces, o, simplemente, intercambiar con alg´ un amigo o colega ficheros de mutuo inter´es. En la p´agina web de Mathworks mencionada en la Introducci´on pueden encontrarse numerosos ficheros M escritos con distintos prop´ ositos, desde puramente computacionales a did´acticos o por puro placer. Hay dos tipos de ficheros M: Sripts o ficheros 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´aficos 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 ficheros M de tipo “script”. Simplemente son ficheros que ejecutan sucesivamente varios comandos de MATLAB con un objetivo espec´ıfico y siempre que se ejecutan producen el mismo resultado. Volveremos sobre ellos m´as adelante para recalcar su diferencia con el otro tipo de ficheros 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 Scientific Computation de Charles F. van Loan. Sabemos de c´ alculo elemental que la serie de Taylor Tn (x) =
n X xk k=0
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 x entre Tn (x) y e ?. 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
44
% 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 Al igual que con los “scripts” debemos escribir estas l´ıneas en un fichero 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 fichero 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 infinidad de funciones debemos elegir nombres significativos para nosotros pero no demasiado standard; por ejemplo, podemos empezar los nombres de nuestras funciones con el prefijo mi. . . o escoger un nombre en euskera, etc. Al escribir una funci´ on en MATLAB debes seguir unas pocas, simples e importantes reglas: El fichero 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 definen 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 definen completamente la funci´on deben hacerse inmediatamente despu´es de la definici´ 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 clarificar 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 definan 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 fichero 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´aficas para cuatro valores de n = 4, 8, 16, 20 del error relativo que se comete al aproximar ex 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 fichero .m (por ejemplo, smiexp1.m) tenemos un “script” que al ejecutarlo en MATLAB >> smiexp1 nos produce cuatro gr´ aficas (figura 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 figuras y asigna a la p-´esima el siguiente comando plot. As´ı p=1 corresponde a la figura en al posici´ on (1, 1), p=2 a la figura 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 modifiquemos nuestra funci´ on para que admita vectores y produzca vectores. La modificaci´ on es muy sencilla: hay que redefinir 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
46 −6
n= 4
n= 8
x 10
0.02
7 6
0.015
5 4
0.01 3 2
0.005
1 0 −1
−0.5
−15
0
0.5
1
0 −1
−16
n=16
x 10
−0.5
0.5
1
0.5
1
n=20
x 10
8
0
7 6
6
5 4
4 3 2
2
1 0 −1
−0.5
0
0.5
1
0 −1
−0.5
0
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 simplifica 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 artificial 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 definidas a partir de ficheros 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
48
y=miexp2(x,17); tf=clock; t2=etime(tf,ti); disp(sprintf(’%6.0f %16.2f %16.4f ’,k ,t1 ,t2)) end 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
49
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 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 modificar 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´ıficas de estos u ´ltimos que hay que tener en cuenta. Polinomios son vectores cuyas componentes son los coeficientes 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 predefinida 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 A0 es la transpuesta conjugada de A (lo que nosotros solemos designar como A∗ ). Si queremos la transpuesta de A debemos usar A.0 . 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
51 0 + 1.0000i
>> Atc=A’ Atc = 1.0000 + 1.0000i 2.0000 - 1.0000i
3.0000 - 1.0000i 0 - 1.0000i
>> At=A.’ At = 1.0000 - 1.0000i 2.0000 + 1.0000i
3.0000 + 1.0000i 0 + 1.0000i
Finalmente, el comando plot cuando se emplea con n´ umeros complejos tiene un significado 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 coeficientes. 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
52
ans = -11 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] definido 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
4
>> pol2=[1 0 3 -4] pol2 = 1
0
3
-4
>> pol3=conv(pol1,pol2) pol3 = 1
-2
7
-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)
53
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 coeficientes de un polinomio p(x) de grado n que se ajusta a los datos (xi , yi ), en el sentido de los m´ınimos cuadrados.
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 ficheros M. Nosotros no vamos a distinguir entre ambos tipos de funciones. Las hemos clasificado 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
55
r´apido es utilizar el comando help funci´ on.
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
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)
rem(x,y) mod(x,y) round(x) fix(x) floor(x) ceil(x) gcd(x,y) lcm(x,y)
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
56
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)
mean(x) std(x) prod(x) cumprod(x) [y,i]=sort(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
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 filas 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 clasificar´an en varios subgrupos:
Funciones incorporadas en MATLAB
58
FUNCIONES MATRICIALES ELEMENTALES A’ A.’
trace(A) [m,n] = size(A) numel(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 filas m y de columnas n de una matriz rectangular A devuelve el n´ umero de elementos de la matriz 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 abij . devuelve la matriz cuyos elementos son baij . 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)
reshape(A,m,n) diag blkdiag(A,B) tril(A) triu(A) fliplr(A)
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..
Funciones incorporadas en MATLAB flipud(A) rot90(A) [I,J,V]= find(A)
end(A)
lo mismo que fliplr pero por filas rota A 90 grados encuentra las filas 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
´ FUNCIONES DE ANALISIS MATRICIAL n=norm(v) n=normest(A)
r=rank(A) d=det(A) t=trace(A) N=null(A) Q=orth(A) subspace1(A,B)
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
´ 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)
[Q,R]=qr(A) d = det(A) E = rref(A) U = chol(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 definida 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 1’s 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 filas de una matriz rectangular A descomposici´on de Cholesky de una matriz definida positiva
59
Funciones incorporadas en MATLAB P=pinv(A)
pseudoinversa (o inversa de Moore-Penrose) de A
FUNCIONES PARA CALCULO DE VALORES PROPIOS Y SINGULARES E=eig(A) [U,S,V]=svd(A) P=poly(X)
H=hess(A) [U,S]=schur(A) [U,S]=rsf2csf(U,R)
[U,S]=cdf2rdf(U,R)
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 coeficientes 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 refiere 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.
60
Ap´ endice B
Consejos para el uso de Matlab en picasso B.1.
Transferencia de ficheros a picasso
Para transferir ficheros 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. Confirma 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 ficheros entre el cliente y el servidor mu´evete al directorio que contiene el fichero que quieres transferir y al directorio de destino. Arrastra entonces el fichero 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 ficheros 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 definir uno que s´ı lo haga. Hemos elegido gedit como editor por defecto, pero si prefieres 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.