Practica 3. Control de flujo

Anuncio
Practica 3. Control de flujo
Informática Aplicada - Grado en Ingenierı́a Quı́mica, UAM, 2009/2010
1
Fecha limite de entrega de la practica
Grupo A: 26 de Marzo
Grupo B: 9 de Abril
2
Objetivos
Al finalizar esta práctica se deberán haber adquirido conocimientos sobre los siguientes temas de programación
en MATLAB:
• Polinomios en MATLAB
• Representación de gráficos en MATLAB
• Control de flujo en MATLAB
3
Introducción
El objetivo principal de esta practica es que el estudiante se familiarice con los comandos de control de flujo
existentes en MATLAB. Hasta ahora hemos utilizado MATLAB a través de su interprete de comandos. Para
elaborar programas mas complejos, escribiremos nuestras instrucciones en un archivo .m que luego sera ejecutado
por el interprete. En este archivo podemos programar bucles, condiciones, ramificaciones, etc. Adicionalmente
en esta practica y de manera tangencial examinaremos brevemente la capacidad de MATLAB para trabajar
con polinomios y con gráficos.
4
Polinomios
MATLAB puede trabajar con polinomios: basta tener en cuenta que un polinomio se representa en MATLAB
por medio de un vector cuyos elementos representan los coeficientes del polinomio. El orden de los coeficientes
es de mayor a menor grado. Por ejemplo, el polinomio p(x) = x4 + 2x2 + 3 se crea en MATLAB como:
>> p = [1 0 2 0 3] % Polinomio x4 + 2x2 + 3
p=
10203
MATLAB tiene funciones especı́ficas para polinomios como:
>> polyval(p, −1) % Evaluación del polinomio x4 + 2x2 + 3 en x=-1
ans =
6
1
Definimos un polinomio adicional q, q(x) = x2 + x:
>> q = [2 1 0]
y multiplicamos p por q:
>> pro = conv(p, q) % Producto de los polinomios p y q
pro =
2142630
>> deconv(pro, p) % Cociente entre pro y p; obviamente el resultado es q
ans =
210
>> roots(pro) % Raı́ces del polinomio pro
ans =
0
0.6050+1.1688i
0.6050-1.1688i
-0.6050+1.1688i
-0.6050-1.1688i
-0.5000
5
Gráficos en MATLAB
MATLAB tiene un gran potencial como herramienta gráfica. La forma de representar los valores de un vector
frente a otro (de la misma longitud) es muy sencilla:
>> x = pi ∗ (−1 : 0.1 : 1);
>> y = x. ∗ sin(x);
>> plot(x, y) % Por defecto une los puntos (x(i),y(i)) mediante una poligonal
Como se ve, con pocos puntos la gráfica tiene un aspecto demasiado lineal a trozos. Para ”engañar” al ojo,
basta tomar más puntos:
>> x = pi ∗ (−1 : 0.01 : 1);
>> y = x. ∗ sin(x);
>> plot(x, y)
También pueden dibujarse funciones. Ası́:
>> f plot(0 sin(x)0 , [0 2 ∗ pi]) % Dibuja la función seno en el intervalo [0,2*pi]
>> hold on % Mantiene en la ventana gráfica los dibujos anteriores
>> f plot(0 cos(x)0 , [02 ∗ pi]) % Dibuja sobre la gráfica anterior la función cos(x)
>> hold of f % Con esto olvida los dibujos anteriores y dibuja en una ventana nueva
>> f plot(0 x2 ∗ sin(1/x)0 , [−0.05 0.05]) % Dibuja la función x2 ∗ sin(1/x)
2
También puede usarse el versátil comando ezplot (se lee como easy plot) que permite dibujar funciones,
>> ezplot(0 exp(x)0 ) % Dibuja la función exponencial en un intervalo adecuado a la función.
También se pueden generar curvas paramétricas:
>> ezplot(0 sin(t)0 ,0 cos(t)0 , [0 pi])
e implı́citas:
>> ezplot(0 x2 − y 2 − 10 )
También permite dibujar superficies. La forma más sencilla es mediante el comando ezsurf,
>> ezsurf (0 sin(x ∗ y)0 , [−2 2 − 2 2]) y tambien se pueden realizar gráficas más sofisticadas:
>> t = 0 : 0.001 : 0.009;
>> v = 900 : 1025;
>> [T V ] = meshgrid(t, v);
>> aux1 = 16 ∗ pi2 ∗ (T.2 ). ∗ ((V − 918).2 ). ∗ ((V − 1011).2 );
>> aux2 = aux1 + (2 ∗ V − 1929).2 ;
>> w = T./aux2;
>> z = 35000000 ∗ w;
>> surf l(t, v, z); % Este comando dibuja la superficie creada mediante las
>> shading interp; % ordenes anteriores. Los siguientes sirven para modificar
>> colormap(pink); % el dibujo obtenido
>> rotate3d; % Sirve para girar la figura mediante el ratón
6
6.1
Control del flujo
Nociones preliminares
La elaboración de un programa en Matlab es muy sencilla. Basta abrir un documento de texto (se puede hacer
con cualquier editor, Matlab trae uno incorporado), escribir las instrucciones tal como se pondrı́an en la
ventana de comandos y guardar el documento con la extensión .m (por ejemplo: miprog.m). Matlab reconoce
automáticamente los ficheros que tienen extensión .m: si en la ventana de comandos se introduce:
>> miprog
las órdenes almacenadas en el fichero miprog.m se ejecutarán, una tras otra (siempre y cuando el directorio
donde se encuentra alojado ’miprog’ este incluido en el path). A ese recorrido a través de las instrucciones se
le conoce con el nombre de flujo. La potencia de un programa se pone de manifiesto cuando este puede
”decidir”, llegado a un punto, ejecutar unos comandos u otros en función del valor que tome una variable, por
poner un caso. En la Figura 1 vemos un ejemplo de programa .m.
6.2
Control del flujo
Al proceso de toma de decisiones dentro de un programa se le llama control del flujo.
6.3
Condiciones
Son las preguntas básicas a las que se puede responder sı́ o no. Para implementar el control del flujo, son muy
útiles expresiones que permiten comparar dos variables entre sı́ o una variable con un valor fijo. En un
3
Figure 1: Editor integrado de MATLAB. Edición de un archivo .m
programa, a menudo es necesario preguntarse: ¿es x mayor que y? y dependiendo de la respuesta hacer una
cosa u otra. Las condiciones se construyen con operadores relacionales:
• > mayor que
• < menor que
• == igual que
• ˜= no igual a
• >= mayor o igual que
• <= menor o igual que
6.4
Ramificaciones
Dependiendo de una condición, el programa decide el curso que seguirá. El resultado de una condición
permite tomar una decisión, es decir, si la condición es verdadera se ejecutan determinadas sentencias. El
diagrama de flujo se ramifica. La ramificación más simple, ’if’, expresada en este diagrama de flujo, se obtiene
con la siguiente sintaxis:
if (condición)
sentencias
end
’if’ y ’end’ son palabras reservadas del lenguaje informático, y no se pueden utilizar para otra cosa, p. ej. una
variable no puede -no deberı́a- llamarse if. Existe la posibilidad de ejecutar ciertas sentencias si la condición es
verdadera, y otras diferentes si la condición es falsa:
if (condición)
sentenciasA
else
sentenciasB
end
dicho de otra manera: si la condición se cumple, se ejecutan las sentencias A; si no, se ejecutan las sentencias
B. Una vez se hayan ejecutado las sentencias que correspondan (las sentencias A si la condición es verdadera,
las sentencias B en caso contrario) el programa continúa con las instrucciones que vengan después de end.
También se pueden construir ramificaciones con varias posibilidades: la sintaxis hace uso de la palabra clave
4
’elseif’. Otra posibilidad de ramificación múltiple la ofrece la construcción ’switch’. Se remite para una
explicación más detallada a la ayuda de Matlab.
6.5
Bucles
Hay ocasiones en las que es necesario repetir el mismo conjunto de instrucciones muchas veces, cambiando
algunos detalles. Eso es lo que se consigue con un bucle for, cuya sintaxis es:
for contador=inicio:paso:fin
sentencias
end
Las palabras claves son ’for’ y ’end’. Este bucle pone en marcha una variable llamada contador que va desde
inicio hasta fin de paso en paso. Cada vez que las sentencias se ejecutan, el contador aumenta en un valor paso
(que si se omite, se le asigna automáticamente el valor 1). Cuando contador llega al valor fin, el bucle se acaba
y el programa continúa con las sentencias que haya más allá de end.
Obsérvese que un bucle como el indicado se implementa un número fijo de veces: desde inicio hasta fin de paso
en paso. En ocasiones, sin embargo, no se sabe de antemano cuántas veces habrá que ejecutar las sentencias
del bucle. Por ejemplo: si es necesario repetir una serie de sentencias hasta que se cumpla una determinada
condición, y no se sabe a priori cuántas veces será necesario realizar esas operaciones. En ese caso se emplea
un bucle while:
while(condición)
sentencias
end
Este bucle ejecuta las sentencias mientras la condición sea verdadera. Atención: es fácil caer, por error de
programación, en bucles infinitos y el programa nunca saldrá del bucle: es decir, el programa ejecutará una y
otra vez las mismas sentencias. El programa se ”cuelga”, y hay que interrumpirlo desde el teclado apretando
las teclas Ctrl+C.
7
Ejercicios
7.1
Ejercicio 1
Realizad las siguientes tareas de representación gráfica de funciones en 2 y 3 dimensiones. Utilizando el
comando plot, representad gráficamente la siguiente función en el intervalo t ∈ [0, 1] con una precisión de 0.1,
y valores vx = 5m/s y a = −32m/s2 :
1
(1)
x(t) = v · t + · a · t2
2
Incluir etiquetas en los ejes y un titulo en la figura.
7.2
Ejercicio 2
Realizad las siguientes tareas relacionadas con polinomios (utilizad el comando help si fuera necesario):
1. Definid el polinomio P (x) = x3 − x2 − 6x en una variable P que sea una matriz fila.
2. Calculad las raı́ces de P (x) utilizando el comando de MATLAB adecuado.
3. Hallad el valor de P (1) utilizando el comando MATLAB adecuado.
4. Representad gráficamente P (x) en el rango x ∈ [−5, 5] con una precisión de 0.1.
7.3
Ejercicio 3
Escribir un programa que tome un número entero al azar entre el 0 y el 9 y anime una sola vez al usuario a
que adivine el numero generado y le informe si acertó o no.
5
7.4
Ejercicio 4
Escribir un programa que tome un número entero al azar entre el 0 y el 9, y anime al usuario a que adivine el
numero generado en solo 4 oportunidades.
7.5
Ejercicio 5
Escribir un programa que, de forma perpetua pida un número al usuario y cada vez que el usuario introduzca
un numero el programa le informe de si es par, impar o no entero. (Interrumpir el programa con Ctrl-C)
7.6
Ejercicio 6
Escribir un programa que calcule los cuadrados de los números enteros, hasta que el cuadrado sea mayor o
igual que 100. Mostrar también la media, la desviación tı́pica y los valores mı́nimos y máximos de todos los
valores calculados.
7.7
Ejercicio 7
Escribir un programa que ordene una secuencia desordenada de numeros ej: (3, 5, 1, 7, 8, 0) en una secuencia
ordenada ej: (0,1,3,5,7,8) utilizando bucles anidados.
Ayuda: http://es.wikipedia.org/wiki/Ordenamiento_de_burbuja
8
Material a entregar
La práctica se debe entregar de forma electrónica Y por escrito antes de la fecha de finalización indicada al
comienzo del enunciado en el laboratorio 208 de la escuela politécnica o bien durante la practica
correspondiente a la fecha limite de entrega. No se admitirán practicas con retraso. En general, las prácticas
tienen fecha lı́mite un viernes y por lo tanto pueden entregarse hasta la hora de la clase de la fecha limite.
Se enviará un único fichero zip a través del sistema de entrega de prácticas de la Escuela Politécnica Superior,
para el periodo: ”SEGUNDO CUATRIMESTRE”, la categorı́a: ”TITULACIÓN INGENIERÍA TÉCNICA
INDUSTRIAL” y el nombre de la asignatura: ”INFORMÁTICA APLICADA”.
http://docenciaweb.ii.uam.es/esp/alumnos/practicas/envio_practicas.php
La pagina para el envı́o de practicas tiene una protección para que ninguna persona que no tenga relación con
la Escuela Politécnica pueda acceder a la misma. En la ventana de autentificación donde se tiene que
introducir un login y una password, los valores a introducir son: practicas y entrega.
El nombre del fichero será PN X YY.zip, donde ’N’ se deberá reemplazar por el número de practica (2,3,4 o
5), ’X’ se deberá reemplazar por el grupo de prácticas (A o B) e ’YY’ por el número de pareja. Ası́ por
ejemplo, la pareja 1 del grupo A deberá enviar su práctica 2 en el fichero P2 A 01.zip. El numero de grupo lo
podréis encontrar en la pagina web de las practicas de la asignatura en el enlace ”Tabla de Excel con las notas
de practicas de los grupos A y B”, es el numero a la izquierda de los nombres de los componentes de la pareja.
El fichero Excel lo podéis encontrar en la página de practicas de la asignatura en:
http://arantxa.ii.uam.es/~drozado/fund_info.html
No se admitirán practicas con retraso. En general, las prácticas tienen fecha lı́mite un viernes y por lo tanto
pueden entregarse hasta la hora de la clase de la fecha limite.
6
Descargar