MATLAB : UNA BREVE INTRODUCCIÓN CÁLCULO IV Curso 2005-06 1 Cómo nombrar variables Los nombres de variables son sensibles a las mayúsculas y a las minúsculas. Ejemplo 1.1 Items, ITEMS son dos variables distintas. Los nombres de variables deben comenzar por una letra seguida por cualquier número de letras, dígitos o barras de subrayado. Ejemplo 1.2 A 16 x597 2bA S3Lib1 Los caracteres de puntuación no están permitidos pues tienen un significado especial en MATLAB. Existen algunos nombres de variables reservados por MATLAB: ans: resultado pi : número pi eps: el número más pequeño tal que añadido a 1 crea un número mayor que 1 en el ordenador flops: contador de operaciones de punto flotante inf: que tiende a NaN: no es un número i (y) j : i = j = 1 nargin: número de argumentos de entrada para una función nargout: número de argumentos de salida para una función realmin: número real más pequeño utilizable realmax: número real más grande utilizable Ejemplo 1.3 Creación de una variable: >> items = 12 items = 1 12
2 Comentarios y puntuación MATLAB ignora lo que está detrás de % Ejemplo 2.1 >> items = 4% número de items items = 4 Pueden escribirse varios comandos separados por comas o puntos y coma en una misma línea. Si se pone una coma se escribe el resultado del comando en pantalla pero si se pone un punto y coma el resultado no aparece en pantalla. Ejemplo 2.2 >> valor1 = 4, valor2 = 3; valor3 = 7 valor1 = 4 valor3 = aunque para la variable valor2 el valor almacenado es 3. Una sucesión de tres puntos indica que el resto del comando se continúa en otra línea: Ejemplo 2.3 >> cociente = valor1/... >> valor2 7 cociente = 1.3333 Esto es cierto siempre que no partamos nombres de variables: Ejemplo 2.4 >> cociente = valor1/va... >> lor2 Missing operator, comma o semicolon???ente = valor1/valor2 Tampoco pueden continuarse los comentarios: Ejemplo 2.5 >> valor1 = 3%primer... >> valor???undefined function or variable valor 2
3 Números complejos Ejemplo 3.1 Ejemplo 3.2 Ejemplo 3.3 Ejemplo 3.4 >> c1 = 1 2i c1 = 1.0000 2.0000i >> c1 = 1 2j% j significa lo mismo que i c1 = 1.0000 2.0000i >> c2 = 3 (2 sqrt( 1) 3) c2 = 6.0000 9.0000i >> c3 = sin(.5) i c3 = 0.0000 + 0.4794i Observemos que en este caso al ser una expresion no podemos añadir la i a sin(.5). Otra observación importante es que MATLAB trabaja en radianes. 4 Funciones matemáticas más comunes abs(x): valor absoluto o módulo de x asin(x) : arcoseno acos(x) : arcocoseno asinh(x) : arcoseno hiperbólico acosh(x) : arcocoseno hiperbólico angle(x) : ángulo de un complejo ( ( π, π] ) atan(x): arcotangente ( ( π, π] ) 3
atanh(x): arcotangente hiperbólico conj(x): complejo conjugado conj(x): complejo conjugado cos(x): coseno cosh(x): coseno hiperbólico sin(x): seno sinh(x): seno hiperbólico exp(x): exponencial real(x): parte real imag(x): parte imaginaria log(x): logaritmo natural log10(x): logaritmo en base 10 sign(x): función signo sqrt(x): raíz cuadrada tan(x): tangente tanh(x): tangente hiperbólica 5 Matrices Para definirlas: >> A = [ 1 3 5 ; 1 0 1 ; 5 0 9] A = 1 3 5 1 0 1 5 3 9 Para sumar matrices el comando es + y para multiplicar el comando es * siempre que las sumas y productos tengan sentido. Por ejemplo para multiplicar dos vectores fila con el mismo número de elementos el comando será: >> x = d p ; 4
aquí p representa el vector traspuesto de p y x el resultado del producto escalar de d y p. Para dividir dos escalares x1 y x2 el comando es: >> g = x1/x2; El comando x1\x2 representa x2/x1 y entonces tiene sentido que para resolver el sistema Ad = b donde A es una matriz y b y d son vectores utilicemos el comando \. La expresión >> d = A \ b; resuelve el sistema Ad = b a través de una factorización LU. Podría hacerse de la forma >> d = inv(a) b; pero es más caro. Si el sistema posee más ecuaciones que incógnitas el uso del operador \ da como resultado el vector d que minimiza el error cuadrático en Ad b. Esta es la llamada solución en mínimos cuadrados. Ejemplo 5.1 >> A = [1 2 3 ; 4 5 6 ; 7 8 0 ; 2 5 8] A = 1 2 3 4 5 6 7 8 0 2 5 8 >> b = [366 804 351 514] b = 366 804 351 514 >> d = A \ b % cálcula la solución mínimo cuadrática d = 247.9818 173.1091 114.9273 5
En MATLAB los elementos de una matriz pueden ser manipulados individualmente o en bloques: >> X(1, 3) = C(4, 5) + V (9, 1) A(:, 3) representa la tercera columna de A y A(5, :) la quinta fila. Veamos distintos ejemplos de manipulación de matrices en MATLAB: Ejemplo 5.2 >> A = [2 3 4 5 6 ; 4 5 6 7 8 ; 3 5 7 9 1 ; 4 6 8 10 12 ; 2 3 4 5 6] A = 2 3 4 5 6 4 5 6 7 8 3 5 7 9 1 4 6 8 10 12 2 3 4 5 6 >> v = [1 3 5]; >> b = A(v, 2) es decir b está compuesto por los elementos 1, 3 y 5 de la segunda columna de A. Si ejecutamos: b = 3 5 3 >> C = A(v, :) C = 2 3 4 5 6 3 5 7 9 1 2 3 4 5 6 es decir C está formado por las filas 1, 3 y 5 de A 6
Otro ejemplo: >> D = zeros(3); >> D(:, 1) = A(v, 2); Aquí primero hemos construido una matriz 3 3 de ceros y despues hemos sustituido su columna 1 por los elementos 1, 3 y 5 de la columna 2 de A. Ejecutando: >> E = A(1 : 2, 4 : 5) E = 5 6 7 8 Si A es una matriz compleja A es la matriz traspuesta conjugada y A. es la traspuesta. Si la matriz es real los dos operadores coinciden. Para generar matrices con valores especificados hay distintos modos, pero vemos solo algunos ejemplos: >> a = 10 : 10; crea un vector fila a empezando en -10 sumando 1 cada vez hasta 10. >> b = 2 : 0.2 : 2; crea un vector fila b empezando en -2 sumando 0.2 cada vez hasta 2. 6 Algunas matrices especiales [ ]: matriz vacía eye(n) : matriz identidad de dimensión nxn ones(n): matriz de unos de dimensión nxn rand(n): matriz aleatoria con coeficentes entre 0 y 1 zeros(n): matriz de ceros de dimensión nxn 7
En agunas aplicaciones aparecen matrices que tienen solo un pequeño número de elementos distintos de cero (matrices huecas): este es el caso en simulación de circuitos y programas de elementos finitos. Si una matriz de este tipo es grande es conveniente eliminar el almacenamiento de ceros. Además existen algoritmos adaptados a este tipo de matrices. En MATLAB para convertir una matriz hueca en escritura normal en una matriz almacenada como hueca se utiliza el comando sparse. >> B = eye(200); >> BS = sparse(b); En este caso B es la matriz identidad en escritura llena y BS la matriz identidad almacenada como hueca. 7 Funciones de matrices size(a): dos escalares conteniendo el número de filas y columnas de A chol(a) : factorización Cholesky cond(a): condicionamiento de A d = eig(a): autovalores de A [V, D] = eig(a): autovectores y autovalores de A expm(a): exponencial de A funm(a, fun ): función general de A inv(a): inversa de A norm(a, 1): norma 1 de A norm(a, 2): norma 2 de A norm(a, inf): norma infinito de A null(a): núcleo de A poly(a): polinomio característico de A qr(a): descomposición triangular ortogonal de A trace(a): traza de A Hay comandos y funciones especiales para matrices huecas pero no las nombraremos aquí 8
8 Operaciones elemento por elemento Las operaciones elemento por elemento difieren de las operaciones habituales con matrices pero suelen ser muy útiles. Se indican con un punto que precede al operador. Por ejemplo X. Y, X. Y, X. \ Y. Si en estas sentencias X e Y son matrices o vectores los elementos de X son elevados, multiplicados o divididos por los correspondientes de Y. Ejemplo 8.1 >> A = [ 1 2 ; 3 4 ] A = 1 2 3 4 >> B = [ 5 6 ; 7 8 ] B = 5 6 7 8 >> A B ans = 19 22 43 50 >> A. B ans = 5 12 21 32 9
9 Programando con MATLAB Para conocer que variables estan definidas el comando es whos. Si se desea conocer el valor actual de una variable el comando es disp, en la respuesta no aparece el nombre de la variable. Los operadores de relación en MATLAB son <: menor que <=: menor o igual >: mayor que >=: mayor o igual ==: igual a =: distinto de Para repetir la ejecución de uno o varios comandos se utiliza un ciclo for Ejemplo 9.1 Conocidos A, B, n y m : Ejemplo 9.2 >> for i = 1 : n >> for j = 1 : m >> C(i, j) = A(i, j) + cos(i + j) pi/(m + n) B(i, j); >> for k = n + 2 : 1 : n/2 >> a(k) = sin(pi k); Cuando la repetición se continua siempre que se satisfaga una cierta condición se utiliza la sentencia while Ejemplo 9.3 >> dif = 1; >> while dif > 0.0005 >> x1 = x2 cos(x2)/(1 + x2); >> dif = abs(x2 x1); >> x2 = x1; 10
A veces los comandos deben ser condicionalmente evaluados de acuerdo con un test de relación. Para ello se utiliza la sentencia if Ejemplo 9.4 Ejemplo 9.5 >> for k = 1 : n >> for p = 1 : m >> if k == p >> z(k, p) = 1; >> total = total + z(k, p); >> elseif k < p >> z(k, p) = 1; >> total = total + z(k, p); >> else >> z(k, p) = 0; >> if(x = 0)&(x < y) >> b = sqrt(y x)/x; 10 Funciones definidas por el usuario Se definen en los ficheros.m y la forma más simple es: function parámetros de salida= nombre de la función (parámetros de entrada) El nombre de la función y el nombre del fichero deben ser idénticos. Ejemplo 10.1 Ejemplo 10.2 >> functionp = fun1(x) >> x = x/2.4; >> p = x 3 2 x + cos(pi x); >> f unction[x1, x2] = rootquad(a, b, c) >> % resuelve ax 2 + bx + c = 0 dados a, b, c 11
>> d = b b 4 a c; >> x1 = ( b + sqrt(d))/(2 a); >> x2 = ( b sqrt(d))/(2 a); Otra forma de transmitir la información es hacerlo en global. parámetros. Esto es útil para los Ejemplo 10.3 >> global alpha; >> alpha = 7; >> [f] = prim(x, it) donde prim define una función f que incluye alpha como parámetro, por ejemplo: f(x) = cos(x alpha). Una forma de evaluar la función es utilizando el comando feval 11 Ficheros >> [r1, r2] = feval( rootquad, (1, 2, 3)) Los ficheros con la extensión.mat se utilizan con los comandos save y load para almacenar datos en binario. Los ficheros con la extensión.m son reconocidos por MATLAB como ficheros de ejecución. Dentro de ellos se pueden teclear una serie de comandos que luego se ejecutaran al teclear en MATLAB el nombre del fichero. Desde dentro de un programa función puede interesarnos abir un fichero para recuperar o almacenar información: Abrir un fichero para escritura con el comando fopen, mediante el cual el fichero queda identificado por un número. Para cerrarlos el comando es fclose. Si los datos son binarios, se puede utilizar la siguiente sentencia: >> fid = fopen( nombre.de.fichero, wt ) Si se quieren leer datos binarios de un archivo se utiliza el comando fread y para escribirlos el comando fwrite. Si se quieren leer datos formateados de un archivo se utiliza el comando fgetl o fgets y para escribirlos el comando fprintf. Algunos comandos de gestión de ficheros : cd: muestra el directorio de trabajo 12
cd path: cambia al directorio path chdir: como cd delete nombre: borra el fichero nombre.m dir: lista los ficheros del directorio de trabajo ls: lo mismo que dir path: muestra o modicifca el directorio de búsqueda de MATLAB type nombre: muestra el fichero nombre.m en la ventana de comandos what: devuelve una lista de ficheros.m y ficheros.mat 12 Gráficos La función plot permite dibujar una curva en el plano xy. Ejemplo 12.1 >> x = 0 : pi/100 : 2 pi; >> y = sin(x); >> plot(x, y); >> title( Dibujo 1 ); Este ejemplo dibuja la función seno en el intervalo [0, 2π]. MATLAB permite elegir el trazado y el color de las curvas y poner un rótulo sobre los ejes: >> plot(x, y, r ); >> xlabel( x ) >> ylabel( y ) >> title( Dibujo 2 ); El ejemplo siguiente corresponde a una superficie en 3D. En concreto es una imagen original que se utilizará en el problema de restauración de imágenes: Ejemplo 12.2 >> z = ones(80); z(13 : 68, 13 : 68) = 2 ones(size(z(13 : 68, 13 : 68))); >> for i = 25, 56 >> z(i, 25 : i) = z(i, 25 : i) + ones(1, i 24); >> mesh(z); ; >> title( Dibujo 3 ); 13
13 Bibliografiía Introducción a MATLAB y sus aplicaciones: P. Quintela Estévez. Servicio de Publicaciones de la Universidad de Santiago, 1997. Numerical Methods Using MATLAB: G. Linfield y J. Penny. Ellis-Horwood, 1995. Mastering MATLAB: D. Hanselman y B. Littlfield. Prentice-Hall, 1996. The Student Edition of MATLAB: Prentice-Hall, 1995. 14