Está en la página 1de 7

Prcticas de MatLab.

Sentencias de Control de flujo

pgina 1

NDICE
EJERCICIO 1. EJERCICIO 1.1 EJERCICIO 1.2 EJERCICIO 1.3 EJERCICIO 1.4 EJERCICIO 2. EJERCICIO 2.1 EJERCICIO 2.2 EJERCICIO 3. EJERCICIO 3.1 BUCLES FOR ................................................................................................................................... 1 SUMA DE LOS TRMINOS DE UN VECTOR ............................................................................................ 2 FACTORIAL DE UN NMERO ............................................................................................................... 3 SUMA DE MATRICES ........................................................................................................................... 3 PRODUCTO DE MATRICES ................................................................................................................... 4 SENTENCIA DE CONTROL DE FLUJO IF ................................................................................ 4 ALGORITMO DE ORDENACIN (BURBUJA).......................................................................................... 4 ORDENAR UNA MATRIZ POR FILAS. .................................................................................................... 6 BUCLES WHILE.............................................................................................................................. 6 MTODO DE LA BISECCIN ................................................................................................................ 6

___________________________________________________________________ En primer lugar crea un directorio llamado Prac02 en tu disco g:\ (si no est ya creado). Despus arranca el programa MATLAB y coloca como directorio de trabajo el creado previamente. Para ello basta con teclear en la ventana de comandos de MATLAB:
cd g:\MatLab\Practica2 (o la letra de unidad que corresponda)

Al igual que en las anteriores prcticas, es conveniente utilizar adecuadamente el comando diary. 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. Por ejemplo se puede desear ejecutar un conjunto de sentencias, slo cuando se cumple una cierta condicin y otro diferente cuando la condicin no se cumple. Esto se consigue mediante la sentencia if, que representa una bifurcacin. Esta sentencia est presente en todos los lenguajes de programacin de alto nivel. En otras ocasiones lo que interesa es ejecutar un conjunto de sentencias un cierto nmero de veces, para ello existe en MATLAB la sentencia for, que representa un bucle. A veces se desea ejecutar un conjunto de sentencias sin conocer el nmero de veces que se va a ejecutar, para ello en MATLAB existe la sentencia while, que representa un tipo de bucle diferente. EJERCICIO 1. BUCLES FOR El formato de los bucles for en MATLAB es el siguiente:
for var = min sentencia sentencia sentencia end : paso : max 1 2 n

Aunque estos bucles for juegan un papel muy importante en la programacin con MATLAB, el hecho de que este potente programa trabaje con vectores hace que a veces no sea necesario recurrir a bucles del tipo for. Por ejemplo, supongamos que se tienen dos vectores x e y, y se desea conocer

Prcticas de MatLab. Sentencias de Control de flujo

pgina 2

el valor de y correspondiente a la posicin que ocupa un valor determinado en el vector x. Una forma de hacerlo sera (crear los ficheros SiFor.m y NoFor.m):
x= 0:0.5:3; y= rand(size(x)); valor= 1.5; for k=1:length(x) %La funcin length(x) devuelve la longitud del vector x if(x(k)==valor) resp=y(k); break end end disp(resp)

Sin embargo resulta mucho ms eficaz


x= 0:0.5:3; y= rand(size(x)); valor= 1.5; resp= sum((x==valor).*y); disp(resp)

Una de las caractersticas principales de los bucles for, la constituye la variable del bucle (var). Esta variable va tomando valores entre min y max de paso en paso. Cada vez que se ejecuta el bucle la variable var toma un valor diferente. Esto es, la primera vez que se ejecuta var es igual a min, la segunda vez min+paso, y as sucesivamente, hasta que al final var es igual a max. Si se suprime el paso, MATLAB entiende que el paso es igual a uno. Es muy importante mantener unas ciertas cuestiones de estilo de programacin. Por eso, deben indentarse adecuadamente todas las sentencias que se ejecuten dentro del bucle. EJERCICIO 1.1 Suma de los trminos de un vector En este primer ejercicio se ver una sencilla aplicacin de los bucles for. El ejercicio consiste en crear una funcin de MATLAB (suma.m), que sume los elementos de un vector, que se pasa por ventana; y un fichero ejer2_1.m, que contenga el programa principal con la llamada a la funcin suma. El programa principal debe realizar las siguientes operaciones: Borrar todas las variables (ver clear) Generar un vector fila aleatorio (x) de dimensin 5 (ver funcin rand) Realizar la suma de los elementos con la funcin suma creada por uno mismo y almacenar el resultado en la variable y1 ( es decir, y1 = suma(x)) Realizar la suma de los elementos con la funcin sum de MATLAB y almacenar el resultado en la variable y2. La funcin suma (fichero suma.m) debe ser la siguiente:
function y = suma(x) y = 0; for i=1:length(x) y = y + x(i); end return

Prcticas de MatLab. Sentencias de Control de flujo

pgina 3

La variable del bucle (i), es utilizada en este caso para acceder a los elementos del vector, tiene una funcin de ndice de acceso al vector. La variable y 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 y contiene la suma de todos los elementos del vector x. EJERCICIO 1.2 Factorial de un nmero En este ejercicio se deber construir una funcin de MATLAB (fact.m), que calcule el factorial de un nmero, que se pasa por ventana; y un fichero ejer2_2.m, que contenga el programa principal con la llamada a la funcin fact. El programa principal debe realizar las siguientes operaciones: Borrar todas las variables (ver clear) Pedir por teclado el nmero (n) del que se desea conocer su factorial (ver funcin input) Realizar el factorial con una llamada a la funcin fact creada por uno mismo y almacenar el resultado en la variable y ( es decir, y = fact(n)) Para escribir la funcin que calcule el factorial conviene tener en cuenta lo siguiente: fact(n) = 1234n Variando i desde 1 hasta n Cuando i=1 Cuando i=2 Cuando i=3 Cuando i=n y = (1*2*3**n-1)*n; Se ve que a medida que la variable i vara desde 1 hasta n, el factorial se obtiene multiplicando el valor anterior del factorial por la variable i. EJERCICIO 1.3 Suma de matrices En este ejercicio se deber construir una funcin de MATLAB (sumaMat.m), que calcule la suma de dos matrices, que se pasan por ventana; y un fichero ejer2_3.m, que contenga el programa principal con la llamada a la funcin sumaMat. El programa principal debe realizar las siguientes operaciones: Borrar todas las variables (ver clear) Crear la matriz M1 de dimensin 3x3, con la funcin magic. Crear la matriz M2 identidad de dimensin 3x3, con la funcin eye. Realizar la suma de matrices, mediante la funcin sumaMat creada por uno mismo y almacenar el resultado en la variable M3. Realizar la suma de matrices, mediante el operador + de MATLAB y almacenar el resultado en la variable M4. La funcin sumaMat (fichero sumaMat.m) debe ser la siguiente: y=1 y = (1)*2; y = (1*2)*3;

Prcticas de MatLab. Sentencias de Control de flujo

pgina 4

function M = sumaMat(M1,M2) M = zeros(size(M1)); for i = 1:size(M1,1) for j = 1:size(M2,2) M(i,j) = M1(i,j) + M2(i,j); end end return

En esta funcin se aprecian 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 1.4 Producto de matrices En este ejercicio se deber construir una funcin de MATLAB (prodMat.m), que calcule el producto de dos matrices, que se pasan por ventana, y un fichero ejer2_4.m, que contenga el programa principal con la llamada a la funcin prodMat. El programa principal debe realizar las siguientes operaciones: Borrar todas las variables (ver clear) Crear la matriz M1 de dimensin 3x3, con la funcin magic. Crear la matriz M2 de dimensin 3x3 con todo unos, con la funcin ones. Realizar el producto de matrices, mediante la funcin prodMat creada por uno mismo y almacenar el resultado en la variable M3. Realizar el producto de matrices, mediante el operador * de MATLAB y almacenar el resultado en la variable M4. La funcin de clculo del producto de matrices requiere tres bucles for anidados. El primero, para recorrer todas las filas, el segundo para todas las columnas, y el tercero para calcular cada elemento como el producto fila*columna. EJERCICIO 2. SENTENCIA DE CONTROL DE FLUJO IF EJERCICIO 2.1 Algoritmo de ordenacin (Burbuja). En este ejercicio se deber construir una funcin de MATLAB (burbuja.m), que ordene de mayor a menor los elementos de un vector y un fichero ejer3_1.m, que contenga el programa principal con la llamada a la funcin burbuja.

Prcticas de MatLab. Sentencias de Control de flujo

pgina 5

El mtodo de la burbuja consiste en comparar cada elemento con todos los que estn detrs

Si a[i]>a[j], se permutan

i Elementos ya ordenados

j
El elemento i se compara con los siguientes

de l en el vector. Cada vez que se encuentren dos elementos desordenados, sus valores se permutan. As, despus de comparar el primero (i=1) con todos los dems (j=2:n), el mayor elemento de todos habr pasado a estar en primera posicin. Despus se compara el segundo elemento (i=2) con todos los dems (j=3:n), y el segundo mayor elemento habr pasado a segunda posicin. Se sigue de esta manera hasta el penltimo elemento (i=n-1), que es el ltimo que se puede comparar con algn elemento siguiente. El programa principal debe realizar las siguientes operaciones: Borrar todas las variables. Crear el vector x de dimensin 10 con la funcin zeros. Pedir 10 valores por teclado para rellenar el vector x. Llamar a la funcin burbuja para ordenar x. Escribir el vector ordenado. La funcin burbuja es la que se muestra a continuacin:
function y = burbuja(x) for i=1:length(x)-1 for j=i+1:length(x) if (x(i) > x(j)) disp([num2str(x(i)) ,' > ', num2str(x(j))]) temp = x(i); x(i) = x(j); x(j) = temp; end end end y = x; return

Para realizar la ordenacin del vector se tienen que comparar todos los elementos del vector entre si. Para ello se tienen dos bucles que comparan: el primer elemento (i) con todos los dems (j) a partir de l; luego el segundo con todos los dems a partir de l; y as sucesivamente hasta llegar al ltimo elemento. En cada comparacin, comparamos el elemento i con el j y, en caso de que i sea menor que j, se cambian de orden. Obsrvese que para cambiar dos valores de posicin, nos tenemos que ayudar de una variable auxiliar (temp), que permita no destruir uno de los valores.

Prcticas de MatLab. Sentencias de Control de flujo

pgina 6

EJERCICIO 2.2 Ordenar una matriz por filas. En este ejercicio se deber crear una funcin de MATLAB (ordenaf.m), que ordene una matriz por filas de tal modo que la primera fila pase a ser aquella que contenga el mximo valor, la segunda el segundo, etc. Es decir, la matriz: 1 5 2 9 3 1 7 4 6 Pasa a ser:

9 3 1 7 4 6 1 5 2
Se crear tambin un programa principal (ejer3_2.m), que ordene una matriz de dimensin 5x5 utilizando la funcin ordenaf.m. El programa principal debe realizar las siguientes operaciones: Borrar todas las variables. Crear la matriz M1 de dimensin 5 con la funcin magic. Llamar a la funcin ordenaf para ordenar la matriz M1 Escribir la matriz ordenada por pantalla. EJERCICIO 3. BUCLES WHILE EJERCICIO 3.1 Mtodo de la biseccin Segn el teorema de Bolzano, si una funcin continua tiene valores de distinto signo en los extremos a y b de un intervalo, la funcin tiene al menos un cero (una raz) en ese intervalo. Este teorema se utilizar como base para un mtodo de clculo de races de funciones, llamado Mtodo de la Biseccin. Se parte de un par de puntos a y b en los que se cumple la condicin f(a)*f(b)<0 (la funcin tiene signos opuestos, luego existe al menos una raz en [a, b]). A continuacin se estudia la funcin en el punto c, que es el punto medio del intervalo (c=(a+b)/2), y se estudia el signo de f(c). Si f(c) tiene el mismo signo que f(a) se hace a=c y se vuelve a comenzar (se tiene un nuevo intervalo [a, b] en el que est la raz y que es la mitad que el anterior); si f(c) tiene el mismo signo que f(b) se hace b=c y se vuelve a comenzar. El proceso prosigue con intervalos [a, b] cada vez ms pequeos hasta que se cumple una de las siguientes condiciones: |f(c)| < eps1 c es la solucin aproximada buscada b-a < eps2 c=(b+a)/2 es la solucin aproximada buscada En este ejercicio se pide aplicar este mtodo para encontrar la raz de la funcin f(x)=sen(x)/x. Para ello se debe crear, en primer lugar, la funcin f(x), en el fichero f.m.
function y = f(x) y = sin(x)./x; return

A continuacin se debe escribir el fichero bisec.m, que calcula la raz por el mtodo de la biseccin. La funcin tiene como entradas los lmites del intervalo y utiliza como variables globales EPS1 y EPS2. La salida son las iteraciones y la solucin. Se recuerda, que una variable global es

Prcticas de MatLab. Sentencias de Control de flujo

pgina 7

aquella que es accesible desde cualquier funcin, siempre que sea declarada como global en esa funcin. El cdigo correspondiente al mtodo de la biseccin es el que se muestra a continuacin:
function [iter,sol] = bisec(a,b) global EPS1 EPS2 iter = 0; if ( (f(a)*f(b))>0 ) % Intervalo no vlido disp ('Intervalo no vlido'); sol = []; else % Intervalo vlido c = (b+a)/2; % c es el centro del intervalo while ( (abs(f(c))>EPS1) & ((b-a)>EPS2) ) c = (b+a)/2; % c es el centro del intervalo if ( (f(a)*f(c)) > 0) % si f(a) y f(c) tienen el mismo signo a = c; % a = c else % en caso contrario b = c; % b = c end iter = iter+1; % Incrementar el nmero de iteraciones end % fin del while % Comprobar cual es la condicin de salida del bucle if (abs(f(c))<=EPS1) % Si es la primera sol = c; % la solucin es c else % si no sol = (b+a)/2; % es el centro del intervalo end % fin de este if end % fin del if inicial

Por ltimo se debe escribir el cdigo correspondiente al programa principal (ejer4_1.m), cuyas sentencias sern: Borrar todas las variables. Definir como variables globales EPS1 y EPS2. Poner los valores de EPS1 y EPS2 a 1e-08 y 1e-12 respectivamente. Llamar a la funcin de bisec con los parmetros de intervalo [1,4]. El resultado almacenarlo en las variables iter y raiz. Generar un vector x, que vaya desde 1 hasta 4, de 0.1 en 0.1. Llamar a la funcin f con ese vector y almacenar el resultado en y. (y = f(x)). Ejecutar: plot(x,y), y comprobar que el valor de raiz es el adecuado.

También podría gustarte