práctica 04 funciones, bucles y bifurcaciones

Anuncio
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
Descargar