Está en la página 1de 29

Notas sobre MATLAB y OCTAVE

Tom as Chac on Rebollo, Eliseo Chac on Vera y Macarena G omez M armol

Cap tulo 1 Introducci on a MATLAB y OCTAVE


1.1. Introducci on

MATLAB es un sistema interactivo, basado en el c alculo con matrices para computaci on num erica y visualizaci on en campos cient cos y de la ingenier a. Se pueden resolver problemas complejos con una implemetaci on m as simple que la que se usa en otros lenguajes de programcaci on como Fortran o C. Las u ltimas versiones de MATLAB disponen de un conjunto de herramientas, toolboxes, que extienden grandemente sus capacidades, aunque no van a ser precisas para nuestro trabajo en este curso. Se pueden observar las capacidades de MATLAB con el comando demo. El nombre de MATLAB proviene de MATrix LABoratory. OCTAVE es lenguaje interactivo de alto nivel y que se distribuye gratuitamente, a diferencia de MATLAB que necesita de la compra de una licencia, con las distintas versiones de Linux. OCTAVE es muy compatible con MATLAB en el sentido de que la mayor a de los c odigos generados con MATLAB u OCTAVE funcionan en ambos. En cuanto a las principales diferencias, a parte de los toolboxes, estas van a aparecer en los detalles m as exquisitos de presentaci on de gr acas que MATLAB tiene. Pero la mayor parte de un c odigo creado con uno de ellos debe de funcionar en el otro. En nuestra aula de inform atica, trabajaremos principalmente con MATLAB, pero como ya hemos dicho anteriormente, se requiere una licencia. Esta licencia estar a disponible casi siempre. Pero, para aquellos momentos en los que no lo est e, podremos usar OCTAVE. Tambi en podemos trabajar con OCTAVE exclusivamente 3

A MATLAB Y OCTAVE CAP ITULO 1. INTRODUCCION

si as lo deseamos. Este manual no pretende ser exhaustivo. S olo una primera toma de contacto con MATLAB/OCTAVE y una gu a de consulta r apida para tener a mano. El comando help nombre provee de informaci on sobre cualquier funci on o comando. Por ejemplo, help eig informa sobre la funci on autovalor eig. A lo largo de estas notas nos referiremos a la sesi on de trabajo, indistintamente que sea en MATLAB u OCTAVE. Especicaremos la diferencia cuando sea preciso.

1.2.

Empezando la sesi on de trabajo

Se empieza la sesi on con la orden matlab (octave) y se termina la sesi on con el comando quit o exit. Puede ser conveniente mantener activa la sesi on de trabajo en una ventana y el editor de texto en otra, para modicar ordenes que puedan ser introducidas mediante cheros de texto.

1.3.

Introduciendo matrices

Esencialmente trabajamos con s olo un tipo de objeto, una matriz num erica con posibles valores complejos. Todas las variables representan matrices. Matrices 1 1 se interpretan como escalares y matrices con s olo una la o columna como vectores. Las matrices se introducen de varias formas: Mediante una lista expl cita de elementos, Mediante funciones construidas y ordenes internas, Creando un chero de texto con el editor, Cargado de un chero o aplicaci on externa. Por ejemplo, A = [1 2 3; y A= [ 1 2 3 0 5 1 7 2,3 9 0 5 1; 7 2,3 9 ]

1.3. INTRODUCIENDO MATRICES

crea una matriz 3 3 y se le asigna a la variable A. Los elementos dentro de una la tambi en se pueden separar mediante comas en vez de espacios en blanco. Cuando los n umeros aparecan en forma exponencial, por ejemplo 3.12e-3, los espacios se deben de evitar. Para introducir escalares, matrices 1 1, no es preciso el uso de corchetes. Se pueden usar n umeros complejos. Por ejemplo:

A = [1 2;

3 4 ] + i [5 6;

7 8]

A = [1 + 5i 2 + 6i;

3 + 7 i 4 + 8i ]

Tambi en en este caso se deben de evitar los espacios en blanco. Por ejemplo, 2 + 6i y no 2 + 6 i. Como unidades imaginarias se pueden usar i o j . No es conveniente usar i o j como variables para otro uso. Para introducir matrices grandes, resulta mejor usar un chero creado con un editor de texto. Este chero debe de consistir en una disposici on rectangular con los valores num ericos. Si denotamos por datos.ext (donde .ext es cualquier extensi on, que por cierto, no es necesaria), el comando load datos.ext leer a este chero y lo guardar a en la variable datos. Las funciones internas rand, magic y hilb, por ejemplo, proporcionan matrices con las que se pueden experimentar. Para enteros n y m, la orden rand(n) crea una matriz n n con entradas aleatorias, uniformemente distribuidas entre 0 y 1, mientras que rand(m,n) crea una matriz m n. magic(n) crea una matriz entera n n que es un cuadrado m agico (las, columnas y diagonales suman lo mismo); hilb(n) crea la matriz de Hilbert n n, que resulta ser la matriz mal condicionada por excelencia. Por u ltimo, las matrices tambi en se suelen generar mediante ciclos de programaci on como el ciclo for. Los elementos de matrices y vectores se pueden referenciar con ndices entre par entesis en la forma usual. Por ejemplo, A(2, 3) indica el valor en la segunda la y tercera columna de la matriz A y x(3) denota la tercera componente del vector x. Matrices y vectores s olo aceptan enteros positivos como ndices.

A MATLAB Y OCTAVE CAP ITULO 1. INTRODUCCION

1.4.

Operaciones con escalares, vectores y matrices

Las siguientes operaciones est an disponibles: + \ / suma resta multiplicaci on potencia transpuesta conjugada divisi on por la izquierda divisi on por la derecha

Estas operaciones se aplican al caso escalar, vectorial y matricial de forma estandard. Si las tallas de las matrices son incompatibles aparece un mensaje de error, excepto en el caso de la operaci on de un escalar con una matriz, en donde cada entrada de la matriz es operada con el escalar. La divisi on de matrices merece un comentario. Si A es una matriz cuadrada invertible y b es un vector columna, respectivamente la, entonces x = A\b es la soluci on de A x = b y, respectivamente, x = b/A es la soluci on de x A = b. En la divisi on por la izquierda, si A es cuadrada, se factoriza usando eliminaci on de Gauss y esos factores se usan para resolver A x = b. Si A no es cuadrada, se factoriza usando la ortogonalizaci on de Householder pivotando en las columnas y los factores se usan para resolver el sistema en el sentido de los m nimos cuadrados. La divisi on por la derecha se dene en t erminos de la divisi on por la izquierda mediante b/A = (A \b ) . Operaciones con vectores. Las operaciones matriciales de suma y resta operan sobre las entradas de la matriz, pero las otras operaciones no lo hacen as , son operaciones sobre matrices como conjunto. Es importante observar que estas otras operaciones, , , \, y /, se pueden hacer operar sobre cada entrada de la matriz si se las precede con un punto. Por ejemplo, [1,2,3,4].*[1,2,3,4] o [1,2,3,4]. 2 dan [1,4,9,16].

1.5.

Sentencias, expresiones y variables

El lenguaje de MATLAB y OCTAVE se basa en expresiones; cualquier expresi on introducida se interpreta y se evalua. Las sentencias son normalmente de la forma

1.5. SENTENCIAS, EXPRESIONES Y VARIABLES

variable = expresi on, o simplemente expresi on. Las expresiones se componen normalmente con operadores, funciones y nombres de variables. La evaluaci on de la expresi on produce una matriz, que entonces se muestra en pantalla y se le asigna a la variable para su uso futuro. Si el nombre de la variable y el signo = se omiten, entonces una variable ans (de answer) se crea autom aticamente y se le asigna el valor.

Una sentencia se termina normalmente con el control de carro (ENTER). Sin embargo, se puede continuar en la siguiente l nea con tres o m as puntos seguidos de control de carro. Por otro lado, varias sentencias se pueden poner sobre la misma l nea si se separan por punto y coma o coma.

Si el u ltimo car acter de una sentencia es un punto y coma, la impresi on en pantalla del resultado de la evaluaci on de la sentencia no se efectua, aunque la asignaci on si que se realiza. Esto es esencial si se pretende suprimir la salida por pantalla de resultados intermedios.

Se distinguen las may usculas en los nombres de comandos, funciones y variables. Por ejemplo, no es lo mismo solveUT que solveut.

La orden who (o whos) proporciona una lista de las variables actuales en la memoria de trabajo de la sesi on en curso. Una variable puede ser eliminada de la memoria con el comando clear nombrevariable. El comando clear borra todas las variable no permanentes de la memoria.

La variable permanentes eps (epsilon) da la unidad de redondeo de la m aquina, en torno a 1016 en la mayor a de las m aquinas. Resulta de utilidad cuando se quiere especicar la tolerancia en la convergencia de un proceso iterativo.

Los procesos en marcha se pueden interrumpir en la mayor a de las m aquinas con la orden CTRL-C.

A MATLAB Y OCTAVE CAP ITULO 1. INTRODUCCION

1.6.

Funciones para construir matrices


eye zeros ones diag triu tril rand hilb magic matriz identidad matriz de ceros matriz de unos crea o extrae la diagonal parte triangular superior de una matriz parte triangular inferior de una matriz matriz generada con entradas aleatorias matriz de Hilbert cuadrado m agico

Algunas funciones de inter es y utilidad son

Por ejemplo, zeros(m,n) produce una matriz de ceros m n y zeros(n) produce una matriz cuadrada n n. Si A es una matriz, zeros(size(A)) produce una matriz de ceros con la misma talla que A. Si x es un vector, diag(x) es la matriz con diagonal x; Si A es una matriz cuadrada, diag(A) es un vector con la diagonal de A. Con diag(diag(A)) se obtiene la matriz diagonal con la diagonal de A, el resto de elementos cero. Las matrices se pueden construir con bloques. Por ejemplo, si A es una matriz 3 3, entonces B = [A, zeros(3, 2); zeros(2, 3), eye(2)] construye una matriz 5 5.

1.7.

For, while, if. Relaciones

En su forma m as b asica, estas ordenes de control de ujo en funcionan como en la mayor a de lenguajes de programaci on. For. Por ejemplo, para n dado, las sentencias x = [ ]; f or o bien, x = [ ]; for i = 1 : n x = [x, i 2] end i = 1 : n, x = [x, i2 ], end,

1.7. FOR, WHILE, IF. RELACIONES produce un vector de n componentes y las sentencias x = [ ]; f or i = n : 1 : 1, x = [x, i 2], end

hacen lo mismo pero en sentido inverso. Observar que una matriz puede estar vac a como indica la orden x = [ ]. Las sentencias for i=1:m for j = 1 : n H(i, j) = 1/(i+j-1); end

end H producen y muestran en pantalla la matriz de Hilbert m n. El punto y coma ; en las sentencias interiores es esencial para evitar la impresi on en pantalla de c alculos intermedios, aparte de acelerar el trabajo total. La u ltima sentencia H muestra el resultado nal. La sentencia for permite usar cualquier matriz como incremento en vez de 1:n. La variable contador simplemente asume consecutivamente los valores de cada columna de la matriz. Por ejemplo, s = 0; for c = A s = s + sum(c); end calcula la suma de todas las entradas de la matriz A sumando todas las sumas de sus columnas (Por supuesto, sum(sum(A)) realiza esta tarea m as ecientemente). En OCTAVE se suele terminar el ciclo for con endfor. While. La forma general del ciclo while es while (relaci on) sentencias end Las sentencias se ejecutan repetidamente mientras que relaci on permanezca cierta. Por ejemplo, dado un n umero a, las siguientes ordenes calculan y muestran el menor entero no negativo n tal que 2n a:

10

A MATLAB Y OCTAVE CAP ITULO 1. INTRODUCCION n = 0; while ( 2 n < a) n = n + 1; end n

En OCTAVE se suele terminar el ciclo while con endwhile. If. La forma general de una sentencia simple if es if (relaci on) sentencias end Las sentencias se ejecutan s olo si la relaci on es verdadera. Una ramicaci on m ultiple tambi en es posible: if ( n < 0) paridad = 0; elseif ( rem(n, 2) == 0) paridad = 2; else paridad = 1; end En una ramicaci on doble, se reemplaza elseif por else. En OCTAVE se suele terminar el condicional if con endif. Relaciones. Los operadores de relaci on son < > <= >= == = menor que mayor que menor o igual que mayor o igual que igual distinto.

Observar que = se usa en una sentecia de asignaci on mientras que == se usa en una relaci on. Las relaciones se pueden conectar o cuanticar mediante operadores l ogicos & and, y | or, o , ! not, no.

1.7. FOR, WHILE, IF. RELACIONES

11

Cuando se aplica a escalares, una relaci on es el escalar 1 o 0 dependiendo de si es verdadera o falsa. Se puede observar introduciendo 3 <5, 3 >5, 3 == 5, y 3 == 3. Cuando se aplica a matrices de la misma talla, una relaci on ser a otra matriz de la misma talla con 0s y 1s dando el valor de la relaci on en cada entrada. Intenta a = rand(5), b = triu(a), a == b. Una relaci on entre matrices se interpreta por while e if como verdadera si cada entrada de la matriz relaci on es no cero. Por lo tanto, si se quieren ejecutar unas sentencias cuando las matrices A y B son iguales se puede usar if ( A == B ) sentencias end pero si se quieren ejecutar cuando A y B no lo son, se puede hacer como if ( any (any (A = B ))) sentencias end o bien if ( A == B ) else sentencias end Observar que la aparente if ( A = B ) sentencias end no produce el efecto deseado puesto que las sentencias se ejecutar an s olo si cada entrada correspondiente de A y B diere. Las funciones any y all pueden ser usadas de forma creativa para reducir relaciones matriciales a vectores o escalares. En el ejemplo anterior, dos any son requeridos puesto que any es una operaci on vectorial.

12

A MATLAB Y OCTAVE CAP ITULO 1. INTRODUCCION

1.8.

Funciones escalares, vectoriales y matriciales

Algunas funciones operan esencialmente sobre escalares, pero lo hacen elemento a elemento cuando actuan sobre matrices. Las funciones m as comunes son sin asin exp abs round cos acos log (base e) sqrt f loor tan atan rem(resto) sign ceil Otras funciones operan esencialmente sobre un vector, la o columna y lo hacen sobre una matriz m n (m 2) haciendolo sobre cada columna, para devolver un vector la con los resultados de la aplicaci on de la funci on a cada columna. Una acci on sobre cada la se puede obtener usando la transpuesta; por ejemplo, mean(A). Algunas de estas funciones son max sum median any min prod mean all Por ejemplo, la m axima entrada de una matriz A viene dada por max(max(A)) en vez de max(A). Mucha de la potencia de MATLAB y OCTAVE proviene de sus funciones matriciales. las m as u tiles son eig chol svd inv lu qr hess schur expm sqrtm poly det size norm cond rank autovalores y autovectores factorizaci on de Cholesky descomposici on de acuerdo a los valores singulares (SVD) inversa factorizaci on LU factorizaci on QR forma de Hessenberg descomposici on de Schur exponencial de la matriz raiz cuadradad de la matriz polinomio caracter stico determinante talla norma-1, norma-2, norma-Frobenius, norma- n umero de condici on en la norma-2 rango

Y RECUPERACION DE COMANDOS EN L 1.9. EDICION INEA

13

Las funciones pueden tener una salida simple o m ultiple en cuanto al n umero de argumentos. Por ejemplo, y = eig (A), o eig (A) produce un vector columna con los autovalores de A mientras que [U, D] = eig (A) produce una matriz U cuyas columnas son los autovectores de A y una matriz diagonal D con los autovalores de A sobre su diagonal.

1.9.

Edici on y recuperaci on de comandos en l nea

El cursor se puede posicionar sobre la l nea de edici on de comandos con las teclas de las echas izquierda/derecha y de Backspace (o Delete). Tambi en se puede intentar sobre un PC las teclas Home, End y Delete; sobre un sistema Unix o PC los comandos Emacs Ctl-a, Ctl-e, Ctl-d y Ctl-k tambi en funcionan; sobre otros sistemas, ver help cedit o type cedit. Es muy conveniente el uso de las teclas de las echas arriba/abajo puesto que permiten repetir o buscar comandos previos. Se puede recuperar un comando anterior y modicarlo para volver a ejecutarlo con una nueva variaci on. Para tareas simples, esto puede ser m as conveniente que usar un chero del tipo *.m que requiere moverse entre el editor de texto y la sesi on de trabajo, ya lo veremos m as adelante. Por ejemplo, para observar el costo de calcular la inversa de matrices de varias tallas se puede ejecutar mediante la recuperaci on, modicaci on y ejecuci on las ordenes a = rand(8); f lops(0), inv (a); f lops Si se quieren comparar las gr acas de las funciones y = sin(m x) e y = sin(n x) en el intervalo [0, 2 ] para varios m y n, uno puede hacer lo mismo con los comandos: m=2; n=3; x=0:.01:2*pi; y=sin(m*x); z=cos(n*x); plot(x,y,x,z)

1.10.

Submatrices la notaci on :

Vectores y submatrices se usan frecuentemente para conseguir manipular datos u objetos de forma compleja. Los dos puntos : (que se usan para generar vectores y referenciar submatrices) y la indexaci on mediante vectores de enteros son clave en la manipulaci on de estos datos u objetos. El uso creativo de estas facilidades para

14

A MATLAB Y OCTAVE CAP ITULO 1. INTRODUCCION

vectorizar operaciones permite minimizar el uso de ciclos (que frenan la rapidez de MATLAB y OCTAVE) y crear c odigos simples y de f acil lectura. La expresi on 1:5 es el vector la [1 2 3 4 5]. Ni los n umeros ni el incremento necesitan ser enteros. Por ejemplo, 0,2 : 0,2 : 1,2 da [0.2, 0.4, 0.6, 0.8, 1.0, 1.2], y 5 : 1 : 1 es [5 4 3 2 1]. La siguientes ordenes generan una tabla de senos. x = [0.0:0.1:2.0]; y = sin(x); [x y] Observar que, como sin opera entrada a entrada, genera un vector y del vector x. Tambi en se puede usar las formas: t = linspace(a, b, n) que genera el vector de a a b con n (entero) n umero de elementos. Se incluye a y b. Si a > b se almacenan en orden decreciente y si n no aparece, se usa por defecto n = 100. t = logspace(a, b, n) similar a linspace pero ahora se usan valores logar tmicamente espaciados desde 10a a 10b . Si b = los puntos son espaciados desde 10a y . Con los : tambi en se puede acceder a submatrices de una matriz. Por ejemplo, A(1 : 4, 3) es el vector columna con las primeras cuatro entradas de la tercera columna de A. Con : se denota una la o columna entera de la matriz: A(:, 3) es la tercera columna de A, y A(1 : 4, :) son las primeras cuatro las. Vectores de enteros tambi en se pueden usar para indexar los elementos de una matriz, as : A(:, [2 4]) contiene como columnas la 2 y la 4 de A. Esta indexaci on se puede usar en ambos lados de una sentencia de asignaci on: A(:, [2 4 5]) = B (:, 1 : 3) reemplaza las columnas 2,4 y 5 de A con las tres primeras columnas de B . Las columnas 2 y 4 de A se pueden multiplicar por la derecha por la matriz 2 2 dada por [1 2; 3 4] : A(:, [2, 4]) = A(:, [2, 4]) [1 2; 3 4]. Si x es un vector de n componentes se puede observar el efecto de x = x(n:-1:1) y de y = fliplr(x) y y = flipud(x). Es evidente la ventaja que estos comandos de MATLAB y OCTAVE representan en comparaci on con lo que se precisa hacer en otros lenguajes como Pascal, FORTRAN, o C para obtener el mismo resultado.

1.11. FICHEROS *.M (M-FILES)

15

1.11.

Ficheros *.m (M-les)

Se pueden ejecutar una serie de comandos almacenados en un chero grabado en disco. Estos cheros se denominan M-lesporque los terminamos en .m (esto es obligatorio en MATLAB y opcional en OCTAVE). La mayor parte del trabajo consiste en crear y renar archivos *.m mediante un editor de texto. Existen dos tipos de cheros *.m: (script les) archivos con el gui on de las ordenes a realizar, son los programas principales y archivos para denir funciones (function les). Programas principales. Los programas principales, o script les (archivos con el gui on) est an formados por una secuencia de comandos y sentencias. Si por ejemplo, lo llamamos ejemplo.m, la orden ejemplo har a que todas las sentencias en ejemplo.m se ejecuten por orden de aparici on dentro del archivo. Las variables en un programa principal son globales y cambiar an el valor de las variables con el mismo nombre que ya existan en el entorno de trabajo, o en la memoria de la sesi on de trabajo actual. Estos archivos gui on se pueden usar para introducir datos en una gran matriz; As los errores en una entrada particular son f acilmente corregibles. Un archivo *.m puede referenciar otros *.m incluyendose a s mismo recursivamente. Archivos de funci on. Los archivos de funci on extienden las capacidades de MATLAB u OCTAVE en el sentido de que se pueden crear nuestras propias funciones para nuestro problema particular, y que se pueden usar despu es como cualquier otra funci on. Las variables en un archivo funci on son por defecto locales. Veamos un ejemplo: function a = randint(m,n) % RANDINT Genera aleatoriamente una matriz de enteros. % randint(m,n) devuelve una matriz m n con entradas % entre 0 y 9. a =oor(10*rand(m,n)); Una versi on m as general es: function a = randint(m,n,a,b) % RANDINT Genera aleatoriamente una matriz. % randint(m,n) devuelve una matriz m n con entradas % entre 0 y 9.

16

A MATLAB Y OCTAVE CAP ITULO 1. INTRODUCCION % rand(m,n,a,b) devuelve entradas entre a y b. if ( nargin < 3) a = 0; b = 9; end a = oor((b-a+1)*rand(m,n)) +a;

Estas ordenes se deben de guardar en un archivo con el nombre randint.m (que corresponde con el nombre de la funci on). La primera l nea lleva la palabra clave function que declara el nombre de la funci on, los argumentos de entrada y de salida; sin esta l nea el chero ser a un programa principal ( script le) m as. Opcionalmente, en OCTAVE se terminan los archivos de funciones con la palabra clave endfunction. El s mbolo % indica que el resto de la l nea es un comentario. MATLAB y OCTAVE ignorar an el resto de las l neas que empiecen con % (OCTAVE tambi en acepta # para los comentarios). Adem as, las primeras l neas de comentario, que documentan el chero *.m, est an disponibles como ayuda usando help stat. La documentaci on de un chero *.m debe de realizarse siempre. La orden z = randint(4,5) pasa los valores 4 y 5 a las variables m y n en la funci on y la salida de la funci on se le pasa a la variable z . Puesto que las variables en un chero de funci on son locales, sus nombres son independientes de las otras m, n que puedan ya existir en el entorno de trabajo actual. Observar que el uso de nargin (n umero de argumentos de entrada) permite dar un valor por defecto a una variable de entrada omitida, como por ejemplo lo son a y b. Una funci on puede tener tambi en varios argumentos de salida. Por ejemplo: function [media, stdev] = stat(x) % STAT Media y desviaci on estandard % para un vector x, stat(x) devuelve la media de x. % [media, stdev] = stat(x) media y desviaci on estandard. % Para una matrix x, stat(x) actua en cada columna. [m n] = size(x); if ( m == 1) m = n; % caso de un vector la end media = sum(x)/m; stdev = sqrt(sum(x. 2)/m - media. 2); Una vez estas ordenes son guardadas en un archivo stat.m, el comando [xm, xd] =

1.11. FICHEROS *.M (M-FILES)

17

stat(x), por ejemplo, asigna la media y la desviaci on estandard de las entradas del vector x a xm y xd, respectivamente. Una asignaci on simple puede tambi en hacerse con una funci on con varios argumentos de salida. Por ejemplo, xm = stat(x) (sin corchetes en torno a xm) asigna la media de x a xm. La funci on stat ilustra algunas de las capacidades MATLAB y OCTAVE para producir un c odigo eciente. Observar, por ejemplo, que x. 2 es la matriz de los cuadrados de las componentes de x, que sum es una funci on vectorial y que sqrt es una funci on escalar. Adem as, la divisi on en sum(x)/m es una operaci on matrizescalar. Por lo tanto, todas las operaciones est an vectorizadas y los ciclos han sido evitados. Si no se es capaz de vectorizar algunos c alculos, se puede conseguir que los ciclos for vayan m as r apido mediante la predeterminaci on de vectores o matrices en los que la salida se almacene. Por ejemplo, M = magic(6); E = zeros(6, 50); for j = 1 : 50 E(:, j) = eig(M i); end incluyendo la segunda orden, que usa la funci on zeros, el espacio para almacenar E en memoria es predeterminado. Sin esto, se debe de redenir la talla de E increment andola una columna en cada iteraci on y ralentizando la ejecuci on. Algunos otros detalles m as avanzados se ilustran en la siguiente funci on. Como ya hemos mencionado, algunos de los argumentos de entrada en una funci on se pueden hacer opcionales, por ejemplo tol en esta funci on, mediante el uso de nargin (n umero de argumentos de entrada). La variable nargout se puede usar de forma similar. Observar tambi en como se usa el hecho de que una relaci on es 1 cuando verdad y 0 cuando falsa. Cuando while o if evalua una relaci on, no cero signica true y 0 signica false. Finalmente, la funci on feval permite tener como variable de entrada la cadena de caracteres que denota otra funci on, ver tambi en eval. function [b, steps] = bisect(fun, x, tol) % BISECT da el cero de una funci on de una variable via bisecci on. % bisect(fun,x) devuelve un cero de la funci on. % fun es una cadena de caracteres con el nombre de la funci on; % Normalmente las funciones son denidas en cheros *.m.

18

A MATLAB Y OCTAVE CAP ITULO 1. INTRODUCCION % x es un valor inicial. El valor devuelto es cercano % a un punto donde fun cambia de signo. Por ejemplo , % bisect(sin,3) es pi. Observemos las comillas entorno a sin. % % Un tercer argumento de entrada determina una tolerancia, la % precisi on relativa del resultado (por defecto: eps). % Un segundo argumento de salida opcional da una matriz % con la traza de los pasos; las las son [c f(c)]. % Inicializaci on if ( nargin < 3) tol = eps; end trace = (nargout == 2); if ( x = 0) dx = x/20; else dx = 1/20; end a = x - dx; fa = feval(fun,a); b = x + dx; fb = feval(fun,b); % Se busca cambio de signo. while ( (f a > 0) == (f b > 0)) dx = 2,0 dx; a = x - dx; fa =feval(fun,a); if ( (f a > 0) = (f b > 0)) break end b = x + dx; fb = feval(fun,b); end if (trace) steps = [a fa; b fb]; end

1.12. CADENAS DE CARACTERES, MENSAJES DE ERROR, ENTRADA 19 % ciclo principal while (abs(b a) > 2,0 tol max(abs(b), 1,0)) c = a + 0.5*(b - a); fc =feval(fun,c); if (trace) steps = [steps; [c fc]]; end if ((f b > 0) == (f c > 0)) b = c; fb = fc; else a = c; fa = fc; end end Algunas de las funciones son internas mientras que otras se distribuyen como cheros *.m. Con la orden type nombrefuncion se puede ver el contenido de la funci on nombrefuncion.

1.12.

Cadenas de caracteres, mensajes de error, entrada

Las cadenas de caracteres se introducen entre comillas simples. Por ejemplo, s = Esto es una prueba asigna el texto a la variable s. Mensajes de texto se pueden mostrar en MATLAB y OCTAVE mediante la funci on disp. Por ejemplo: disp(Hola que tal?) Los mensajes de error se muestran mejor con la funci on error error(Perdon, la matriz debe de ser simetrica) puesto que dentro de un chero *.m para la ejecuci on. Mensajes de texto tambi en se muestran en OCTAVE mediante la orden printf. Por ejemplo, printf(Hola que tal?\n). La opci on al nal \n representa el salto a una nueva l nea. En un chero *.m el usuario puede ser requerido a introducir datos con la funci on input. Por ejemplo, la orden iter = input(Introduce el n umero de iteraciones: ) muestra el mensaje, interrumpe la ejecuci on hasta que el usuario

20

A MATLAB Y OCTAVE CAP ITULO 1. INTRODUCCION

introduce un dato y presiona la tecla de retorno. Entonces la ejecuci on se resume y el valor se ha asignado a iter.

1.13.

Trabajando con archivos *.m

Es mejor crear o editar para modicar un chero *.m sin salir de la sesi on actual de trabajo, puesto que si salimos perderiamos todas las variables activas en esa sesi on. Esto se puede realizar mediante la orden !. Si precedemos de !, cualquier comando de sistema, este se puede realizar sin salir de la sesi on de trabajo. Si por ejemplo, usamos el editor de texto vi, la orden >> vi rotar.m nos permitir a editar el archivo rotar.m. Despues de salir del editor, volveremos a la sesi on de trabajo donde la dejamos. Sin embargo en sistemas permitiendo tareas m ultiples es preferible mantener los dos activos, MATLAB u OCTAVE y el editor de texto. Posiblemente, cada uno de ellos en una ventana distinta. El comando pwd devuelve el nombre de el directorio de trabajo presente y con cd es posible cambiarlo. Con dir o ls se pueden listar los contenidos del directorio de trabajo y con what se muestran s olo los archivos *.m. Las comandos delete y type se pueden usar para borrar archivos o mostrarlos en pantalla respectivamente. Los archivos *.m deben de estar en un directorio accesible a MATLAB y OCTAVE. Todos los *.m en el directorio de trabajo actual lo son. La lista de directorios en el camino de b usqueda se obtiene con la orden path. Este comando se puede usar para incluir o eliminar directorios del camino de b usqueda, ver help path

1.14.

Comparando la eciencia de algoritmos: ops, tic y toc

Dos medidas de la eciencia de un algoritmo son el n umero de operaciones en coma otante (ops) realizados y el tiempo empleado. La funci on flops guarda un total de los ops realizados. El comando flops(0) (que no flops = 0) inicializa ops a 0. Entonces, poniendo flops(0) inmediatamente antes de ejecutar un algoritmo y flops justo despu es da el n umero de ops realizados en el algoritmo. Por ejemplo, el n umero de ops requerido para resolver

1.15. FORMATOS DE SALIDA un sistema lineal mediante eliminaci on de Gauss se puede obtener con: f lops(0), x = A\b; f lops

21

El tiempo usado (en segundos) puede ser obtenido con las ordenes tic y toc; tic empieza el reloj y toc devuelve el tiempo pasado. Por lo tanto, las ordenes tic, sentencias, toc devuelven el tiempo gastado en la ejecuci on de sentencias. Por ejemplo, con: tic, x = A\b; toc se obtiene el tiempo usado en resolver el sistema lineal. Como ejemplo, se puede comparar en cuanto a ops y tiempo con la orden x = inv(A)*b;. Se debe observar que en las m aquinas en las que se comparte el tiempo de c alculo con otros usuarios, el tiempo pasado no es una buena referencia, puesto que depende de lo ocupado que est e el computador en ese momento.

1.15.

Formatos de salida

Todos los c alculos se realizan en doble precisi on, pero el formato de salida en pantalla se puede controlar con los siguientes comandos format format format format format format format format short long short e long e rat hex loose compact 4 decimales (por defecto) 14 decimales notaci on cient ca con 4 decimales notaci on cient ca con 15 decimales aproximaci on por el cociente de enteros formato hexadecimal introduce l neas en blanco en la salida (por defecto) elimina las l neas en blanco en la salida (recomendada)

Una vez que se ejecuta el formato, permanece hasta que se cambia. Las opciones loose y compact son independientes de los otros formatos.

22

A MATLAB Y OCTAVE CAP ITULO 1. INTRODUCCION

1.16.

Variables Especiales y Constantes

Ya hemos visto el uso de las variables de valor jo (predeterminado) i, j . Existen otras m as i,j,I,J unidad imaginaria 1 pi n umero e n umero e eps precisi on en operaciones de punto otante realmax mayor n umero real positivo representable (1.7977e+308) realmin menor n umero real positivo representable (2.2251e-308) inf, -inf n umeros fuera del rango representable NaN Not a Number. Resultado de operaciones sin sentido como 0/0 Especial cuidado debe de tenerse con inf y NaN puesto que se propagan en las operaciones matem aticas. Es decir, por ejemplo, un n umero sumado a NaN da NaN, y no se nos avisa. La variable eps devuelve la diferencia entre 1.0 y el n umero otante inmediatamente superior, por lo tanto, da una idea de la precisi on.

1.17.

Gr acas

MATLAB y OCTAVE generan gr acas planas de curvas 2-D, 3-D y de supercies. Los comandos principales para ello son plot, plot3, mesh, y surf en MATLAB y gplot o plot, gsplot y mesh en OCTAVE. La forma de trabajar es similar. Gr acas planas. La orden plot crea gr acas lineales x-y; si x e y son vectores de la misma longitud, la orden plot(x,y) abre una ventana y dibuja los elementos de x versus los de y . Por ejemplo, se puede dibujar la funci on seno en el intervalo de -4 a 4 con los comandos: x = 4 : ,01 : 4; y = sin(x); plot(x, y). El vector x es una partici on del intervalo con separaci on entre puntos de 0.01 mientras que y es un vector con los valores del seno en los nodos de la partici on, la funci on sin opera en cada componente del vector x. Se pueden tener varias gr acas en distintas ventanas, siempre hay una que es la activa. Por ejemplo, si la gura 1 es la activa, la orden figure(2) (o simplemente figure) abre una segunda ventana que queda como la activa. La orden figure(1)

1.17. GRAFICAS

23

mostrar a la gura 1 y la pondr a como activa. La orden gcf devuelve el n umero de la gura activa. 2 Otro ejemplo, y = ex en el intervalo -1.5 a 1.5: x = -1.5:.01:1.5; y = exp(-x. 2); plot(x,y) Observar que se debe de preceder por un punto para asegurar que opera en cada componente de x. MATLAB tiene la funci on fplot para poder realizar la gr aca de una funci on. x2 Por ejemplo, para dibujar y = e primero se dene la funci on en un chero *.m, llamado por ejemplo expnormal.m y conteniendo function y = expnormal(x) y = exp(-x. 2); Entonces la orden f plot( expnormal , [1,5, 1,5]) produce la gr aca. Curvas param etricas pueden ser tambi en dibujadas. Por ejemplo, t=0:.001:2*pi; x=cos(3*t); y=sin(2*t); plot(x,y) Las gr acas pueden tener t tulos, los ejes pueden tener etiquetas y se puede poner texto dentro de la gura. Los siguientes comandos toman una cadena de caracteres como argumento title xlabel ylabel gtext text dibuja titulo etiqueta eje x etiqueta eje y pone texto sobre la gura usando el rat on posiciona texto en las coordenadas

Por ejemplo, la orden title(Aproximacion por minimos cuadrados) da un t tulo a la gr aca. La orden gtext(El punto) permite situar interactivamente el texto en la gura con el rat on. Para situar texto en unas determinadas coordenadas, se usa text (ver help text). La orden grid muestra l neas de malla sobre la gura actual.

24

A MATLAB Y OCTAVE CAP ITULO 1. INTRODUCCION

Por defecto, los ejes se escalan autom aticamente. Esto se puede eliminar con el comando axis. Algunas opciones de axis son: axis([xm n ,xm ax ,ym n ,ym ax ]) axis(axis) axis auto v = axis axis square axis equal axis off axis on pone los ejes seg un los l mites descritos mantiene escala en las siguientes gr acas devuelve al escalado autom atico devuelve el vector v con la escala actual misma escala en ambos ejes misma escala y marcas en ambos ejes elimina la escala y las marcas de los ejes devuelve la escala y marcas a los ejes

La orden axis debe de darse despu es de la orden plot. Dos formas de obtener gr acas m ultiples dentro de una misma gura son, primero x=0:.01:2*pi; y1=sin(x);y2=sin(2*x);y3=sin(4*x); plot(x,y1,x,y2,x,y3) y segundo, formando una matriz Y con los valores funcionales como columnas x=0:.01:2*pi; Y=[sin(x), sin(2*x), sin(4*x)]; plot(x,Y) Otra forma es con la orden hold. La orden hold on congela la gura actual y la gr aca siguiente se realiza sobre ella. Los ejes pueden ser reescalados de todas formas. Con hold off se elimina la opci on hold. Se pueden cambiar los tipos de l neas, puntos y colores establecidos por defecto. Por ejemplo, x=0:.01:2*pi; y1=sin(x); y2=sin(2*x); y3=sin(4*x); plot(x,y1,,x,y2,:,x,y3,+) da una l nea discont nua y una de puntos para las dos primeras curvas mientras que para la tercera el s mbolo + se pone en cada nodo. Los tipos de l nea y marcas son Tipos de l nea: s olida (-), discont nua (--). puntos (:), punto l nea (-.) Tipos de marcas: puntos (.),signo + (+), estrella (*), circulo (o), x (x) Los colores se pueden especicar tambi en para marcas y l neas Colores: amarillo (y), magenta (m), cyan (c), rojo (r), verde (g), azul (b), blanco (w), negro (k) Por ejemplo, plot(x,y,r--) dibuja una l nea roja discont nua.

1.17. GRAFICAS

25

La orden subplot puede ser usada para subdividir la pantalla y poder situar varias gr acas dentro de una misma gura, ver help subplot. Otras funciones para hacer gr acas 2-D y que se pueden explorar con la orden help son: polar, bar, hist, quiver, compass, feather, rose, stairs, fill Gr acas de curvas 3-D. De forma an aloga plot en 2-D, la orden plot3 produce curvas en tres dimensiones espaciales. Si x, y y z son tres vectores de la misma talla, la orden plot3(x,y,z) produce una gr aca en perspectiva de la curva lineal a trozos que pasa por los puntos del espacio 3-D de coordenadas x, y y z . Estos vectores se denen usualmente de forma param etrica. Por ejemplo, t=.01:.01:20*pi; x=cos(t); y=sin(t); z=t. 3; plot3(x,y,z) produce una h elice comprimida cerca del plano x-y . Como en el caso de curvas en el plano, se pueden usar t tulos y etiquetas para los ejes, incluyendo ahora el eje z con zlabel. Tambi en el comando axis se puede usar, aunque ahora para prescribir las escalas de los ejes necesitaremos 6 valores. Supercies 3-D. La orden mesh(z) crea una gr aca 3-D en perspectiva de los elementos de la matriz z . La malla base es rectangular en el plano x-y y se dene con los ndices de la matriz mientras que la supercie con los valores de Z para cada par de ndices Tambi en se puede usar el comando surf. Intenta surf(eye(10)) y mesh(eye(10)). Para dibujar la funci on z = f (x, y ) sobre un rect angulo, primero denimos los vectores xx e yy que proporcionan la partici on sobre los lados del rect angulo. Con la funci on meshgrid (meshdom en OCTAVE) se crea la matriz x, donde cada la es xx y la longitud de cada columna es la de yy . Similarmente se crea la matriz y , cada columna iguala a yy , como sigue: [x,y] = meshgrid(xx,yy); Entonces se calcula la matriz z , obtenida evaluando f en sobre cada entrada de las matrices x e y . Entonces usamos mesh o surf. 2 2 Por ejemplo, si z = ex y y el dominio es [2, 2] [2, 2] haremos: xx = -2:.2:2; yy = xx; [x, y] = meshgrid(xx,yy);

26

A MATLAB Y OCTAVE CAP ITULO 1. INTRODUCCION z = exp(-x. 2 - y. 2); mesh(z)

Se pueden reemplazar las tres primeras l neas con [x, y]= meshgrid(-2:.2:2, -2:.2:2); Intentalo con surf en vez de mesh. El sombreado de las supercies se ja con la orden shading. Hay tres opciones: faceted (defecto), interpolated y flat. Se seleccionan con la orden shading faceted, shading interp, shading flat Sobre las supercies producidas con surf, interpolated y flat eliminan las l neas de malla. Las ordenes shading, colormap y view deben de introducirse despu es del comando surf. El color de una supercie se controla con colormap. Valores posibles son: hsv (defecto), hot, cool, jet, pink, copper, flag, gray, bone y se determinan mediante colormap(cool). La orden view se usa para especicar el punto de vista del objeto en coordenadas esf ericas o cartesianas, verhelp view. Supercies denidas en forma param etrica se pueden tambi en obtener. Las funciones de MATLAB sphere y cylinder generan las supercies referidas (ver type sphere y type cylinder). El siguiente ejemplo genera un toro: function [x,y,z] = toro(r,n,a) % TORO Genera un toro % toro(r,n,a) genera un toro con radio central a % y radio lateral r. n es el n umero de % caras sobre la supercies. Valores por defecto son % r = 0.5, n = 30, a = 1. % % [x,y,z] = toro(r,n,a) genera tres (n+1)-(n+1) % matrices y surf(x,y,z) produce el toro. % % Ver tambi en SPHERE, CYLINDER

1.18. ECUACIONES DIFERENCIALES ORDINARIAS if ( nargin < 3) a = 1; end if ( nargin < 2) n = 30; end if ( nargin < 1) r =0.5; end theta = pi*(0:2:2*n)/n; phi = 2*pi*(0:2:n)/n; xx = (a + r*cos(phi))*cos(theta); yy = (a +r*cos(phi))*sin(theta); zz = r*sin(phi)*ones(size(theta)); if ( nargout == 0) surf(xx,yy,zz) ar = (a + r)/sqrt(2); axis([-ar,ar,-ar,ar,-ar,ar]) else x =xx; y = yy; z = zz; end

27

Son interesantes de explorar via help las funciones meshz, surfc, surfl, contour,pcolor

1.18.

Ecuaciones Diferenciales Ordinarias

Queremos ahora resolver ecuaciones de la forma d x(t) = f (x(t), t), para t t0, x(t = t0) = x0 dt que se denominan Ecuaciones Diferenciales Ordinarias con un valor inicial. OCTAVE posee una funcion interna construida para la resoluci on de este tipo de problemas y es la funci on lsode. Su forma general es : lsode(f cn, x0, t, tcrit ). La funci on lsode(f cn, x0, t, tcrit ) devuelve una matriz de x como funci on de t, dado el dato inicial del sistema x0. Cada la en x corresponde a un valor de t. As la primera la corresponde con x0.

28

A MATLAB Y OCTAVE CAP ITULO 1. INTRODUCCION

El primer argumento f cn es la cadena de caracteres que representa la funci on f . Debe de ser de la forma xpunto = f cn(x, t) donde xdot y x son vectores y t es un escalar. El cuarto argumento, tcrit es opcional y se suele usar para indicar un tiempo m aximo a partir del cual no se debe de resolver la ecuaci on. Resulta u til ante problemas como singularidades y puntos de discontinuidad. Por ejemplo, function xpunto=fcn(x,t) xpunto = zeros(3, 1); xpunto(1) = 77,27 (x(2) x(1) x(2) + x(1) 8,375e 06 x(1) 2); xpunto(2) = (x(3) x(1) x(2) x(2))/77,27; xpunto(3) = 0,161 (x(1) x(3)); endfunction con la condici on inicial x0 = [ 4; 1,1; 4 ]. El sistema se puede integrar con t = linspace(0, 500, 1000); y = lsode( f cn , x0, t); Se podr a observar un cambio brusco de la soluci on entre t = 0 y t = 5 y en torno a t = 305. Un conjunto de puntos, o de tiempos t m as eciente es t = [ 0, logspace(1, log 10(303), 150), logspace(log 10(304), log 10(500), 150) ]; MATLAB posee varias funciones internas para la resoluci on de Ecuaciones Diferenciales Ordinarias con un valor inicial. Nosotros usaremos ode23 y ode45. Estas funciones emplean m etodos de integraci on del tipo de Runge-Kutta expl citos. ode23 emplea una f ormula de tipo (2,3) para obtener una precisi on media, mientras que ode45 emplea una f ormula de tipo (4,5) para obtener una gran precisi on. La forma general es [ t, x ] = resolutor(f cn, tiempo, x0) El primer argumento f cn es la cadena de caracteres que representa la funci on f y debe de ser de la forma xpunto = f cn(x, t) donde xdot y x son vectores y t es un escalar. La variable tiempo representa el intervalo de integraci on y x0 es el vector de datos iniciales. Si tiempo contiene m as

1.18. ECUACIONES DIFERENCIALES ORDINARIAS

29

de dos elementos, entonces el resolutor devuelve los valores calculados de x en esos valores como tiempos. Por ejemplo, para buscar la soluci on de d x(t) = 2 t x2 , dt x(0) = 1,

en los tiempos t = 0, 0,25, 0,5, 0,75, 1 usamos lo siguiente: function dx=xfun(x,t) dx = 2 t. x(1). 2; la ecuaci on se puede integrar con x0 = 1; tiempo = linspace(0, 1, 4); [ t1, x1 ] = ode23( xf un , tiempo, x0); [ t2, x2 ] = ode45( xf un , tiempo, x0); [t1, x1, x2] la u ltima orden crea una tabla con los resultados.

También podría gustarte