Documenti di Didattica
Documenti di Professioni
Documenti di Cultura
Este apunte corresponde al un curso de grado sobre la utilizacin de Matlab, principalmente orientado a la aplicacin de este sistema en la resolucin de ecuaciones diferenciales. Est basado fundamentalmente en el curso que dictaron el Dr. Fernando Basombro y el Dr. Mario Storti durante la primera mitad de 1997 en el IB. Otra fuente fundamental para estos apuntes es el manual de Octave escrito por su creador: John W. Eaton (email: jwe@bewo.che.wsic.edu). La utilidad de estas notas reside en que resumen la profundidad del curso dictado por Basombro y Storti, sin llegar a ser un manual de referencia como el de Eaton, tornndolas aptas para quienes se introducen en la utilizacin del lenguaje de Matlab u Octave. Pablo A. Ramrez
CONTENIDO
1. Introduccin. _______________________________________________________ 3
1.1 Cmo crear una matriz.____________________________________________________ 3 1.2 Aritmtica con matrices. ___________________________________________________ 4 1.3 Resolucin de sistemas de ecuaciones lineales. _________________________________ 4 1.4 Integrando ecuaciones diferenciales __________________________________________ 5 1.5 Obtencin de salidas grficas. _______________________________________________ 6 1.6 Recuperacin de comandos. ________________________________________________ 6 1.7 Usando la ayuda.__________________________________________________________ 6
4. Expresiones. _______________________________________________________ 10
4.1 Expresiones de ndices.____________________________________________________ 10 4.2 Llamadas a funciones. ____________________________________________________ 11 4.3 Operaciones aritmticas. __________________________________________________ 13 4.4 Operadores de comparacin _______________________________________________ 14 4.5 Operadores lgicas. ______________________________________________________ 15 4.6 Asignaciones.____________________________________________________________ 16 4.7 Operadores de incremento ________________________________________________ 16
1.
1. Introduccin.
Matlab es un lenguaje de alto nivel, diseado para hacer clculos numricos. Provee una interfase con lnea de comando para resolver problemas lineales y no lineales y otros experimentos en forma numrica. Puede ser usado tambin en forma de procesamiento tipo batch. En la mayora de los sistemas, la forma de invocar a Matlab es con el comando del shell matlab. Matlab muestra un mensaje inicial indicando que est listo para aceptar instrucciones y haciendo algunas sugerencias de comandos para iniciar. A partir de all se pueden escribir comandos inmediatamente. Commands to get started: intro, demo, help help Commands for more information: help, whatsnew, info, subscribe Si ocurre algn tipo de problema, se puede interrumpir la tarea que est realizando Matlab con Control C (usualmente escrito como C c para abreviar). Para salir de Matlab simplemente se debe escribir exit en el prompt. En aquellos sistemas que soportan control de tareas (como Linux y la mayora de los sistemas Unix, VMS, etc...) se puede suspender Matlab (u Octave segn sea el caso) enviando una seal SIGSTP (usualmente Cz). Los siguientes captulos describen solo una parte de las funcionalidades de Matlab, aunque resultan ser una gua muy til para dar una muestra de sus posibilidades. Si se es nuevo en el uso de Matlab, es recomendable que uno trate de reproducir los ejemplos que se muestran. Las lneas marcadas como >> son lneas que se deben escribir terminndolas con un retorno de carro (tecla enter de la PC). Matlab responder con un resultado o un grfico.
0.8310 0.0346
0.5297 0.6711
25.3781 34.6378
-4.7955 -1.8900 Esto ese conceptualmente equivalente a inv (a) * b , pero evita el clculo de la inversa de la matriz directamente. Si la matriz de coeficientes es singular, Matlab emitir un mensaje de advertencia y calcular una solucin en el sentido de norma mnima.
dx = f ( x, t ) dt
con la condicin inicial:
x( t = t 0 ) = x 0
Para que Matlab integre ecuaciones de esta forma, se debe escribir primero una funcin ' f ( x , t ) ' . Esto puede ser hecho directamente escribiendo una secuencia de comandos de Matlab en un archivo cuyo nombre define el nombre de una nueva funcin, necesariamente la extensin de estos archivos ser .m. Por ejemplo, los comandos siguientes definen el miembro derecho de un sistema de dos ecuaciones diferenciales no lineales de sumo inters. Para escribir la nueva funcin se puede utilizar cualquier editor, por ejemplo, la siguiente funcin fue editada con el Bloc de Notas que puede encontrarse en cualquier sistema operativo Windows (puaj!): function xdot = f(t, x) r = 0.25; k = 1.4; a = 1.5; b = 0.16; c = 0.9; d = 0.8; xdot = [0; 0]; xdot(1) = r*x(1) * (1-x(1)/k) - a*x(1) * x(2) / (1 + b*x(1)); xdot(2) = c*a*x(1)*x(2)/(1 + b*x(1)) - d*x(2); end dada la condicin inicial x0 = [1; 2]; es fcil integrar el sistema usando la funcin ode23: [T,X] = ode23('f',0, 200, x0);
La funcin ode23 utiliza adaptivamente los esquemas de Runge Kutta de orden 2 y 3 respectivamente.
2. Tipos de datos.
Todas las versiones de Matlab incluyen un cierto nmero de tipos de datos internos incluyendo matrices y escalares complejos y reales, y un tipo de dato llamado data structure (como el record de Fortran90 o el struct de C. Es tambin posible definir tipos de datos especializados escribiendo las rutinas apropiadas en C++ (esta es una ventaja que tiene Octave al ser free-software es decir que se tiene acceso a las fuentes). En algunos sistemas no es necesario recompilar Octave si es posible hacer uso de la opcin de linkedicin dinmica de vnculos.
b='parrot' b= parrot En Octave puede utilizarse indistintamente comillas o apstrofes. La notacin con apstrofes es compatible con Matlab, pero se presta a confusin con el operador de transposicin de matrices. Por eso es preferible usar comillas ( esto NO es compatible con Matlab). Internamente, Matlab guarda las cadenas como matrices cuyos elementos son caracteres. Todas las operaciones de indexacin que funcionan con matrices pueden ser usadas con las cadenas para indicar subcadenas. En Octave los caracteres especiales que no puede ser introducidos directamente (por ejemplo las comillas) debe se escapeados (escaped).
3.1 Matrices.
Las matrices son entradas entre corchetes por filas. Los elementos en la misma fila va separados por comas o simplemente por espacios y las filas van separadas por punto y coma. a = [1, 2; 3, 4] a= 1 3 Los elementos que intervienen en una matriz pueden ser expresiones arbitrarias mientras que las dimensiones tengan sentido cuando se combinan entre si: a = [1, 2; 3, 4] a= 1 3 [ a, a] ans = 1 3 [a; a] ans = 1 3 1 3 ans = 2 4 2 4 2 4 1 3 2 4 2 4 2 4
[a; [1 1]]
1 3 1
2 4 1
[a, [1 1]] ??? All matrices on a row in the bracketed expression must have the same number of rows.
5 length(b') ans = 5 size(b,1) ans = 5 size(b,2) ans = 1 En Octave, adems existen funciones bsicas que retornan valores Booleanos (1 = true, 0 = false): is_empty(a), is_scalar(a), is_square(a), is_symetric(a, tol).
3.3 Rangos.
Un rango es una forma conveniente de construir vectores con elementos espaciados uniformemente. El rango est definido por el valor inicial, incremento (opcional) y valor final separados por el operador :. Si el incremento no est se asume por defecto igual a 1. a = 1:0.5:3 a= 1.0000 a = 5:10 a= 5 Los rangos son muy utilizados para controlar los valores que toman los ndices en los lazos. Sin embargo el rango no es convertido explcitamente a vector hasta que esto no es necesario para ahorrar memoria. Por ejemplo, si queremos hacer un lazo (esto se va a ver despus) de 1 a 1000000 y lo ponemos de la forma 1:1000000, esto generara en principio un vector de longitud 1000000 de reales doble precisin, lo cual consume 8 Mb de memoria RAM. Otro punto a tener en cuenta en cuanto a los rangos es que (debido a errores de redondeo) el punto final puede no estar dentro del vector generado. en el caso de que esto sea absolutamente necesario debe usarse en su lugar la funcin linspace(). 6 7 8 9 10 1.5000 2.0000 2.5000 3.0000
4. Expresiones.
Las expresiones son la unidad bsica con la cual se arma las sentencias en Matlab. Una expresin da un valor al ser evaluada, el cual se puede imprimir, validar (en el sentido lgico), guardar en una variable, pasar a una funcin, o asignar su valor a una variable con un operador de asignacin.
a = [1, 2; 3, 4] a= 1 3 ans = 1 En general a(i1,i2) retorna los valores de la submatriz de a conteniendo las filas cuyos ndices estn en i1 y columnas en i2 en el ejemplo previo podemos reemplazar a(1, [ 1 2 ]) por a(1, 1:2 ). Una forma equivalente muy til y compacta es a(1, : ). En esta expresin : quiere decir: todos los valores que toma el ndice correspondiente. Como el : est en el ndice de filas y la matriz tiene dos columnas : es equivalente a [ 1 2 ]. Las filas o columnas aparecen en el orden en que aparecen sus ndices en i1 o y2. Por ejemplo: a(1 , [2 1]) ans = 2 De esta forma se puede extender vectores a matrices. Por ejemplo, sea a un vector columna, entonces una forma de obtener una matriz que contenga al vector a repetido tres veces es el llamado truco de Tom a = rand(3,1) a= 0.2470 0.9826 0.7227 a(: , [1 1 1]) ans = 0.2470 0.9826 0.7227 0.2470 0.9826 0.7227 0.2470 0.9826 0.7227 1 2 2 4
a(1,[1 2])
La forma de llamar a una funcin es a travs de una llamada de funcin: sqrt(x^2 + y^2) ones(n,m) rand() #un argumento #dos argumentos #ningn argumento
cada funcin espera un nmero de argumentos, por ejemplo sqrt() espera solo un argumento. Mltiples argumentos de entrada y salida. Algunas de las funciones pueden esperar un nmero variable de argumentos o puede retornar mltiples valores, por ejemplo al funcin eig retorna la descomposicin normal de una matriz diagonal de autovalores y la matriz de autovectores: a =[2 1; 1 2] a= 2 1 ans = 1 3 [v, d] = eig(a) v= 0.7071 -0.7071 d= 1 0 Notar que en la primera llamada no hay miembro izquierdo en la asignacin y el valor retornado es un vector con los autovalores. Al escribir una funcin en Matlab podemos saber cuantos argumentos estn requiriendo y dependiendo de esto retornar los valores apropiados. Llamadas por valor El mecanismo de paso de argumentos en Matlab es por valor, en contraposicin con Fortran donde los valores se pasan por referencia. Esto significa que en realidad la funcin ve internamente una copia de la variable. Esto evita tener que hacer copias internas de la variable para evitar que su valor fuera de la rutina sea modificado accidentalmente. Tambin permite pasar constantes como argumentos incluso en el caso en que la funcin va a modificar los valores internamente. Esto parecera representar un desperdicio de memoria ya que en el siguiente caso x ocupa 8 Mb de memoria y al pasarlo como argumento a f() la copia interna ocupar otros 8 Mb de memoria. Sin embargo Matlab y Octave son lo suficientemente astutos como para crear la copia solo si la variable va a ser modificada internamente. x = rand(1000); f(x); Llamada recursiva 0 3 0.7071 0.7071 1 2
eig(a)
Salvo en casos especiales, se puede llamar a funciones recursivamente. Por ejemplo, se puede calcular el factorial de un entero de la siguiente manera: function retval = fact( n ) if( n > 0 ) retval = n * fact( n - 1 ); else retval = 1; end end En general es ineficiente hacer esto ya que cada vez que la funcin es llamada se guarda una copia de todas las variables de la funcin. Una forma mucho ms eficiente es usar prod(1:n).
Tal vez uno de los elementos ms tiles de Matlab y Octave es el uso de los operadores elemento a elemento. Si a = b .* c esto es equivalente a un doble lazo en los i j sobre la operacin: a(i,j) = b(i,j) * c(i,j). Por ejemplo podemos calcular el producto escalar de dos vectores de la siguiente forma. La funcin sum() retorna la suma de los elementos del vector argumento. a = rand(20,1); b = rand(20,1); p = sum(a.*b) p= 5.9702 El uso de estas operaciones no slo significa una notacin ms compacta que es mucho ms eficiente. Por ejemplo, si a y b son matrices de 500 x 500, entonces la siguiente operacin es equivalente a la versin compacta de b = a.^0.5. Sin embargo la opcin con lazos for tarda unas 70 veces ms que la versin compacta. for k = 1:500 for l = 1:500 b(k,l) = a(k,l)^0.5; end end
ans = 0 1 1 a==0 ans = 0 0 0 Combinado con las expresiones de indexacin cero-uno explicadas anteriormente esto permite extraer convenientemente columnas y filas de una matriz. En el ejemplo siguiente se usa esta combinacin para extraer primero todos los elementos del vector a que son menores o iguales que 3 y despus el complemento. Puede evitarse el uso de indexacin cero-uno utilizando la funcin find (). 0 1 0 0 0 1 0 0 1 1 1 0
4.6 Asignaciones.
Son expresiones que guardan un nuevo valor en una variable. Las variables no tienen un tipo definido por ejemplo: foo = 1 foo = 1 foo = 'bar' foo = bar Asignar una matriz vaca [ ] equivale muchas veces a eliminar esa fila o columna. Sin embargo los elementos eliminados deben ser tales que la matriz resultante sea rectangular, sino los resultados son impredecibles. a a= 7 2 6 a= 9 3 4 3 4 7 9 3 4 3 4 7
a(:,1) = []
a(1,1) = [] ??? In an assignment A(matrix,matrix) = B, the number of rows in B and the number of elements in the A row index matrix must be the same.
Para verificar condiciones sobre matrices es importante saber que si una matriz aparece en una condicin esta es tomada como verdad si todos los elementos son verdad: x x= 3 3 3 5 2 8 1 7 4
if x>2 ; disp('verdad'); end if x>0 ; disp('verdad'); end verdad Esto tambin se puede lograr con la funcin all() para vectores fila o columna all(x) d 1 o 0 si todos los elementos son verdaderos (diferentes de cero). Para una matriz X de n x m la expresin Y = all(X) retorna un vector de 1 x m donde Y(k) = all(X(:,k)). Una funcin similar es any(X) que retorna 1 si alguno de los elementos es verdadero.
k= 5 k= 4 k= 7 k= 6 El uso ms frecuente es para hacer un lazo sobre un ndice que se incrementa constantemente en cada iteracin, esto se puede hacer en forma muy compacta con un rango: for k=1:n. En una versin ms sofisticada la variable va tomando como valor cada una de las columnas de la expresin.
6. Funciones y Scripts
Cuando un cierto grupo de sentencias es muy usado puede incluirse en un archivo con extensin file.m y ser llamado desde Matlab u Octave por su nombre: >> file Existen dos tipos de archivo .m, los scripts y las funciones. Los scripts son simplemente listas de sentencias, al ser llamado es como si la lista de sentencias fuera incluido en el prompt de Matlab. Un script puede llamar a otro script y as siguiendo. Las funciones primero pasan valores de entrada y de salida, los cuales dentro de la funcin toman nombres distintos. las dems variables externas quedan aisladas de las internas.