Beruflich Dokumente
Kultur Dokumente
Segunda parte
LABI Cursos
ndice
1. Grficos
1.1. Funciones bsicas . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
1.2. Manipulando ventana de grficos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
3
3
4
.
.
.
.
.
.
.
.
.
.
.
.
5
5
5
5
5
6
6
6
6
6
6
6
6
3. Grficos 3D
3.1. El comando mesh . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
3.2. El comando meshgrid . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
3.3. El comando meshc . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
8
8
8
9
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
Pgina 2
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
10
10
10
11
11
12
12
12
13
13
13
1.
1.1.
LABI Cursos
Grficos
Funciones bsicas
Para graficar disponemos de dos funciones; plot() y stem(). La primera lo hace con trazo continuo
(que no es ms que una interpolacin del conjunto de puntos que define a la curva), mientras que la segunda
grfica en forma discreta los puntos de la curva. Recordemos que Octave internamente procesa todas las
funciones o curvas en un conjunto de valores que de alguna forma definimos nosotros. Luego, la representacin que elijamos depender de lo que se quiera mostrar.
Si estas funciones se utilizan recibiendo como argumento tan solo el vector que desea visualizarse, lo
que obtenemos luego de la ejecucin es un grfico con ejes cuya escala se ajusta automticamente tomando
como referencia todos los puntos disponibles. A su vez, no tenemos informacin sobre lo que representa
cada eje, ni sobre lo que representa la o las curva/s graficada/s. Para poder exhibir toda esta informacin
adicional y/o ajustar escalas, dar formato, etc. se cuenta con un conjunto de herramientas que van desde argumentos opcionales de las funciones presentadas en esta seccin, como as tambin comandos y funciones
extras, que cumplen tareas especficas. Las mismas se presentan en la seccin siguiente.
Pgina 3
LABI Cursos
1.2.
Si bien la interfaz no es muy intuitiva al respecto, es posible tener control sobre la figura que despliega
el grfico generado. Lo ms importante de esta funcionalidad es la posibilidad de hacer zoom. Esto lo
llevamos a cabo clickeando el botn derecho del mouse sobre alguna zona del grfico, y arrastrando el
mouse delimitando una regin. Luego volviendo a hacer click lo que observamos es la regin delimitada,
ampliada.
Asimismo se pueden utilizar comandos de teclado para manejar otras funciones relacionadas. Los ms
comunes son p, vuelve al zoom anterior, n va al zoom prximo, e redibuja el grfico, y el botn
central del mouse marca sobre el grfico las coordenadas del punto en el que nos encontramos.
Se puede acceder a una lista completa de todos los comandos disponibles para el control de una ventana
de grficos. Para esto se debe presionar la tecla h luego de haber generado la grfica, y sin cerrar la
ventana que la contiene. La lista se despliega en el intrprete de Octave.
Pgina 4
2.
LABI Cursos
En la seccin anterior se presentaron los comandos bsicos para graficar funciones. Sin embargo Octave
brinda una serie de comandos que permiten modificar la apariencia de los grficos. Se puede por ejemplo
definir los ejes, cambiar el color y el tipo de trazo de cada funcin graficada, agregar nombre a los ejes,
establecer una referencia para indicar qu representa cada funcin graficada, entre muchas otras funciones.
Nota: Todos los comandos que se listan a continuacin son opcionales y al incluirse secuencialmente
actan sobre la ltima figura que se haya declarado. Adems, si bien se ejemplificarn para el comando
plot, funcionan en forma anloga con stem.
2.1.
El comando figure
Cuando se genera un grfico el mismo se despliega sobre un objeto que se denomina Figure. Si queremos
graficar distintas cosas y poder verlas todas a la vez por separado, necesitamos definir una figura por cada
grfico porque de lo contrario el nuevo grfico se genera sobre el anterior, y solo vemos el ltimo que
hayamos ejecutado. Para esto debemos definir los grficos de la siguiente forma:
>>figure(1); plot(grafico1);
>>figure(2); plot(grafico2);
o bien,
>> figure; plot(grafico1);
>> figure; plot(grafico2);
Ambos fragmentos de cdigo hacen exactamente lo mismo.
2.2.
El comando subplot
El comando subplot permite graficar varias curvas diferentes dentro de la misma figura, es decir en
una nica ventana, pero dividiendo a la misma en tantos grficos como filas y columnas pasemos como
argumento. Por ejemplo, si escribimos:
>>figure(1);
>>subplot(3,2,1) #Subplot(FILAS, COLUMNAS, INDICE)
>>plot(grafico1);
Tendremos una figura particionada de la forma; tres filas - dos columnas, y el grfico 1 se mostrar en
la particin 1. Es decir, lo veremos representado en el primero de todos los casilleros en los que se divide
la figura.
2.3.
El comando axis
Para indicarle a Octave que el grfico queremos realizarlo solo para un rango de valores de los ejes
definidos por nosotros, debemos utilizar el comando axis(). La forma de uso es:
>> axis([X_INICIAL X_FINAL Y_INICIAL Y_FINAL])
2.4.
El comando title
2.5.
LABI Cursos
2.6.
El comando hold
Cuando este comando est activo, las acciones que se realicen sobre la figura de grfico se efectuarn
superpuestas. Su utilidad radica en que por cada comando agregado la figura no se vuelve a generar, como
s ocurre si se omite la mensin de este comando en el mbito de la figura. Este comando es ejecutado de la
forma hold on o bien hold off.
2.7.
El comando grid
Este comando ejecutado tambin de la forma grid on o bien grid off, activa o desactiva respectivamente
una grilla sobre el grfico.
2.8.
El comando box
Ejecutado en forma equivalente a grid, es decir box on o bien box off, activa o desactiva respectivamente
el marco alrededor del grfico, dejando solo visibles los ejes.
2.9.
El comando legend
Por otro lado, cuando se tiene ms de una curva o funcin por grfico, en general se indica a qu conjunto
de datos corresponde cada curva. Para eso se emplea el comando legend, de la siguiente forma:
>>legend("curva 1", "curva 2", "location", pos, "options",...)
2.10.
El comando close
close cierra la ltima figura abierta y si se lo invoca junto con el modificador all cierra todas las figuras.
2.11.
Los grficos en Octave admiten cambiar el tipo de trazo (o, x, *, -, +) y color (b, k, c,
g, y, r). Tambin pueden cambiarse el tamao de los markers con MarkerSize y el grosor del trazo
continuo con LineWidth. La manera de indicar cada uno de estos parmetros al intrprete no es nica. Es
decir, existen diferentes sintaxis que llevan a los mismos resultados.
plot(1:100,r+,Markersize,20,LineWidth,2)
2.12.
Uniendo formato
Finalmente, si ponemos todos estos comandos en accin juntos, podemos obtener grficos ms personalizados y con informacin til exhibida de forma clara:
Pgina 6
LABI Cursos
3.
LABI Cursos
Grficos 3D
En las secciones anteriores vimos cmo generar grficos sencillos, y cmo agregarles formato para
que fuese ms claro visualizar la informacin, entre otras cosas. Sin embargo todos esos grficos eran
bidimensionales. En esta seccin veremos cmo generar graficos con 3 dimensiones.
3.1.
El comando mesh
Teniendo una superficie definida sobre un conjunto de puntos obtenidos de alguna forma, para graficar
esta superficie utilizamos mesh(z), donde z es la funcin dependiente del par de variables que definen cada
punto del espacio, digamos x e y .
Luego, de ejecutar :
>> mesh(z)
Obtenemos:
3.2.
El comando meshgrid
Pero a la hora de generar un grfico en tres dimensiones, lo que necesitamos vectorialmente hablando,
es una matriz que represente el valor de la funcin para cada par de puntos. Es decir, si tenemos una
funcin z(x, y), para Octave, z es una matriz que en cada una de sus componentes tiene el valor de un
par de puntos (x, y). Pero en general puede ocurrir que tengamos definidos vectores x e y sobre los que
pretendamos obtener una cierta funcin de esas variables. Supongamos la funcin del ejemplo anterior:
z(x, y) = x2 + y 2 . El problema es que si definiramos z de esta forma, obtendramos un vector en lugar de
una matriz, y el grfico sera de la forma:
Pgina 8
LABI Cursos
3.3.
El comando meshc
Por ltimo, existe un tercer comando que realiza la misma funcin que mesh llamado meshc, y que
adems de graficar la superficie grafica sus curvas de nivel proyectadas en el plano.
4.
A diferencia de otros lenguajes, en Octave no hay que agregar bibliotecas a nuestro cdigo, ni definir (a
menos que lo deseemos por alguna razn en particular que veremos ms adelante) nada en archivos externos
al que contendr nuestro cdigo. Tampoco har falta definir ninguna clase de header o encabezado, como
ocurre a veces, ni necesitamos instalar ninguna clase de compilador para poder ejecutar ese cdigo. Recordemos que Octave propone un lenguaje de scripting, el cual no se compila, sino que se va interpretando
lnea a lnea a medida que se van ejecutando.
Pgina 9
5.
LABI Cursos
Empezamos este curso diciendo que Octave era un programa de clculo numrico, y que dispona de un
lenguaje de programacin propio para llevar a cabo los distintos tipos de tareas que nos permite realizar. Sin
embargo hasta el momento no hemos visto nada inherentemente orientado a programar. Solo nos dedicamos
a definir variables de distintas caractersticas, y operar sobre ellas valindonos de un conjunto de funciones
de las que nos provea el programa.
En esta seccin y las siguientes empezaremos entonces a entender cmo funciona Octave cuando uno
desea programar sus propios scripts en l . Para esto iremos describiendo en orden todas aquellas cosas
propias de cualquier lenguaje de programacin indicando como se implementan dentro de Octave.
5.1.
Condicionales
Todo lenguaje de programacin (en particular aquellos procedurales) proporcionan alguna herramienta
para comparar elementos y tomar decisiones en funcin del resultado de la comparacin. En general a este
tipo de acciones que se toman en funcin de una comparacin se conocen como condicionale, porque
permiten decidir en funcin de una condicin.
Sentencia if - else - else if
Al igual que en muchos otros lenguajes, la sentencia if ser en este caso la encargada de permitirnos
decidir segn una condicin impuesta, si ejecutamos o no un fragmento de cdigo. La misma se puede
acompaar adems por su correspondiente else si resulta pertinente. Esto es, si se precisa un condicional para definir entre dos posibles bloques de cdigo a ejecutar. Para realizar esto nos valdremos de los operadores
lgicos estudiados en la primer parte de este curso. La sintaxis es la siguiente:1
s = 6;
if s > 0 && s < 10
if s == 5
disp("El nmero es 5.")
else if s < 5
disp("El nmero es menor a 5.")
else
disp("El nmero es mayor a 5.")
endif
endif
endif
Notar que no hay parntesis ni ningn otro tipo carcter que encierre a la expresin de la condicin. En
octave los parntesis son opcionales, como tambin lo es la coma luego de la expresin de la condicin, y
el indentado de los bloques de cdigo es tambin opcional. Lo nico que debe cumplirse es que los bloques
condicionales se finalizan con la palabra end. Algo para remarcar es que mientras que end funciona y es
compatible con Matlab, en Octave puede utilizarse una versin modificada de end que es endif. Esto hace
que sea ms clara la lectura cuando hay muchos bloques anidados, y se vuelve complicado identificar dnde
se cierra cada bloque. Ocurrir algo similar con las dems construcciones que veremos en esta seccin.
1
Para los siguientes ejemplos vamos a asumir que trabajamos dentro de un archivo porque resulta ms cmodo que hacerlo
directamente en el intrprete.
Pgina 10
5.2.
LABI Cursos
Bucles
LABI Cursos
Sentencia For
Esta sentencia tiene caractersticas idnticas a nivel conceptual, que el while. La nica diferencia real
radica en cmo se trata a la condicin. En este caso s se est definiendo una condicin de corte inherentemente relacionada con cuntas veces se realiza una serie de acciones. La sintaxis nuevamente tiene
parntesis opcionales, indentado opcional y los bloques pueden finalizar con end o endfor. A continuacin
vemos un ejemplo que ilustra el uso de la sentencia:
# Defino un vector de entrada que puede ser cualquier dato a procesar
vector_entrada = [1 2 3 4 5 6 7 8 9];
N = length(vector_entrada);
# Declaro un contador para corroborar la condicin
contador = 0;
# Declaro un vector nulo del largo del vector de entrada. Aqui voy a
# almacenar el resultado del procesamiento
vector = zeros(N,1);
# Inicio del ciclo o bucle "for"
for contador = 1:N
vector_salida(contador) = vector_entrada(contador) + contador;
endfor
vector_salida
5.3.
El comando pause
En determinadas ocasiones nos interesar que las cosas ocurran en tiempos controlados. Esto es, podemos requerir que el cdigo se ejecute a una velocidad menor a la inherente, dada por la computadora. O
bien directamente esperar hasta recibir la instruccin del usuario para continuar con el avance de nuestro
programa.
Para ilustrar mejor estas situaciones, digamos primero que nuestro programa realiza primero la carga
de una serie de datos, muestra los mismo por pantalla, y luego ejecuta una porcin de cdigo que muestra
otra informacin en pantalla dejando fuera del marco de los lmites de nuestro intrprete, la informacin
referida a la carga de datos. En estas situaciones podemos pausar la ejecucin luego de la carga de datos,
corroborar que los mismos se cargaron correctamente, y recin en ese momento indicarle al programa que
puede continuar. El comando a utilizar se llama precisamente pause, y puede utilizarse sin argumentos,
en cuyo caso impedir que muestro cdigo se ejecute hasta que presionemos una tecla. O puede utilizarse
recibiendo como argumento el tiempo en segundos que quiere que se pause la ejecucin.
# Cuando el programa ejecuta este lnea, queda a la espera
# de que se presione una tecla para continuar
>> pause;
# El programa detiene su ejecucin por 5 segundos
>> pause(5);
Pgina 12
LABI Cursos
El comando fflush
Una particularidad de los bucles o ciclos en Octave es que lo que ocurre durante la ejecucin de los
mismos no se muestra en el intrprete aunque dejemos las lneas sin ;. Esto a veces es un problema
porque en general, cuando un bucle no termina nunca de ejecutarse, o nuestro cdigo tiene algn problema
de alguna ndole, es una prctica comn imprimir resultados parciales en pantalla para buscar el error.
Para el caso en el que se quiera hacer esto, Octave dispone de un comando llamado fflush(flujo_de_salida)
En general el flujo de salida estndar es stdout en este caso, el propio intrprete. No obstante hay que explicitarlo:
for contador=0:N
# No se debe poner el ; si se quiere usar fflush()
disp("Hola mundo")
fflush(stdout)
endfor
Nota: Si se quisiese mantener el efecto de este comando durante todo el script, puede inicializarse el
archivo incluyendo una nica sentencia del siguiente modo:
>> more off;
El comando break
En ocasiones es necesario detener la ejecucin de un determinado bucle en ejecucin. Puede ser esperable disponer de una herramienta que nos permita detener el proceso si se est en busca de un elemento y el
mismo es encontrado. Para estos casos existe un comando llamado break, que hace exactamente eso. Para
entender como funciona observemos el siguiente caso:
for contador = 1:N
vector_salida(contador) = vector_entrada(contador) + contador;
if vector_salida(contador) == 10
break;
else
vector_salida(contador)
fflush(stdout);
endif;
endfor;
Los comandos tic y toc
Sirven para contar la cantidad de tiempo de ejecucin de un fragmento de cdigo. El conteo comienza
con la invocacin del comando tic y termina al invocar el comando toc.
Pgina 13