Intro Matlab

download Intro Matlab

of 32

Transcript of Intro Matlab

F sica computacional, primera parte: Introduccin al programa Matlab y su o entorno

1

Nota introductoria

El clculo numrico por ordenador se ha convertido en una herramienta esena e cial en prcticamente todas las ramas de la f a sica. Los problemas que pueden ser resueltos de manera exacta y expl cita sin recurrir a este tipo de mtodos e son en general muy importantes, pero tambin son pocos y normalmente en e situaciones simplicadas. Por tanto, para abordar con precisin problemas o tan diferentes como por ejemplo trayectorias de proyectiles, propagacin de o ondas en un determinado medio o el resultado de colisiones de part culas elementales a gran energ es necesario recurrir a un ordenador. a, El objetivo de este curso es familiarizarse con la implementacin en un o ordenador de clculos necesarios para describir fenmenos f a o sicos. En cada caso, tendremos un conjunto de ecuaciones, cuya solucin queremos aproxio mar numricamente. Primero, debemos establecer un algoritmo para llegar e al resultado deseado. Despus, hay que programar dicho algoritmo para que e el ordenador realice la sucesin nita de operaciones matemticas deseada. o a Hay diferentes lenguajes de programacin que son usados con este n. Eno tre otros, algunos de los ms frecuentemente empleados son Fortran, C++, a Matlab, Mathematica, . . . En este curso, usaremos el lenguaje Matlab (Matrix Laboratory). Cada lenguaje tiene sus ventajas e inconvenientes y no hay ninguna razn de peso para preferir, a priori, un lenguaje sobre los dems. o a Sin embargo, Matlab es un buen compromiso entre facilidad de programacin o y rapidez de clculo. a Ser falso armar que una vez se aprende a programar en cierto lenguaje a es inmediato saber utilizar los dems. Pero desde luego se tiene mucho ganado a ya que en el fondo las estructuras de programacin son similares. Y naturalo mente, los algoritmos son los mismos, ya que estos no dependen del lenguaje que se utilice para programarlos. Estas notas estn pensadas para proporcionar una introduccin al entorno a o Matlab. Se presentarn, a travs de ejemplos y ejercicios, los comandos y la a e 1

sintaxis necesarias para realizar operaciones simples y para conocer estructuras bsicas de programacin. Tras familiarizarse con el contenido de estos a o apuntes, el alumno estar preparado para la implementacin de algoritmos a o en el ordenador. Es posible encontrar online buenas introducciones al entorno Matlab ms extensas que estas notas , ver las referencias [1], [2], a [3]. Tambin puede ser util consultar en la literatura textos que introducen e mtodos de anlisis numrico y estn especialmente dirigidos a usuarios de e a e a Matlab [4], [5].

2

Vectores y matrices

Como su nombre (Matrix Laboratory) indica, Matlab est diseado para a n operar con vectores y matrices de modo sencillo y eciente. En esta seccin o veremos los comandos bsicos para introducir y manipular matrices. La a sintaxis para cada tipo de operacin se mostrar en base a ejemplos. o a

2.1

Introduciendo y manipulando vectores y matrices

Una vez abrimos el programa Matlab, nos aparece la ventana de comandos. Podemos comenzar a escribir tras el s mbolo >>. Introducir un vector la: Podemos escribir >> v = [1 3 2 5] o, lo que es lo mismo >> v = [1, 3, 2, 5] de modo que en la memoria se almacena v como un vector la de 4 componentes. Si ahora escribimos, por ejemplo >> v(3) el resultado es la tercera componente del vector v, es decir, leemos: ans= 2 Resulta a veces muy util introducir vectores la como listas de numeros equiespaciados. Para ello se utilizan los dos puntos. Si escribimos: 2

ans y el punto y coma al nal de un comando: Si no asignamos ningn s u mbolo a un resultado, ste se almacena en la varie able ans (de answer). Por ejemplo, si escribimos >> 3 + 2 obtendremos ans = 5. Y si ahora escribisemos: e >> ans 4 obtendr amos ans = 20. Ntese tambin que si una l o e nea se naliza con un punto y coma, Matlab realiza la operacin pero no saca el resultado por pantalla. Esto es especialmente o util cuando tratamos con vectores o matrices muy grandes, que de mostrarse por pantalla resultan engorrosos. >> w = 1 : 5 es equivalente a escribir w = [1 2 3 4 5]. Si queremos que el espaciado no sea de una unidad podemos escribir: >> w = 1 : 0.5 : 5 que es equivalente a escribir w = [1, 1.5, 2, 2.5, 3, 3.5, 4, 4.5, 5]. Introducir un vector columna: Denamos ahora un vector columna con la siguiente sintaxis, que utiliza punto y coma: >> vc = [0; 4; 5] o, lo que es exactamente igual, escribiendo en l neas diferentes1 : >> vc = [0 4 5] Para un vector columna, tambin podemos extraer fcilmente el valor almae a cenado en cierta posicin. Como ejemplo, oAl pulsar intro, normalmente Matlab ejecuta el comando que est escrito. Sin embargo a en este caso, al no haber cerrado el corchete, simplemente permite escribir en la l nea siguiente. Tras cerrar el corchete en la ultima l nea y pulsar intro de nuevo, se ejecuta la sentencia. Lo mismo suceder con otros comandos que estudiaremos ms adelante. a a1

3

>> vc(2) resulta en ans = 4. Introducir una matriz: Podemos denir fcilmente una matriz mn. Las a tres sintaxis dadas a continuacin son equivalentes. o >> A = [1 2 3; 4 5 6] >> A = [1, 2, 3; 4, 5, 6] >> A = [1 2 3 4 5 6] Naturalmente un vector la es simplemente una matriz 1 n y un vector columna es una matriz m 1. Tambin es posible denir las matrices por bloques. Por ejemplo dee namos una nueva matriz 2 3 como: >> B = [4 3 6; 5 2 1] A partir de A y B podr amos por ejemplo denir la siguiente matriz 4 6: >> C = [A B; B A] Ntese que al denir una matriz por bloques, el tamao de las submatrices o n debe ser el apropiado. Por ejemplo si escribimos [A B; B 0] obtendremos un error ya que el 0 de la ultima entrada es un nmero cuando se espera una u matriz 2 3. Los comandos size y length: Si M es una matriz m n, entonces el comando size(M ) devuelve [m n]. Por ejemplo, utilizando la matriz A denida ms arriba, podemos escribir: a >> [m n] = size(A) de forma que m toma el valor 2 y n el valor 3. Para un vector la o columna length(v) da la dimension del vector, por ejemplo length(vc) es 3. Finalmente, length aplicado a una matriz da el nmero de columnas. u

Algunos tipos especiales de matrices: Podemos crear una matriz de ceros m n escribiendo, por ejemplo 4

>> Z = zeros(2, 4) Para una matriz cuadrada nn de ceros escribir amos, simplemente zeros(n). Si slo escribimos zeros, el resultado es un 0 (o, lo que es lo mismo, una matriz o 1 1 de ceros). Otros tipos especiales de matrices que se pueden crear con una sintaxis anloga son un matriz de unos ones(m, n) o de nmeros (pseudo-)aleatorios2 a u rand(m, n) randn(m, n). El comando eye(m, n) genera una matriz con o unos en la diagonal principal y el resto ceros. En particular, eye(n) genera la matriz identidad n n. Modicar elementos de matrices: Modicar un elemento de una matriz es muy sencillo en Matlab. Tomemos como ejemplo la matriz A denida antes y escribamos >> A(1, 2) = 10 de forma que se modica el elemento de la primera la, segunda columna y el resultado es A = [1 10 3 4 5 6] Es importante familiarizarse con el uso de los dos puntos, que permite modicar las o columnas enteras. Por ejemplo, cambiemos la tercera columna de A por la primera columna de B: >> A(:, 3) = B(:, 1) La matriz A ahora es: A = [1 10 4 4 5 5] Tambin se pueden modicar partes de las o columnas. Por ejemplo: e >> A(2, 1 : 2) = 0El comando rand crea nmeros aleatorios entre 0 y 1 con una distribucin de probu o abilidad plana. El comando randn genera nmeros aleatorios siguiendo una distribucin u o normal de media cero y desviacin t o pica 1.2

5

asigna el valor 0 a los elementos de la segunda la, columnas de la 1 a la 2 y por tanto: A = [1 10 4 0 0 5] A adir las o columnas: Tenemos la matriz 2 3 que hemos llamado A. n Supongamos que queremos aadirle una tercera la. Matlab permite hacer n esto de modo sencillo. Con escribir >> A(3, :) = [2 4 2] la matriz A es ahora 3 3 A = [1 10 4 0 0 5] 2 4 2] Tambin se puede aadir una o varias las o columnas utilizando la notacin e n o por bloques de matrices vista ms arriba. Por ejemplo, podemos aadir a n cuatros columnas de unos a la matriz A escrita aqu arriba escribiendo: >> A = [A ones(3, 4)] Ahora, A es una matriz 3 7. Eliminar las o columnas: De nuevo veamos un par ejemplos. El comando >> A(2, :) = [ ] elimina la segunda la con lo que A es ahora 2 7 y si ahora escribimos >> A(:, 3 : 5) = [ ] se eliminan las columnas de la tres a la cinco con lo que nos queda una matriz 2 4. Intercambiar las o columnas: Se pueden reordenar las las y columnas de una matriz con una sintaxis sencilla. Intercambiemos entre s la segunda y tercera columnas de A y llamemos C al resultado. >> C = A(:, [1 3 2 4]) 6

Ejercicio 1: - Crear una matriz identidad 4 4 y llamarle A. - Aadirle dos columnas de ceros y que la matriz se siga llamando A. n - Aadir una la al nal [1 2 3 4 5 6] y que an se llame A. n u - Construye una matriz B igual a A salvo que el 5 sea 5. - Elimina las tres primeras columnas de B. - Intercambia la primera y ultima las de B; que se siga llamando B. - Asigna a nf y nc el nmero de las y columnas de la matriz B. u - Crear C como una matriz 2 2 que sea el cuadrado de arriba a la derecha de B.

2.2

Operaciones con vectores y matrices

Mostramos aqu cmo efectuar operaciones bsicas con matrices. Para los o a ejemplos a continuacin, denamos dos matrices 2 2: o A= escribiendo >> A = [1 2; 3 4]; >> B = diag([1 3]); (hemos introducido el comando diag, que se usa para crear matrices diagonales y tambin para extraer diagonales de matrices). e Comencemos con la multiplicacin. La multiplicacin ordinaria de mao o trices es simplemente: 1 6 . Pero tambin se puede multiplicar elemento e 3 12 a elemento utilizando el operador . nos da como resultado 7 >> A B 1 2 3 4 , B= 1 0 0 3 ,

1 0 . Es importante no confundir los dos tipos de 0 12 multiplicacin que acabamos de introducir. o Si las dimensiones de las matrices no son las adecuadas para la operacin o que se ha introducido, Matlab generar un mensaje de error. a Veamos ahora cmo se dene el cociente de matrices. Una vez ms, o a escribir o no un punto diferencia entre operaciones ordinarias con matrices y operaciones elemento a elemento. El comando nos da el resultado >> A/B 1.0000 0.6667 y es equivalente si B es una matriz 3.0000 1.3333 cuadrada a A inv(B), donde inv(B) calcula la inversa de B. Por otro lado da como resultado >> A./B 1.0000 Inf donde los innitos aparecen al dividir entre producir a Inf 1.3333 cero. Matlab permite dividir por la izquierda, de modo que A\B es igual a inv(A) B (si A es cuadrada). Se deja como ejercicio entender los comandos A.\B, A 2, A. 2. Algunas funciones para operar con matrices Hay algunos comandos denidos para realizar las operaciones con matrices ms usuales: a >> A o >> transpose(A)

>> A. B

calcula la traspuesta de A. >> diag(A) extrae la diagonal principal de A. Se pueden sumar los elementos de cada columna de una matriz con >> sum(A)

8

Es decir, si A es una matriz n m, sum(A) es una vector 1 m. Igualmente, el comando prod halla el producto de los elementos de cada columna. Otras operaciones importantes que se pueden realizar con matrices cuadradas son >> inv(A) que calcula el inverso de A : o >> det(A) que calcula el determinante de A : o >> eig(A) que almacena en un vector columna los autovalores de A. Tambin se puede e usar >> [X D] = eig(A) Esto crea dos matrices cuadradas X, D. Cada columna de X es un autovector de A y D es una matriz diagonal donde cada elemento de la diagonal es un autovalor (A X = X D). Condiciones sobre valores de matrices o vectores A veces es muy util determinar qu elementos de cierta matriz o vector e satisfacen una condicin lgica. Tomemos el siguiente ejemplo: o o >> x = [3, 2, 2, 1, 2, 0]; >> abs(x) > 1 ans = [1 1 1 0 1 0]; donde hemos usado el comando abs, que calcula el valor absoluto de cada componente de x. Al escribir la condicin abs(x) > 1, Matlab busca los eleo mentos del vector x cuyo valor absoluto es estrictamente mayor que 1. Crea como respuesta un vector de unos y ceros donde 1 signica verdadero y 0 signica falso. Con esto, podemos realizar numerosas operaciones. Por ejemplo, crear un vector slo con los elementos de x que satisfacen la condicin: o o >> x(abs(x) > 1) 9

ans = [3 2 2 2]; Podemos hallar la posicin de los elementos que satisfacen la condicin: o o >> f ind(abs(x) > 1) ans = [1 2 3 5]; eliminar de x los elementos que satisfacen dicha condicin: o >> x(abs(x) > 1) = [ ] x = [1 0]; etc. Con matrices en lugar de vectores, este tipo de operaciones funcionan de modo anlogo. a

2.3

Matrices 3D

Se pueden generar matrices tridimensionales o, lo que es lo mismo una la de matrices. Esto puede resultar util, por ejemplo, si queremos almacenar cmo var en el tiempo los elementos de una matriz o si tenemos una o an muestra de datos tridimensional, por ejemplo la temperatura dentro de cierto volumen. Denamos una matriz 3D llamada AA cmo. o >> AA(:, :, 1) = [0, 3; 2, 1; 1, 0]; >> AA(:, :, 2) = [2, 0; 7, 2; 1, 5]; Se genera un objeto que pictricamente podemos representar del siguiente o modo:

0 3 2 1 1 010

2 0 7 2 1 5

Sobre esta estructura, podemos operar del modo habitual. Por ejemplo, si escribimos >> AA(2, 1, 2) se extrae el correspondiente elemento que en este caso ser 7. a Tambin pueden crearse matrices con los comandos habituales, por ejeme plo >> ones(2, 2, 2) crea un matriz 2 2 2 de unos. Del mismo modo, pueden generarse matrices de dimensiones mayores. Ejercicio 2: - Crear una matriz 4 4 de nmeros aleatorios comprendidos entre -1 y u 1 y llamarle A. - Obtener la suma de cada columna de A y guardar en resultado en un vector la v. - Obtener la suma de cada la de A y guardar en resultado en un vector columna w. - Calcular v w. Calcular tambin w v y llamarle B. e - Hallar el determinante de B. - Hallar una matriz 4 4 llamada C cuyo elemento Cij sea simplemente el producto Aij Bij . - Crear una matriz 4 4 de ceros y unos tal que Dij = 1 si Cij > Aij y cero en caso contrario - Crear una matriz 3D llamada AA que almacene A, seguido de C, seguido de D.

11

3

El entorno de trabajo Matlab

Hasta ahora hemos visto cmo podemos hacer que Matlab realice ciertas o operaciones escribindolas directamente en la Command Window. Esta e es slo una ventana de las mltiples que podemos utilizar en el entorno de o u Matlab. Veamos algunas de las otras ventanas: La ventana Current Directory nos muestra los archivos guardados en el directorio actual y permite editarlos haciendo doble click. Naturalmente podemos cambiar de directorio usando los iconos mostrados en la ventana Current Directory tambin se puede cambiar de e directorio escribiendo en la Command Window. La ventana Command History nos muestra los ultimos comandos que hemos introducido en la Command Window. Esto puede ser util para recordar lo que hemos hecho, pero tambin porque si queremos e ejecutar el mismo comando de nuevo (o uno parecido), podemos directamente arrastrar comandos de la Command History a la Command Window. La ventana Workspace nos muestra las variables que estn guardadas a en la memoria y nos permite manipularlas. La ventana Help nos permite acceder a la documentacin de Matlab. o Ntese que si uno escribe help seguido del nombre de un comando en la o ventana de comandos, se obtiene informacin acerca del uso y la sintaxis o asociada a dicho comando por ejemplo, escribir >> help randn. Podemos acceder a las distintas ventanas (o abrirlas, cerrarlas, etc.) a travs de la pestaa Desktop. e n

3.1

Creacin y ejecucin de un programa con el editor o o

El manejo de las ventanas arriba mencionadas puede ser prctico y convea niente, pero no es estrictamente necesario. Sin embargo, el uso del editor es crucial, ya que nos permite crear M-les, dnde escribimos una serie de o comandos que se ejecutarn siguiendo el orden establecido. Se genera un a archivo con la extensin .m. La sucesin de comandos as almacenada puede o o ser ejecutada escribiendo el nombre del archivo en la ventana de comandos 12

(obviando el .m). Tambin puede ser ejecutado directamente desde el editor e o desde la ventana Current Directory. Es decir, el editor, nos permite crear, almacenar y ejecutar un programa. Ejercicio 3: - Escribir sendos archivos ejercicio1.m y ejercicio2.m que contengan todas las operaciones pedidas en los ejercicios anteriores. Ejecutarlos y comprobar el valor que toman las distintas variables.

4

Funciones

Llamamos funciones a ciertos comandos que aceptan argumentos de entrada y producen argumentos de salida. Son cruciales al operar o programar; permiten de forma sencilla realizar una sucesin prescrita de operaciones. Por o un lado, Matlab tiene cierto nmero de funciones denidas por defecto. Por u otro lado, nos permite crear nuestras propias funciones3 .

4.1

Algunas funciones denidas en Matlab

Hay numerosas funciones implementadas en Matlab. Veamos aqu algunas de las ms comnmente usadas. a u Ya han aparecido algunas funciones que actan sobre matrices como inv, u det, sum, etc. Tambin hay funciones que actan sobre nmeros. Por ejeme u u plo, funciones trigonomtricas cos(x), sin(x), tan(x), . . . ; trigonomtricas e e inversas acos(x), asin(x), atan(x), hiperblicas sinh(x), cosh(x), tanh(x) u o otras operaciones matemticas log(x), log10(x), sqrt(x), sign(x), round(x), a real(x), imag(x), abs(x), exp(x). Tanto la entrada como la salida de estas funciones pueden ser nmeros complejos. Si hacemos actuar estas funciones u sobre un vector o matriz, la respuesta es un vector o matriz en que la funcin o ha actuado separadamente sobre cada elemento. Por ejemplo:Tambin existen los llamados Toolbox. Estos son colecciones de funciones que se e pueden adquirir y que son utiles para clculos de un determinado tipo. Por ejemplo, a existen entre muchos otros el Statistics Toolbox, el Image Processing Toolbox o incluso el Financial Toolbox. En lo que sigue utilizaremos slo funciones bsicas incluidas en Matlab. o a3

13

>> x = [1 4 9] >> sqrt(x) ans = 1 2 3 Algunas funciones especiales dan los valores de constantes utiles. Por ejemplo, el nmero es simplemente pi. Para la unidad imaginaria puede u utilizarse i j. Otros nmeros especiales son: o u eps: la precisin relativa en el almacenamiento de nmeros consecutivos o u 52 (su valor es 2 ). realmax: el mayor nmero almacenable en Matlab (2 eps) 21023 . u Inf : innito N aN : not-a-number. Aparece por ejemplo si escribo 0/0. El signicado de estos s mbolos se puede sobreescribir. Por ejemplo, si escribo: >> i = 3 la variable i tomar el valor 3 en los clculos subsiguientes. Si quiero que a a vuelva a ser la unidad imaginaria, debo escribir. >> clear i Se ha introducido el comando clear, que permite eliminar de la memoria variables a las que previamente se les ha asignado un valor. Si se escribe simplemente clear, sin ningn argumento, se vac completamente el workspace. u a

4.2

Creando nuevas funciones

Matlab nos permite crear nuestras propias funciones, que admiten un nmero u de variables de entrada y devuelven un nmero de variables de salida. Para u ello creamos un archivo con la extensin .m. Por ejemplo, veamos un ejemplo o muy sencillo. Creamos un archivo sumale tres.m con el siguiente contenido: f unction y = sumale tres(x) y = x + 3; 14

Ejercicio 4: - Crear un vector x tal que x(n) = n con n = 1, . . . , 8. - Crear un vector y tal que y(n) = sin(n) con n = 1, . . . , 8. - Crear un vector z tal que z(n) = sin(n2 ) con n = 1, . . . , 8. - Crear un vector r tal que r(n) = (sin(n))2 con n = 1, . . . , 8. - Comprobar que eps y realmax toman los valores dados en el texto. - Entender el resultado que da Matlab al escribir cada uno de los siguientes comandos: >> exp(i pi). >> realmax + 1000. >> (realmax + 1000) realmax. >> realmax 2. >> realmax (1 + eps). >> (1 + eps/2) 1. >> (0.1 + eps/2) 0.1.

Si ahora en l nea de comandos escribimos >> z = sumale tres(4) a z se le asigna el valor 7. Veamos un ejemplo un poco ms complicado. Creemos el siguiente archivo a con el nombre ejemplo1.m: f unction[r1 r2] = ejemplo1(M 1, M 2) % Introducimos dos matrices M1 y M2. % La funcion produce dos argumentos de salida. % El primero es el habitual producto matricial M1*M2. % El segundo es M2*M1 (donde M2 es la traspuesta de M2) r1 = M 1 M 2; M 3 = transpose(M 2); r2 = M 3 M 1; Hay varios puntos reseables que se pueden constatar en este ejemplo. n El nombre de la funcin y del archivo .m deber coincidir. o an 15

Las l neas que comienzan con % son comentarios y no se ejecutan. Las primeras l neas tras el f unction precedidas por % son lo que aparecer a si usamos el comando help con el nombre de la funcin. o La funcin opera con sus propias variables locales, diferentes de las o del workspace base. Esto quiere decir que tras ejecutar ejemplo1, las variables M 1, M 2, M 3 no toman ningn valor. Si se quiere que alguna u variable del workspace pueda usarse dentro de las funciones o viceversa, se puede utilizar el comando global. Ejercicio 5: - Crear dos matrices 2 2 llamadas A y B. Ejecutar la funcin del o ejemplo anterior escribiendo >> [s1 s2] = ejemplo1(A, B) - Comprobar qu valores toman los distintos s e mbolos que hemos utilizado A, B, s1, s2, r1, r2, M 1, M 2, M 3. - Comprobar el resultado de escribir >> help ejemplo1.m - Crear una nueva funcin ejemplo2.m que, dados dos nmeros x e y, o u sin x y 2 genere los valores de x2 1 y de |x| e .

5

Condicionantes y bucles

Los condicionantes y bucles son clave al programar, ya que son los que permiten establecer un ujo lgico para realizar la sucesin nita de operaciones o o que constituyen un algoritmo. Veremos aqu cmo comprobar una condicin o o 4 utilizando el comando if. Veremos despus cmo crear bucles con los coe oEs conveniente saber que tambin existe el comando switch, aunque no lo estudiaremos e en estos apuntes.4

16

Scripts y funciones: Hemos visto que hay dos tipos de archivos con la extensin .m, los llamao dos scripts que introdujimos en la seccin 3.1 y las funciones, ver seccin o o 4.2. Presentan ciertas similitudes, pero recordemos aqu sus diferencias. Los scripts son una sucesin de comandos, el resultado es el mismo que si los o escribisemos en la command window. Las funciones, sin embargo, actan e u ms bien como una caja negra; admiten variables de entrada y de salida. Las a variables utilizadas dentro de la funcin son locales y no pasan al workspace. o mandos for y while.

5.1

if (elseif, else, end)

El comando if nos permite realizar una operacin tan slo si se cumple cierta o o condicin. Por ejemplo, escribamos: o >>if 3>2 disp(3 es mayor que 2) end El programa comprueba si la condicin 3>2 es cierta. Dado que lo es, ejeo cuta el siguiente comando e imprime 3 es mayor que 2 en la pantalla hemos usado el comando disp, que muestra por pantalla su argumento. El if siempre debe concluir con un end. Si la primera condicin es falsa, se pueden o comprobar otras condiciones usando elseif y else. Como ejemplo, creemos un script llamado Ejemplo If.m con el siguiente contenido: disp(Creamos un numero aleatorio entre 0 y 1); a=rand if a isequal(A, B). Adems, se pueden utilizar los operadores lgicos , &, |. Una signica a o no; el & signica y; la barra | signica o.

5.2

for (break, end)

El comando f or nos permite realizar un determinado conjunto de operaciones cierto nmero de veces. Un ejemplo muy sencillo ser u a: >>for l=1:3 l end El bucle es recorrido tres veces, con los valores de l = 1, 2, 3 en cada caso. Lo unico que hace el programa en cada caso es escribir el valor de l. Si uno quiere que la variable que determina el bucle (en este caso l) no avance de uno en uno sino con otro intervalo, se puede hacer con una sintaxis sencilla. Probar qu ocurre si la primera l e nea del ejemplo anterior se cambia por >>for l=1:0.5:3 Los bucles for deben terminar con un end. Se puede salir del bucle antes del nmero de pasos prescrito con el comando break. Es conveniente entender u la sintaxis del siguiente ejemplo: >> for l=1:10 l if l>4 break; end end Tambin se pueden hacer bucles dentro de bucles como en el siguiente e ejercicio resuelto. Los siguientes ejercicios 6 y 7 son para practicar el uso de for e if. 18

Ejercicio resuelto: Crear una funcin cuya entrada sean dos nmeros x e y tal que o u - Si alguno de los dos nmeros x y es negativo, se escriba en pantalla u o numero negativo y la salida de la funcin sea 0. o - Si ambos x e y son mayores que 2, se escriba en pantalla mayores que dos y la salida de la funcin sea 1. o - Si no sucede nada de lo anterior y x es mayor o igual que y, se escriba x>=y y la salida de la funcin sea 2. o - Si no se cumple ninguna de las tres condiciones anteriores, no se escribe nada en pantalla y la salida de la funcin es 3. o Solucin : Creamos un archivo .m con el siguiente contenido: o function s=(x,y) if (x2) disp(mayores que 2); s=1; elseif x>=y disp(x>=y) s=2; else s=3; end

5.3

while (break, end)

Los bucles generados con while son similares a los generados con for. La diferencia es que con el for especicamos a priori el nmero de iteraciones u mientras que con while, le decimos a Matlab que repita el bucle mientras cierta condicin lgica se cumple. o o El siguiente ejemplo muestra el funcionamiento 19

Ejercicio resuelto: Crear una matriz 6 6 llamada A tal que A(l, m) = cos(l) m con l, m = 1, 2, . . . , 6. Imprimir A por pantalla. Solucin : Creamos un archivo .m con el siguiente contenido: o for l=1:6 for m=1:6 A(l,m)=cos(l)*m; end end disp (A) Ejercicio 6: - Crear una matriz 3D 5 5 3 llamada B tal que B(l, m, t) = cos(l) m + m2 t con l, m = 1, 2, . . . , 6, t = 1, 2, 3. - Utilizando for e if, crear una matriz 5 5 llamada C tal que la diagonal principal sean todo unos, los valores por encima de la diagonal sean 2 y los valores por debajo sean 0.

>> n=0; >> while n2 < 50 disp(n); n=n+2; end Al comenzar el while, lo primero que se hace es comprobar la condicin o 2 lgica. En este caso, dado que n = 0, es cierto que n < 50, y por lo tanto se o continua realizando las operaciones, hasta llegar al end. En ese momento, se vuelve al principio del bucle. Se vuelve a comprobar la condicin y si sigue o siendo verdadera, se contina, etc. u El comando break nos saca del bucle5 . El contenido del bucle while siempre debe terminar en un end. Se puede hacer que el bucle se repita indenida5

Dado que puede haber bucles dentro de bucles (tanto for como while), un comando

20

Ejercicio 7: Algoritmo para hallar la ra cuadrada usando for e if: z Para cualquier valor de > 0, la sucesin o x1 = , xn = 1 xn1 + xn1 (n = 2, 3, . . .) 2 tiende a cuando n . - Crear una funcin que calcule la mediante este algoritmo. Para o ello, usar un bucle for que guarde en un vector x la sucesin xn hasta o n = 10. Hallar el error relativo que se comete al aproximar por x10 , es decir err = | x10 |/ - Crear una nueva funcin similar a la anterior, salvo que ahora o le pedimos al programa que si, para algn m < 10 se cumple u 3 |xm1 xm |/xm < 10 , el bucle se pare y nos d como resultado xm . e

mente (hasta encontrar un break) si se comienza con while 1. El ejercicio 8 es util para familiarizarse con el uso de while. Ya conocemos todos los elementos necesarios para programar distintos algoritmos para resolver problemas matemticos. En el ejercicio 9, se ve un a ejemplo de resolucin numrica de una ecuacin diferencial ordinaria. Antes, o e o veamos el comando input que ser util en este ejercicio. a

6

Representaciones grcas a

Matlab contiene herramientas para crear grcas de distintos tipos a partir abreak hace abandonar el bucle ms interno. Un ejercicio instructivo es comprender el a resultado de los siguientes comandos. A=zeros(4); for m=1:4 for n=1:4 if n>m break end A(m,n)=1; end end

21

Ejercicio 8: While: - Reescribir el ejemplo dado en el texto para while, pero cambiando el orden de las dos l neas dentro del bucle. Comprobar que el resultado es distinto y entender por qu. e - Reescribir la ultima funcin que se ped en el ejercicio 7, pero ahora o a usando un bucle while. El comando input: input se usa para pedir que se introduzca algn dato por teclado. Por ejemplo, u si escribimos: h=input(h=) se escribe en pantalla lo que est dentro del parntesis, es decir a e h= y despus el programa espera a que introduzcamos un nmero, que ser asige u a nado a h. de vectores o matrices. Tambin permite darles formato (cambiar colores, e escribir leyendas o anotaciones, etc). Vemos a continuacin una breve ino troduccin a cmo crear y modicar grcas. Veremos las rdenes tal como o o a o se pueden dar a travs de la l e nea de comandos, pero todas las opciones se pueden encontrar tambin usando los mens en la propia ventana en que se e u crea la grca. a

6.1

Grcas en 2D a

Crear una grca a Supongamos que quiero representar y = sin(t) en el intervalo t [0, 2]. t2 +1 La idea es generar una cantidad de puntos tk , yk = sin(tk ) en dicho intervalo t2 +1 k y representarlos interpolando entre ellos mediante l neas rectas. Escribamos >> t = 0 : pi/100 : 2 pi; >> y = sin(t)./(t. 2 + 1); >> plot (t, y); Se abre una nueva ventana con esta grca. Si se quieren usar ejes en a 22

Ejercicio 9: Resolucin numrica de una ecuacin diferencial ordinaria: o e o Queremos resolver numricamente la ecuacin e o ty dy = dt 2 en el intervalo [0, 2], con la condicin inicial y(t = 0) = 1. Se pide aproximar o numricamente el valor de y(t = 2) y calcular el error cometido con respecto e al resultado exacto y(t = 2) = 3 e1 . - Realizar el clculo utilizando el mtodo de Euler. Como posible gu a e a, se pueden seguir los pasos detallados a continuacin: o 1. Creamos un archivo ejercicio9a.m. En primer lugar, que nos pregunte el tamao del paso h, utilizando el comando input. n 2. Crear un vector con los valores de t entre 0 y 2 separados por h y un vector y de la misma longitud que t y tal que su primera entrada sea uno (correspondiendo a la condicin inicial). o 3. Crear una funcin que nos d f (t, y) = o ety . 2

4. Escribir un bucle for tal que se va calculando paso a paso el valor de y(n) con y(n + 1) = y(n) + hf (t(n), y(n)). 5. Extraer el valor de y que corresponde a t = 2 y calcular la diferencia con el resultado exacto. Mostrar por pantalla el valor de y(t = 2) calculado y el error respecto al resultado exacto. 6. Repetir el clculo con distintos valores de h (por ejemplo 1, 0.5, a 0.25, 103 , 106 ). - Repetir el clculo usando el mtodo de Heun y el mtodo de Rungea e e Kutta de orden 4.

escala logar tmica, se pueden usar los siguientes comandos en lugar de plot: loglog( ), semilogx( ), semilogy( ). Representacin simultnea de varias grcas o a a Se pueden representar varias grcas en la misma gura. Supongamos a

23

que queremos aadir una representacin de z = n o Escribamos: >> >> >> >> z = cos(t)./(t. 2 + 1); hold on plot(t,z); hold o;

cos(t) t2 +1

al ejemplo anterior.

Si no escribisemos hold on, se borrar la grca y(t) que hab e a a amos pintado antes. De esta forma, la segunda grca se pinta manteniendo la primera. a Tambin se puede dividir la ventana en subgrcas usando el comando e a subplot(m,n,p), donde m es el nmero de las de subventanas, n es el nmero u u de columnas de subventanas y p el nmero de subventana que queremos u activar. Vase el siguiente ejemplo (manteniendo las deniciones de t, y, z e dadas ms arriba). a >> >> >> >> subplot(2,1,1); plot(t,y); subplot(2,1,2); plot(t,z);

Finalmente, es posible tener varias guras abiertas al mismo tiempo. Para ello, escribir >> gure Para activar una de las distintas guras abiertas, se usa gure (n) donde n es el nmero de ventana correspondiente. u Algunas opciones: colores, ejes y t tulo de la grca a Matlab dispone de mltiples opciones para modicar el aspecto de las u grcas. Veamos algunas de las ms importantes. Dentro del propio comando a a plot se pueden introducir las siguientes opciones Los colores posibles son cian (c), magenta (m), amarillo (y), rojo (r), verde (g), azul (b), blanco (w), negro (k). El estilo de l nea puede ser continuo (-), discontinuo (- -), punteado (:), con guiones y puntos (-.). Se pueden marcar los puntos que se han usado para la interpolacion con +, o, * x. o 24

Por ejemplo: >> plot(t,y, r--) Una vez creada la grca se puede elegir de dnde a dnde van los ejes a o o escribiendo >> axis([xmin xmax ymin ymax]) , o aadir etiquetas a los ejes n >> xlabel(t) >> ylabel(y) o ponerle un t tulo a la gura: >> title(y(t)) Ejercicio 10: Representar en una misma ventana dos grcas una al lado de la otra. En a 2 x2 la primera, representar y(x) = e en rojo y z(x) = 0.5ex /2 en verde para x [3, 3], con el t tulo gaussianas. En la segunda grca, pintar con l a nea de puntos s(t) = 2 + 3t2 en t [0, 5] y aadir etiquetas en los ejes. n Ejercicio 11: Representar en la misma grca las aproximaciones de Euler y de Rungea Kutta halladas en el ejercicio 9 (usar h = 0.5), marcando los puntos intermedios y unindolos mediantes l e neas continuas. Representar en la misma grca el resultado exacto de la integracin y(t) = 3et/2 2 + t. Distinguir a o con diferentes colores las tres grcas. a

6.2

Grcas en 3D a

Veamos brevemente que tambin se pueden representar funciones de dos vae riables en grcas tridimensionales. Supongamos que queremos representar a z = sin ( x) sin (3 y) para x [0, 1], y [0, 1]. Har amos lo siguiente: 25

>> >> >> >> >>

x=0:0.01:1; y=0:0.01:1; [X,Y]=meshgrid (x,y); Z= sin (pi * X) .* sin(3*pi*Y); surf(X,Y,Z);

Es importante usar el comando meshgrid que crea las matrices del orden adecuado para la evaluacin de la funcin en cada punto. o o Hay otros tipos de grcas en 3D y tambin se pueden hacer animaa e ciones. No veremos esto aqu a este respecto se pueden consultar los ma, nuales [1],[2],[3].

7

Polinomios

>> pol1 =[1 0 0 -3 1 -5]

Un polinomio puede ser representado mediante un vector donde se almacenan los diferentes coecientes, comenzando por el de orden ms alto. Por ejemplo, a 5 2 tomemos p(x) = x 3x + x 5. Podemos escribir:

Es posible realizar diversas operaciones con el polinomio. Por ejemplo, si lo queremos evaluar en x = 2.5, escribimos >> polyval(pol1 ,2.5) Podemos hallar sus ra ces: >> roots(pol1) Lo podemos derivar e integrar: >> polyder(pol1) >> polyint(pol1, K) donde en la ultima l nea K ser la constante de integracin. a o Tambin podemos multiplicar y dividir polinomios. Denamos e >> pol2 =[1 0 1] El comando >> conv(pol1,pol2) nos da la multiplicacin mientras que o >> [c r]=deconv(pol1,pol2) nos da el cociente (c) y el resto (r). 26

8

Salvar datos e imgenes a

Salvar y cargar datos (save, load) Mientras trabajamos en una sesin de Matlab, vamos otorgando valores a o diferentes variables que se van almacenando en el workspace. Podemos salvar estos valores en un archivo con la extensin .mat para ser utilizados en una o sesin posterior utilizando el comando save. Como ejemplo, hagamos lo siguo iente: abrimos la ventana workspace para ver qu variables estn denidas. e a Escribamos: >> save datos hoy Se genera un archivo datos hoy.mat en el directorio actual que guarda todos los valores del workspace (se podr guardar slo parte de ellos esan o pecicando las variables elegidas). Si ahora escribimos >> clear podemos comprobar que el workspace se vac Y si ahora escribimos a. >> load datos hoy podemos comprobar que recuperamos los valores anteriores en el workspace. Tambin es posible cargar datos generados fuera de Matlab. Por ejeme plo, si creamos un archivo de texto con el nombre AAA.dat con el siguiente contenido 1234 5678 y si ahora escribimos >> load AAA se genera una matriz AAA con los valores dados arriba. Por ultimo, men cionar que podemos tambin salvar los datos de forma que puedan ser le e dos fuera de Matlab. Por ejemplo: >> save datos hoy 2 -ascii Salvar imgenes a En la seccin 6, vimos cmo generar grcos. Podemos imprimir o salvar o o a estas grcas en archivos con diferentes formatos. Lo ms sencillo es hacerlo a a a travs de las pestaas en la ventana de la gura. Por ejemplo, podemos e n introducir una grca generada en Matlab en este texto, ver la gura 8. a

27

Oscilador armnico cuntico 0.8 0.6 0.4 0.2 psi 0 0.2 0.4 0.6 0.8 4

3

2

1

0 x

1

2

3

4

Figure 1: Se representan las funciones de onda de los tres autoesta1/4 x2 /2 dos a o cu e , 1 = ms bajos del oscilador armnico x2antico 0 = 2 2 1/4 x ex /2 , 2 = (2x2 1) 1/4 e /2 / 2. Esta gura ha sido generada con Matlab y salvada en formato .eps Ejercicio 12: - Crear la grca de la gura 8 y salvarla en formato .pdf a El comando exist: Finalizamos estas notas mencionando un comando bastante util. Despus de e denir distintas funciones, scripts y variables, uno corre el riesgo de reutilizar un s mbolo sin darse cuenta. Para comprobar si un s mbolo est denido a usamos exist. Por ejemplo >> exist f nos devolver 0 si f no est denido, 1 si es una variable en el workspace, 2 a a si es un M-le, 7 si es un directorio, etc. (consultar el help para ver la lista completa de posibilidades)

28

A

Apndice: Glosario de los comandos Mate lab que han aparecido en estas pginas a

En este apndice se compilan por orden alfabtico, a modo de gu los coe e a, mandos de Matlab que han aparecido en estas notas que son una pequea n parte de todos los comandos existentes. Se da una breve descripcin de cada o comando y se dice dnde se puede hallar por primera vez en el texto. Se o debe tener en cuenta que se dan descripciones someras sin explicar todas las posibilidades asociadas a cada comando. Para una descripcin detallada y o completa, se debe usar la ayuda del programa con el comando help. - abs: Calcula el valor absoluto, ver seccin 2. o - axis: Permite delimitar los valores en cada eje que se gracan en una gura, ver seccin 6. o - break : Finaliza la ejecucin de un bucle for o while , ver seccin 5. o o - clear: Elimina variables o funciones de la memoria, ver seccin 4. o - conv: Multiplica polinomios , ver seccin 7. o - deconv: Divide polinomios, ver seccin 7. o - det: Calcula el determinante de una matriz, ver seccin 2. o - diag: Extrae la diagonal de una matriz o crea una matriz diagonal, ver seccin 2. o - disp : Muestra su argumento por pantalla, ver seccin 5. o - eig: Calcula los autovalores y autovectores de una matriz, seccin 2. o - else: En un entorno if, ordena ejecutar los comandos siguientes siempre y cuando no se haya cumplido ninguna de las condiciones anteriores, ver seccin 5. o - elseif: En un entorno if, cuando las condiciones previas no se han cumplido, permite introducir una nueva condicin y supeditar a su o cumplimiento la ejecucin de los siguientes comandos, ver seccin 5. o o

29

- end: Finaliza el alcance de bucles for, while o condicionantes if, ver seccin 5. o - exist: Permite conocer si un s mbolo corresponde a alguna variable o funcin que haya sido denida, ver seccin 8. o o - eye: Crea una matriz con unos en la diagonal principal y el resto ceros, ver seccin 2. o - figure: Crea una nueva ventana de gura o permite elegir cul de las a ventanas abiertas est activa, ver seccin 6. a o - find: Encuentra los elementos de una matriz que cumplen una condicin o lgica, ver seccin 2. o o - for: Sirve para crear bucles en que ciertos comandos se repiten un nmero espec u co de veces, ver seccin 5. o - function: Se usa para crear nuevas funciones, ver seccin 4. o - global: Permite utilizar en el workspace variables creadas dentro de una funcin y viceversa, ver seccin 4. o o - hold: Permite mostrar distintas grcas en la misma gura, usando a hold on, hold o , ver seccin 6. o - if: Permite supeditar la ejecucin de una serie de comandos al cumo plimiento de una condicin lgica, ver seccin 5. o o o - imag: Extrae la parte imaginaria, ver seccin 4. o - input: Requiere la introduccin de un dato por teclado, ver seccin 5. o o - inv: Calcula el inverso de una matriz cuadrada, ver seccin 2. o - isequal: Comprueba si dos matrices son iguales, ver seccin 5. o - length: Devuelve el nmero de elementos de un vector, seccin 2. u o - load: Carga datos al workspace, ver seccin 8. o - log: Calcula el logaritmo neperiano, ver seccin 4. o

30

- loglog: Crea una grca con escala logar a tmica en ambos ejes, ver seccin 6. o - log10: Calcula el logaritmo en base diez, ver seccin 4. o - meshgrid: A partir de dos vectores que dan los valores discretos de dos variables, genera las matrices necesarias para posteriormente realizar una grca 3D, ver seccin 6. a o - ones: Crea una matriz de unos, ver seccin 2. o - plot: Pinta una grca (vector vs. vector), ver seccin 6. a o - polyder: Deriva un polinomio, ver seccin 7. o - polyint: Integra un polinomio, ver seccin 7. o - polyval: Evala un polinomio para cierto valor de la variable, ver u seccin 7. o - prod: Calcula el producto de los elementos de un vector o de cada columna de una matriz, ver seccin 2. o - rand: Genera nmeros aleatorios entre 0 y 1, con una distribucin u o plana, ver seccin 2. o - randn: Genera nmeros aleatorios siguiendo una distribucin normal u o de media cero y desviacin t o pica uno, ver seccin 2. o - real: Extrae la parte real, ver seccin 4. o - roots: Halla las ra de un polinomio, ver seccin 7. ces o - round: Redondea al entero ms cercano, ver seccin 4. a o - save: Salva datos del workspace para ser utilizados en otras sesiones con Matlab o para ser exportados a otros programas, seccin 8. o - semilogx : Crea una grca con escala logar a tmica en el eje horizontal, ver seccin 6. o - semilogy: Crea una grca con escala logar a tmica en el eje vertical, ver seccin 6. o 31

- sign : Devuelve el signo de un nmero, ver seccin 4. u o - size: Da el nmero de las y columnas de una matriz, ver seccin 2. u o - sqrt: Evala la ra cuadrada, ver seccin 4. u z o - subplot: Divide una grca en subgrcas, ver seccin 6. a a o - sum: Calcula la suma de los elementos de un vector o de cada columna de una matriz, ver seccin 2. o - surf: Crea un grco tridimensional, ver seccin 6. a o - title: Pone t tulo a una grca, ver seccin 6. a o - transpose: Calcula el traspuesto de una matriz, ver seccin 2. o - while: Sirve para crear bucles en que ciertos comandos se repiten mientras se cumple cierta condicin lgica, ver seccin 5. o o o - xlabel: Pone una etiqueta al eje horizontal de una grca, seccin 6. a o - ylabel: Pone una etiqueta al eje vertical de una grca, ver seccin 6. a o - zeros: Crea una matriz de ceros, ver seccin 2. o

References[1] J. Garc de Jaln, J. I. Rodr a o guez, J. Vidal, Aprenda Matlab 7.0 como si estuviera en primero, Madrid, 2005 http://mat21.etsii.upm.es/ayudainf/aprendainf/Matlab70/matlab70primero.pdf [2] Matlab 7: Getting Starte Guide http://www.mathworks.com/help/pdf doc/matlab/getstart.pdf [3] Matlab: The Language of Technical Computing http://www.fsa.ucl.ac.be/help/techdoc/pdfdocs/getstart.pdf [4] J. A. Infante del R y J. M. Rey Cabezas Mtodos numricos: teor o e e a, a problemas y prcticas con Matlab, 2 ed., Pirmide (2002). a a [5] J. H. Mathews and K. D. Fink Mtodos numricos con Matlab, 3a e e ed., Prentice Hall (2000). 32