4ª Práctica. Matlab Página 1 PROGRAMACIÓN EN MATLAB PRÁCTICA 04 FUNCIONES, BUCLES Y BIFURCACIONES EJERCICIO 1. EJERCICIO 1.1 EJERCICIO 1.2 EJERCICIO 1.3 EJERCICIO 2. EJERCICIO 2.1 EJERCICIO 2.2 EJERCICIO 3. EJERCICIO 3.1 QUE OCUPA EJERCICIO 3.2 EJERCICIO 3.3 EJERCICIO 4. EJERCICIO 4.1 EJERCICIO 5. EJERCICIO 5.1 EJERCICIO 5.2 EJERCICIO 5.3 CREACIÓN DE UNA FUNCIÓN_____________________________________1 FUNCIÓN QUE OBTIENE LAS RAÍCES DE UN POLINOMIO DE SEGUNDO GRADO ______2 FUNCIÓN QUE SUMA DOS NÚMEROS ____________________________________2 CONVERSIÓN DE COORDENADAS POLARES A COORDENADAS CARTESIANAS ______3 BUCLES FOR_____________________________________________________3 SUMA DE LOS ELEMENTOS DE UN VECTOR ________________________________4 CÁLCULO DEL FACTORIAL DE UN NÚMERO MEDIANTE UN BUCLE FOR __________4 BIFURCACIONES IF ______________________________________________5 OBTENCIÓN DEL MÁXIMO VALOR DE LOS ELEMENTOS DE UN VECTOR Y LA POSICIÓN 5 FUNCIÓN PARA DETERMINAR SI DOS NÚMEROS SON DIVISIBLES ENTRE SI ________5 FUNCIÓN QUE DEVUELVE EL RESTO DE UNA DIVISIÓN ENTERA ________________6 BUCLES WHILE __________________________________________________6 CÁLCULO DEL FACTORIAL DE UN NÚMERO MEDIANTE UN BUCLE WHILE _______6 TRABAJAR CON MATRICES ______________________________________7 SUMA DE MATRICES ________________________________________________7 MEJORA DEL EJERCICIO 5.1 ________________________________________7 TRASPUESTA DE UNA MATRIZ _________________________________________7 En primer lugar crea un directorio llamado Practica04 dentro de G:\Informatica1. En este directorio deberás guardar todos los ficheros y todo el trabajo resultante de esta práctica. De esta forma te será fácil encontrarlo más adelante, si te hace falta. Después arranca el programa MATLAB y coloca como directorio de trabajo o directorio activo el directorio creado previamente. Para ello basta con teclear en la ventana de comandos de MATLAB: »cd g:\Informatica1\Practica04 O bien hacerlo a través de la ventana Current Directory. En ella podrás ver el contenido del directorio. Siempre que no se especifique algo en el enunciado, el cómo realizarlo se deja a la libre elección del alumno. Esto es extensible a todas las prácticas y exámenes que realicemos durante el curso. EJERCICIO 1. CREACIÓN DE UNA FUNCIÓN A estas alturas, usted ya ha utilizando funciones de Matlab. Por ejemplo, en la práctica 3 ha utilizado la sentencia inv(A), en donde se calculaba la inversa de A. Si observa detenidamente el proceso, se dará cuenta de que sucede algo así como cuando mete una moneda en una máquina de tabaco. Usted le da una cosa a la máquina (2 €)1 y ésta le devuelve otra cosa (un paquete de Fortuna con 19 cigarrillos). En el caso de 1 Esto era cierto hasta el 16 de Mayo de 2004. Escuela Superior de Ingenieros de San Sebastián – Universidad de Navarra Informática 1 y Fundamentos de Computadores Página 2 la función inv lo que usted aporta es una matriz y lo que la máquina le devuelve es la inversa de esa matriz. A lo que se aporta se le llama Argumentos de entrada y lo que devuelve se le llama Valores de retorno o Argumentos de salida. En el caso de la función inv el número de argumentos de entrada era de uno (la matriz de la que se quiere obtener su inversa), pero hay otras funciones que requieren más de un argumento de entrada, como la función power(A,B) que lo que hace es elevar A a la potencia B (AB). Del mismo modo, la función inv aporta un único valor de retorno (la inversa de la matriz) pero las hay que devuelven más de un valor, como la función size(A), que tiene dos valores de retorno, como son el número de filas y el número de columnas de la matriz A. Conocer cuáles son los argumentos de entrada y de salida de una función es VITAL, ya que, en realidad, es lo único importante que hay que saber de una función. Tanto es así que si escribe por ejemplo: >>help size, lo único de lo que se habla es de cuáles son los argumentos de entrada y de salida. EJERCICIO 1.1 Función que obtiene las raíces de un polinomio de segundo grado Cree un nuevo subdirectorio que se llame Ejercicio0101 y sitúe el directorio de trabajo de Matlab dentro de él. A continuación vamos a realizar una función que calcule las raíces de un polinomio de segundo grado. Esta función necesitará 3 argumentos de entrada (los valores a, b y c del polinomio) y 2 de salida (las dos raíces del polinomio). Guarde las siguientes instrucciones en un archivo llamado FuncionRaicesEcuacion.m, y compruebe que funciona: function [x1,x2]=FuncionRaicesEcuacion(a,b,c) x1=(-b+(b^2-4*a*c)^.5)/(2*a) x2=(-b-(b^2-4*a*c)^.5)/(2*a) Pruebe la función programada para los siguientes casos: a=1; b=3; c=2; Resultado: 2 raíces reales distintas. a=1; b=2; c=1; Resultado: 2 raíces reales iguales. a=1; b=1; c=1; Resultado: 2 raíces imaginarias. Observe como, al tener más de un argumento de salida, en el encabezado de la función se escriben los argumentos de salida entre corchetes. EJERCICIO 1.2 Función que suma dos números Cree un nuevo subdirectorio que se llame Ejercicio0102 y sitúe el directorio de trabajo de Matlab dentro de él. Desarrolle ahora una función que tenga como argumentos de entrada dos números y como argumento de salida la suma de esos dos números. Guarde el programa en un fichero llamado CalcularSuma.m. El encabezado de la función debe ser: TECNUN 4º Práctica. Matlab Página 3 function s= CalcularSuma (a,b) Observe que esta función tiene dos argumentos de entrada (a y b) y un argumento de salida (s). EJERCICIO 1.3 Conversión de coordenadas polares a coordenadas cartesianas Cree un nuevo subdirectorio que se llame Ejercicio0103 y sitúe el directorio de trabajo de Matlab dentro de él. Elabore una función en Matlab que convierta las coordenadas polares (ρ,θ) de un punto, en coordenadas cartesianas (x,y). El encabezado de la función debe ser: function [x,y]=DePolarACartesiana(r,t) Donde r es ρ y t es θ. Nota: (x=ρcos(θ), y=ρsen(θ)). SENTENCIAS DE CONTROL DE FLUJO. Un aspecto importante a tener en cuenta cuando se escribe un programa (no importa en qué lenguaje) lo constituyen las sentencias que permiten realizar saltos entre las diferentes sentencias del programa. Hay casos que lo que se desea es ejecutar un conjunto de sentencias sólo cuando se cumple una cierta condición. Esto se consigue mediante la sentencia if, que representa una BIFURCACIÓN. En una forma u otra, esta sentencia está presente en todos los lenguajes de programación de alto nivel. En otras ocasiones lo que interesa es ejecutar repetidamente un conjunto de sentencias un número fijo de veces, para ello existe la sentencia for; se corresponde con un BUCLE. A veces se desea ejecutar repetidamente un conjunto de sentencias sin conocer el número de veces que se va a ejecutar, para ello existe la sentencia while, que es también un BUCLE. Las bifurcaciones y los bucles constituyen el núcleo de cualquier lenguaje de programación y con esta práctica de MATLAB se nos presenta una magnífica oportunidad para aprender a utilizarlos. EJERCICIO 2. BUCLES FOR El formato de los bucles for en MATLAB es el siguiente: for variable = inicio : paso : final sentencia 1 sentencia 2 … sentencia n end Una de las características principales de los bucles for, la constituye la variable del bucle (variable). Esta variable va tomando valores entre inicio y final de paso en paso. Cada vez que se ejecuta el bucle, variable toma un valor diferente. Al inicio del bucle, variable es igual a inicio. La segunda vez, variable es igual a inicio+paso, y así Escuela Superior de Ingenieros de San Sebastián – Universidad de Navarra Informática 1 y Fundamentos de Computadores Página 4 sucesivamente, hasta que al final variable es igual a final. Si se omite el paso, MATLAB entiende que el paso es igual a uno. Es muy importante mantener unas ciertas cuestiones de estilo de programación. Por eso, deben sangrarse o indentarse adecuadamente todas las sentencias que se ejecuten dentro del bucle, según se ha hecho en el programa anterior. El editor de Matlab lo hace automáticamente. EJERCICIO 2.1 Suma de los elementos de un vector Construya un nuevo subdirectorio que se llame Ejercicio0201 y sitúe, como siempre, el directorio de trabajo de Matlab dentro. En este primer ejercicio se verá una sencilla aplicación de los bucles for. El ejercicio consiste en crear una función de MATLAB llamada CalularSumaVector.m, que sume los elementos de un vector que se pasa por ventana, y un fichero ejercicio0201.m, que contenga el programa principal con la llamada a la función CalularSumaVector. El programa principal debe realizar las siguientes operaciones: 9 Borrar todas las variables mediante la función clear. 9 Generar un vector fila aleatorio (x) de dimensión 5 (ver la función rand) 9 Realizar la suma de los elementos con la nueva función CalularSumaVector y almacenar el resultado en la variable y1 (la llamada desde el programa principal es y1 = CalularSumaVector (x)) La función CalularSumaVector (fichero CalularSumaVector.m) debe ser la siguiente: function s = CalularSumaVector (x) s = 0; n= length(x); for i=1:n s = s + x(i); end Ahora utilice el debugger para ejecutar el programa instrucción a instrucción. La variable del bucle (i) es utilizada en este caso para acceder a los elementos del vector. Tiene por tanto un papel de índice de acceso al vector. La variable s almacena la suma de todos los elementos del vector. Así, inicialmente se hace cero, y a medida que se ejecuta el bucle, va sumando los elementos del vector. Como se ejecuta el bucle tantas veces como la longitud del vector, al final la variable s contiene la suma de todos los elementos del vector x. Es muy importante entender bien este programa tan sencillo, porque este tipo de construcciones se utilizan con muchísima frecuencia. EJERCICIO 2.2 Cálculo del factorial de un número mediante un bucle FOR Construya un nuevo subdirectorio que se llame Ejercicio0202 y sitúe el directorio de trabajo de Matlab dentro. En este ejercicio se deberá construir una función de MATLAB (CalcularFactorial.m), que calcule el factorial de un número que se pasa por ventana. Escriba en un fichero llamado ejercicio0202.m el programa principal con la llamada a la función factorial. El programa principal debe realizar las siguientes operaciones: TECNUN 4º Práctica. Matlab Página 5 9 Borrar todas las variables (ver clear) 9 Pedir por teclado el número (n) del que se desea conocer su factorial (ver función input) 9 Realizar el factorial con una llamada a la función CalcularFactorial creada por uno mismo y almacenar el resultado en la variable y ( es decir, y = CalcularFactorial (n)) Para escribir la función que calcule el factorial conviene tener en cuenta lo siguiente: Como factorial(n) = 1*2*3*4*...*n Variando i desde 1 hasta n sucederá que: Cuando i=1 y = 1 Cuando i=2 y = (1)*2; Cuando i=3 y = (1*2)*3; … Cuando i=n y = (1*2*3*…*n-1)*n; El encabezado de la función será function f= CalcularFactorial (n) Donde n es el número entero del que se quiere calcular el factorial f es el valor del factorial n (valor de retorno de la función) CalcularFactorial es el nombre de la función. EJERCICIO 3. BIFURCACIONES IF EJERCICIO 3.1 Obtención del máximo valor de los elementos de un vector y la posición que ocupa Construya un nuevo subdirectorio que se llame Ejercicio0301 y sitúe el directorio de trabajo de Matlab dentro. Elabore una función en Matlab que devuelva el máximo valor de los elementos de un vector, así como la posición que ocupa dicho elemento dentro del vector. El encabezado de la función debe ser: function [Numero,Posicion]=CalcularMaximo(Vector) Donde Numero es el valor máximo de los elementos del vector, Posicion es la posición que ocupa Numero en el vector y Vector es el vector que se le pasa a la función. EJERCICIO 3.2 Función para determinar si dos números son divisibles entre si Construya un nuevo subdirectorio que se llame Ejercicio0302 y sitúe el directorio de trabajo de Matlab dentro. Escuela Superior de Ingenieros de San Sebastián – Universidad de Navarra Informática 1 y Fundamentos de Computadores Página 6 Dados dos números a y b, siendo a>=b>0, realice una función que devuelva un 1 si b es divisor de a y un 0 si no lo es. Ayúdese realizando previamente un diagrama de flujo Guarde el programa en un fichero llamado EsDivisible.m. El encabezado de la función debe ser: function d=EsDivisible(a,b) EJERCICIO 3.3 Función que devuelve el resto de una división entera Construya un nuevo subdirectorio que se llame Ejercicio0303 y sitúe el directorio de trabajo de Matlab dentro. En este ejercicio vamos a crear una función llamada CalcularResto que se guardará en un fichero llamado CalcularResto.m. Esta función debe probar a dividir a entre b y devolverá el resto de la división. El encabezado de la función será el siguiente: function r=CalcularResto(a,b) Siendo r el resto de la división. EJERCICIO 4. BUCLES WHILE EJERCICIO 4.1 Cálculo del factorial de un número mediante un bucle WHILE Construya un nuevo subdirectorio que se llame Ejercicio0401 y sitúe el directorio de trabajo de Matlab dentro. En este ejercicio se deberá construir una nueva función de MATLAB que recibirá el nombre de CalcularFactorial2. Esta función deberá calcular de nuevo el factorial de un número. La diferencia que tendrá con el EJERCICIO 2.2, realizado anteriormente, es que en lugar de utilizar un bucle for, deberá utilizar un bucle while. El encabezado de la función será function f= CalcularFactorial2(n) Donde n es el número entero del que se quiere calcular el factorial f es el valor de retorno de la función. Se corresponde con el valor del factorial de n CalcularFactorial es el nombre de la función. El contenido del programa será muy parecido en ambos ejercicios con dos diferencias: El proceso se realizará iterativamente mientras que se cumpla la condición de chequeo del bucle: while(i<=n). En el EJERCICIO 2.2, la variable i se incrementaba automáticamente debido a que era la variable del bucle for, ahora hay que incrementarla explícitamente con una instrucción del tipo i=i+1. TECNUN 4º Práctica. Matlab Página 7 EJERCICIO 5. TRABAJAR CON MATRICES EJERCICIO 5.1 Suma de matrices Construya un nuevo subdirectorio que se llame Ejercicio0501 y sitúe el directorio de trabajo de Matlab dentro. En este ejercicio se deberá construir una función de MATLAB (SumaMatrices.m), que calcule la suma de dos matrices, y un fichero ejercicio0501.m, que contenga el programa principal con la llamada a la función SumaMatrices. El programa principal debe realizar las siguientes operaciones: 9 9 9 9 Borrar todas las variables (ver clear) Crear la matriz M1 de dimensión 3x3, con la función magic. Crear la matriz M2 identidad de dimensión 3x3, con la función eye. Realizar la suma de matrices, mediante la función SumaMatrices creada por uno mismo y almacenar el resultado en la variable M3. 9 Para comprobar que la función programada por nosotros mismos calcula de forma correcta la suma entre dos matrices, realizar la suma de las matrices M1 y M2 mediante el operador suma (+) y almacenar el resultado en la variable M4. La función SumaMatrices creada tendrá dos bucles for anidados. Con el primero se recorren todas las filas, y con el segundo, para cada fila, se recorren todas las columnas. EJERCICIO 5.2 Mejora del EJERCICIO 5.1 Construya un nuevo subdirectorio que se llame Ejercicio0503 y sitúe el directorio de trabajo de Matlab dentro. En el EJERCICIO 5.1, se pide programar una función que sume dos matrices que se pasan por ventanilla. Ahora se pide hacer una versión nueva que incluya un paso previo a la suma de las dos matrices M1 y M2. Este paso previo consiste en que el programa cheque si el tamaño de M1 y M2 coincide. En caso de que coincida realizará la suma, pero si no, el nuevo programa debe sacar por pantalla el siguiente mensaje: Error: las dos matrices no se pueden sumar EJERCICIO 5.3 Traspuesta de una matriz Construya un nuevo subdirectorio que se llame Ejercicio0502 y sitúe el directorio de trabajo de Matlab dentro. En este ejercicio se deberá construir una función de MATLAB (CalcularTraspuesta.m), que calcule la traspuesta de una matriz y un fichero ejercicio0502.m, que contenga el programa principal con la llamada a la función CalcularTraspuesta. Escuela Superior de Ingenieros de San Sebastián – Universidad de Navarra