2 Uso de las funciones max, min y find 3 3 Resolucin del sistema de ecuaciones Ax=b con incgnitas en x y en b 5
Esta prctica tiene como finalidad empezar a familiarizarse con Matlab. Los primeros ejercicios contenidos en esta prctica son fciles. En las siguientes se oirn complicando poco a poco. Si no da tiempo en la sesin de clase, conviene realizar todos los ejercicios de este guin en casa. Es conveniente que todo el contenido de la prctica se guarde en un directorio cuyo nombre podra ser Practica1 (no conviene incluir caracteres en blanco en los nombres de los ficheros), que deber estar contenido en el de trabajo creado al inicio del curso (MatLab). A continuacin arranque Matlab y haga que el directorio activo sea el directorio que acaba de crear. El comando que habr que utilizar es el siguiente: AAETSII cd g:/MatLab/Practica1 Conviene comprobar que el directorio activo es el correcto utilizando el comando pwd (de print working directory): AAETSII pwd Antes de empezar a realizar los distintos ejercicios de la prctica es conveniente ejecutar el comando: AAETSII diary on (o, si se prefiere, diary > Practica1.txt) Esta instruccin hace que se almacenen en un fichero de texto llamado diary (alternativamente Practica1.txt), en el directorio activo, todas las acciones que el usuario va realizando con Matlab. Exactamente lo que se almacena son las sentencias que el usuario teclea y ejecuta y la correspondiente respuesta de Matlab. Generar este fichero es interesante pues permite saber el trabajo que se ha realizado durante la prctica. Para poder acceder a l desde cualquier editor de textos es necesario ejecutar el comando AAETSII diary off 1. Utilizacin del operador dos puntos (:) El operador dos puntos (:) es muy importante en Matlab. Se utiliza en primer lugar para indicar rangos de una variable segn el esquema [xini:incremento:xfinal]. En este ejercicio se va a hacer nfasis en el segundo de los usos: extraer filas y columnas de una matriz. Se va a utilizar junto con el direccionamiento indirecto, que consiste en acceder a los elementos de un vector o matriz por medio de los ndices contenidos en uno o ms vectores. Se trata en primer lugar de ejecutar en Matlab los siguientes comandos observando el resultado: AAETSII A=magic(6) A = 35 1 6 26 19 24 3 32 7 21 23 25 31 9 2 22 27 20 8 28 33 17 10 15 30 5 34 12 14 16 4 36 29 13 18 11 Para extraer las filas 2, 3 y 4 se utiliza el comando: AAETSII A(2:4,:) Prctica 1 Introduccin a MatLab pgina 2 ans = 3 32 7 21 23 25 31 9 2 22 27 20 8 28 33 17 10 15 En este caso el primer (:) se utiliza para establecer un rango, mientras que el segundo indica "todas las columnas" o "todos los elementos de la fila correspondiente". Para extraer filas no consecutivas se utiliza un vector con los ndices de las filas a extraer: AAETSII A([1,3,6],:) ans = 35 1 6 26 19 24 31 9 2 22 27 20 4 36 29 13 18 11 o bien, como forma alternativa: AAETSII in=[1,3,6], A(in,:) in = 1 3 6 ans = 35 1 6 26 19 24 31 9 2 22 27 20 4 36 29 13 18 11 Es muy fcil construir expresiones anlogas para columnas, en lugar de filas. Ejecutar como ejercicio los siguientes comandos (se omite la salida): AAETSII A(:,[1,3,6]) AAETSII A(:,[1:4]) Para extraer los elementos que estn en unas filas y columnas determinadas se utilizan dos vectores de ndices, como en el siguiente ejemplo: AAETSII ifil=[1:3], icol=[1,2,6], A(ifil,icol) ifil = 1 2 3 icol = 1 2 6 ans = 35 1 24 3 32 25 31 9 20 Mediante el operador dos puntos (:) el direccionamiento indirecto a travs de vectores de ndices no slo se utiliza para extraer elementos de una matriz; tambin se pueden utilizar a la izquierda de una asignacin (operador =) para modificar selectivamente una parte de un vector o una matriz. Por ejemplo, para hacer cero las filas 1 y 3 de la matriz: AAETSII B=A; B([1,3],:)=zeros(2,6) B = 0 0 0 0 0 0 3 32 7 21 23 25 0 0 0 0 0 0 8 28 33 17 10 15 30 5 34 12 14 16 4 36 29 13 18 11 En este caso es muy importante que los tamaos de las matrices que aparecen a ambos lados del operador (=) sean iguales; si no lo son, Matlab da un mensaje de error (buscar un ejemplo en el que se produzca esta situacin). Para modificar slo los elementos de ciertas filas y columnas se procede como se sigue: AAETSII C=A; C([1:3],[2,5,6])=-10*ones(3) Prctica 1 Introduccin a MatLab pgina 3 C = 35 -10 6 26 -10 -10 3 -10 7 21 -10 -10 31 -10 2 22 -10 -10 8 28 33 17 10 15 30 5 34 12 14 16 4 36 29 13 18 11 Es muy importante la forma que utiliza Matlab para borrar filas y columnas de una matriz, consistente en asignar la matriz vaca [] a las filas o columnas que se desean eliminar. Matlab no permite borrar ms que filas o columnas completas. Obsrvese el siguiente ejemplo: AAETSII C(1:3,:)=[] C = 8 28 33 17 10 15 30 5 34 12 14 16 4 36 29 13 18 11 Realizar el siguiente ejercicio: Dado el conjunto de ndices de un vector x de dimensin n (in=[1:n]), y un subconjunto in1 de ndices de los elementos que cumplen una determinada condicin, hallar el subconjunto in2 complementario de in1. Utilizar como ejemplo la siguiente sentencia de partida: AAETSII in=[1:10], in1=[1,6,7] in = 1 2 3 4 5 6 7 8 9 10 in1 = 1 6 7
Realizar el siguiente ejercicio: Extraer las filas pares y las filas impares de una matriz. Utilizar la matriz A definida al principio.
Realizar el siguiente ejercicio: Generar las potencias cbicas de los 15 primeros nmeros impares.
Realizar el siguiente ejercicio: Generar las potencias cbicas de los 15 primeros mltiplos de 3. 2 Uso de las funciones max, min y find Las funciones max, min y find tienen una gran importancia en Matlab. El objetivo de este ejercicio es practicar un poco con ellas. Las funciones max y min son funciones vectoriales. Cuando actan sobre una matriz se aplican a cada columna por separado y dan como resultado un vector con los resultados de su aplicacin a cada columna. Por ejemplo, frmese una matriz A=magic(6) y aplquese las funciones max y min: AAETSII A=magic(6) A = 35 1 6 26 19 24 3 32 7 21 23 25 31 9 2 22 27 20 8 28 33 17 10 15 30 5 34 12 14 16 4 36 29 13 18 11 AAETSII max(A) ans = 35 36 34 26 27 25 AAETSII min(A) ans = 3 1 2 12 10 11 Si se desea calcular el mximo elemento de toda la matriz basta volver a aplicar la funcin max al vector de mximos de columnas que resulta: AAETSII max(max(A)) Prctica 1 Introduccin a MatLab pgina 4 ans = 36 Las funciones max y min se pueden utilizar con dos valores de retorno y en ese caso devuelven tambin la posicin que el mximo o el mnimo ocupaba en el vector original. A continuacin el alumnos deber calcular el valor minimo, la fila fmin y columna cmin del mnimo elemento de la matriz A. Estas operaciones se debern hacer en una nica lnea de comandos, separando los distintos comandos por comas. Se recomienda abrir la ventana Help Window de Matlab y buscar la informacin correspondiente a la funcin min. La funcin find permite hallar los ndices de los elementos de un vector o matriz que cumplen una determinada condicin. Por ejemplo, para saber los elementos de la matriz A=magic(6) que tienen un valor mayor que 30 se puede utilizar la sentencia: AAETSII A=magic(6), i=find(A>30) A = 35 1 6 26 19 24 3 32 7 21 23 25 31 9 2 22 27 20 8 28 33 17 10 15 30 5 34 12 14 16 4 36 29 13 18 11 i = 1 3 8 12 16 17 Si el resultado de find se recoge en un nico valor de retorno, se devuelve la posicin de los elementos que cumplen la condicin especificada considerando que la matriz se almacena como vector, por columnas. Por ejemplo, el valor 8 en una matriz 66 es el segundo elemento de la segunda columna. Si se recogen dos valores de retorno, se devuelven los ndices de fila y de columna que cumplen la condicin especificada. Ejecutar como ejemplo la sentencia: AAETSII A=magic(6), [i,j]=find(A>30) El resultado de la funcin find puede ser utilizado para realizar determinadas operaciones sobre una matriz. Por ejemplo, si en la matriz A=magic(6) se desea dar un valor 100 a todos los elementos que tienen un valor mayor que 25 se puede utilizar la sentencia: AAETSII A=magic(6); in=find(A>25); A(in)=100 A = 100 1 6 100 19 24 3 100 7 21 23 25 100 9 2 22 100 20 8 100 100 17 10 15 100 5 100 12 14 16 4 100 100 13 18 11 Tambin se podra utilizar find para localizar la posicin del mximo elemento de una matriz, como por ejemplo con la sentencia: AAETSII A=magic(6); maximo=max(max(A)), [fmax,cmax]=find(A==maximo) maximo = 36 fmax = 6 cmax = 2 Como aplicacin final, se pide crear una matriz aleatoria 1010 tal que todos los elementos menores que 0.2 se hagan cero y todos los elementos mayores que 0.8 se hagan 1. Prctica 1 Introduccin a MatLab pgina 5 3 Resolucin del sistema de ecuaciones Ax=b con incgnitas en x y en b Los sistemas de ecuaciones lineales Ax=b, donde A y b son conocidos y x es el vector de incgnitas, no siempre se presentan en esta forma tan sencilla. Es frecuente en ingeniera encontrar sistemas en los cuales ni todos los elementos de b son conocidos, no todos los de x desconocidos; siempre se verifica sin embargo que si un elemento de b es conocido el correspondiente elemento de x es desconocido y viceversa. Un sistema de ecuaciones de estas caractersticas se puede escribir en la forma:
11 12 1 1 21 22 2 2 ( y conocidos, y desconocidos) ( = ` ` ( ) ) 2 1 1 2 A A x b x b x b A A x b (2.1) Se supone que los vectores in1 e in2 contienen los ndices de filas (y de columnas) de las dos particiones. Los ndices no tienen por qu ser consecutivos. Resolver el sistema (2.1) es fcil expandiendo dicha ecuacin:
11 1 12 2 1 + = A x A x b (2.2)
21 1 22 2 2 + = A x A x b (2.3) En la ecuacin (2.2) todo es conocido excepto x 1 que puede ser hallado a partir de esta ecuacin. Una vez que x 1 ha sido calculado, la ecuacin (2.3) permite calcular b 2 , con lo que el problema est totalmente resuelto. En base a lo que se acaba de exponer, crear un fichero llamado sistemaConDesc.m que realice las siguientes operaciones: 1. Borrar todas las variables y funciones del espacio de trabajo con clear all. 2. Dar valor al tamao del sistema de ecuaciones (por ejemplo n=6). 3. Crear una matriz aleatoria A, simtrica y definida-positiva, de tamao nn. Esto se puede hacer creando una matriz cuadrada aleatoria y multiplicndola por su traspuesta. 4. Crear el vector de ndices in2 con m elementos (m<n), por ejemplo in2=[1,4,6]; Este vector indica la particin correspondiente a x 2 y b 2 . 5. Crear el vector de ndices in1 complementario de in2. 6. Crear dos vectores x y b, de tamao n1, con la funcin zeros. Mediante la funcin rand y utilizando direccionamiento indirecto, dar un valor aleatorio a los elementos conocidos de x y b, que son x(in2) y b(in1), respectivamente. 7. Mediante la ecuacin (2.2) aplicada con direccionamiento indirecto, calcular el vector x(in1) utilizando el operador (\). 8. Mediante la ecuacin (2.3) calcular el vector b(in2). 9. Comprobar finalmente que todo es correcto calculando e imprimiendo por consola la norma del residuo r=Ax-b. 10. Hacer n=100 y comprobar de nuevo que el resultado es correcto. Nota: No hay que crear ninguna submatriz de A, ni de los vectores x y b; se debe utilizar siempre el direccionamiento indirecto.