21 de agosto de 2012

Tutorial Octave

Automatización y Control de Sistemas Dinámicos
Laboratorio: Entrada 1

¿Qué es Octave?


GNU Octave es un lenguaje de alto nivel destinado para el cálculo numérico. Provee una interfaz sencilla, orientada a la línea de comandos, que permite la resolución de problemas numéricos, lineales y no lineales, además permite la ejecución de scripts.

Octave posee una gran cantidad de herramientas que permiten resolver problemas de álgebra lineal, cálculo de raíces de ecuaciones no lineales, integración de funciones ordinarias, manipulación de polinomios, integración de ecuaciones diferenciales ordinarias y ecuaciones diferenciales algebraicas. Sus funciones también se pueden extender mediante funciones definidas por el usuario escritas en el lenguaje propio de Octave.

Ir a la página principal de Octave.

Características de Octave:
  • La sintaxis es similar a la utilizada en MATLAB, por lo que se le considera precisamente la versión libre de MATLAB.
  • Es un lenguaje interpretado.
  • No permite punteros.
  • Se pueden generar scripts.
  • Soporta gran parte de las funciones de la biblioteca estándar de C.
  • El lenguaje está pensado para trabajar con matrices y provee mucha funcionalidad para trabajar con éstas.

Instalación


Usando Ubuntu como sistema operativo, Octave puede ser instalado desde el instalador de paquetes synaptic o desde línea de comandos con apt-get. El nombre del paquete a instalar se llama octave3.2, en una de sus versiones más estables.

esteban@presario:~$ sudo apt-get install octave3.2

Correr octave


Para hacer uso de octave, abrimos una terminal o consola de comandos, y escribimos octave.

esteban@presario:~$ octave

Esto nos desplegará información de la versión que tenemos instalada actualmente en nuestra computadora y así entramos a la consola de octave, muy parecida a la usada en python, y es aquí donde empezaremos a escribir cálculos matemáticos para nuestro primer ejemplo.

GNU Octave, version 3.2.4
Copyright (C) 2009 John W. Eaton and others.
This is free software; see the source code for copying conditions.
There is ABSOLUTELY NO WARRANTY; not even for MERCHANTABILITY or
FITNESS FOR A PARTICULAR PURPOSE.  For details, type `warranty'.

Octave was configured for "i686-pc-linux-gnu".

Additional information about Octave is available at http://www.octave.org.

Please contribute if you find this software useful.
For more information, visit http://www.octave.org/help-wanted.html

Report bugs to  (but first, please read
http://www.octave.org/bugs.html to learn how to write a helpful report).

For information about changes from previous versions, type `news'.

octave:1>

Salir de octave


Para salir de la línea de comandos dentro de octave, basta con escribir quit o exit y presionar enter.

octave:1> exit

esteban@presario:~$ 

Nociones básicas


Lo siguiente es una sesión simple que realice en octave. En ella podemos ver como es posible asignar valores a las variables, hacer operaciones fundamentales sencillas, uso de vectores, y multiplicación básica de un vector, así como ver de nuevo el valor que tenemos en una variable y como es posible cambiar su valor.

Pero todo esto lo explico más a detalle en las siguientes secciones.

octave:1> a = 2*3
a =  6
octave:2> b=[1 2 3 4]
b =

   1   2   3   4

octave:3> c = a*b
c =

    6   12   18   24

octave:4> d = c/2
d =

    3    6    9   12

octave:5> a
a =  6
octave:6> a = a*5
a =  30
octave:7> quit

Cambe mencionar que cuando salimos de octave, todas las variables usadas son liberadas, por lo que al entrar de nuevo, no se habrá guardado nada de nuestra sesión anterior.

Guardar una sesión


Octave almacena los comandos ejecutados previamente por el usuario, incluso órdenes ejecutadas en sesiones anteriores, el archivo donde se guarda el historial se encuentra en el directorio home del usuario y lleva el nombre de .octave_hist. Gracias a esta característica podemos buscar un comando ejecutado previamente.

Pero al salir de Octave se perderán todas las variables que se han creado. Para eso existen los comandos save y load, que sirven para guardar una sesión y así recuperar las variables que ya teníamos asignadas.

Enseguida podemos ver la asignación de algunas variables, y como al terminar de usarlas se guardan en una sesión llamada "prueba".

octave:1> a = 5
a =  5
octave:2> b = 3
b =  3
octave:3> c = a*b
c =  15
octave:4> save prueba
octave:5> quit

Si en una siguiente ocasión regresamos a octave, si queremos ver alguna variable que habíamos usado anteriormente, vemos que esta ya no existe y se lanza un error. Pero después de cargar la sesión "prueba", previamente guardada, podemos recuperar todas las variables usadas.

octave:1> c
error: `c' undefined near line 1 column 1
octave:1> load prueba
octave:2> c
c =  15
octave:3>

También es posible recuperar específicamente alguna o algunas variables.

octave:1> load prueba a c
octave:2> a
a =  5
octave:3> b
error: `b' undefined near line 3 column 1
octave:3> c
c =  15
octave:4>

Vemos que solo recuperamos la variable "a" y "c", por lo tanto "b" lanza error, ya que no esta definida aún.

Operaciones aritméticas y cosas útiles


En la siguiente sesión de octave muestro el uso de operaciones aritméticas comunes. Agregue el signo "#", usado para comentarios, para explicar lo que se hace en cada línea.

octave:1> # Se respetan las reglas para el orden de operaciones
octave:1> 4 + 10 / 5 - 3
ans =  3


octave:2> # Es buena practica usar paréntesis para evitar conflictos
octave:2> (4 + 10) / (5 - 3)
ans =  7


octave:3> # Para calcular potencias existen dos formas
octave:3> 2^8
ans =  256
octave:4> 2**8
ans =  256


octave:5> # Negación de una variable
octave:5> a = 4
a =  4
octave:6> -a
ans = -4


octave:7> # Para ocultar la respuesta de salida se usa ";" al final
octave:7> a = 2^3
a =  8
octave:8> a = 2^3;


octave:9> # Podemos crear vectores
octave:9> v = [3 1 7 9]
v =

   3   1   7   9



octave:10> # Para obtener la transpuesta
octave:10> v.'
ans =

   3
   1
   7
   9



octave:11> # Octave es bueno para operar con matrices
octave:11> m = [1 2 3;4 5 6;7 8 9]
m =

   1   2   3
   4   5   6
   7   8   9

octave:12> m.'
ans =

   1   4   7
   2   5   8
   3   6   9



octave:13> # Podemos introducir varios comandos en una misma línea
octave:13> base=10, altura=4, A=(base*altura)/2
base =  10
altura =  4
A =  20


octave:14> # Podemos ocultar algunas operaciones
octave:14> base=10; altura=4; A=(base*altura)/2
A =  20


octave:15> # También podemos liberar una variable
octave:15> A
A =  20
octave:16> clear A
octave:17> A
error: `A' undefined near line 17 column 1


octave:17> # Variables predefinidas

octave:17> 1.2*4.4
ans =  5.2800
octave:18> # ans muestra el último resultado
octave:18> ans
ans =  5.2800


octave:19> pi
ans =  3.1416


octave:20> e
ans =  2.7183


octave:21> Inf
ans = Inf


octave:22> # Secuencias de números
octave:22> 1:9
ans =

   1   2   3   4   5   6   7   8   9



octave:23> # Secuencias con paso entre números
octave:23> 1:0.5:4
ans =

    1.0000    1.5000    2.0000    2.5000    3.0000    3.5000    4.0000

Funciones matemáticas y trigonométricas


Octave incluye una serie de funciones matemáticas y trigonométricas que nos ayudan a simplificar algunos cálculos, la siguiente tabla muestra algunas de ellas.

sqrt(x) Raíz cuadrada de x
abs(x) Valor absoluto de x
log(x) Logaritmo neperiano de x
log2(x) Logaritmo en base a 2 de x
log10(x) Logaritmo en base a 10 de x
exp(x) Exponente
pow2(x) Para cada elemento de x, calcula 2^x
rem(x,y) Resto entre la división de x e y (módulo)
round(x) Redondeo de x al entero mas cercano
ceil(x) Redondeo al entero superior de x
floor(x) Redondeo al entero inferior de x
sin(x) Devuelve el seno de x
cos(x) Devuelve el coseno de x
tan(x) Devuelve el tangente de x
sec(x) Devuelve el secante de x
csc(x) Devuelve el cosecante de x
ctg(x) Devuelve el cotangente de x
gcd(x,y) Calcula el máximo común divisor entre x e y
lcm(x,y) Calcula el mínimo común múltiplo entre x e y
x(n) Regresa el n-ésimo elemento del vector x
x(n,m) Regresa el elemento que se encuentra en la fila n y columna m.
x(n,:) Devuelve todos los elementos de la fila n
rand(n,m) Crea una matriz aleatoria uniformemente distribuida de n×m, si se invoca con un solo escalar crea una matriz aleatoria cuadrada de n elementos
zeros(n,m) Crea una matriz n×m con sus elementos iguales a 0, si se invoca con un solo escalar crea una matriz cuadrada de n elementos
ones(n,m) Crea una matriz n×m con sus elementos iguales a 1, si se invoca con un solo escalar crea una matriz cuadrada de n elementos
sum(x) Devuelve la suma de los elementos del vector x o la suma de los elementos de cada columna de la matriz x
max(x) Devuelve el máximo para cada columna de la matriz x o el máximo de los elementos del vector x
min(x) Devuelve el mínimo elemento del vector x o el mínimo elemento para cada columna de la matriz x
sort(x) Ordena de menor a mayor los elementos del vector x

Sistemas de ecuaciones


Para la solución de ecuaciones lineales usamos a\b.

3x+2y+z=1
5x+3y+4z=2
x+y-z=1

octave:1> a=[3,2,1; 5,3,4; 1,1,-1]
a =

   3   2   1
   5   3   4
   1   1  -1

octave:2> b=[1;2;1]
b =

   1
   2
   1

octave:3> a\b
ans =

  -4.00000
   6.00000
   1.00000


Lo que se interpreta como "x = -4", "y = 6" y "z = 1".

Crear scripts y funciones


Bueno como ya vimos octave es una gran herramienta para hacer cálculos matemáticos y es muy bueno en el manejo de matrices, pero hasta ahora solo hemos hecho algunas cosas simples desde línea de comandos, lo cual no suele ser algo viable cuando se necesita crear un procesamiento un poco más complejo.

Por lo que tenemos la opción de poder escribir el código en un archivo, y darle la extensión .m reconocida por octave, en la cual podemos escribir todas las operaciones, además de hacer uso de ciclos y condiciones, al escribir de forma continua las operaciones tal y como las haríamos desde línea de comandos, lo llamamos script, y aquí tenemos un ejemplo.

Es un ejemplo tal vez un poco tonto o sin sentido, pero la idea es poner de ejemplo el uso de la sentencia for y los if else. Lo que hace es crear un vector de 7 elementos, y mediante el ciclo for pasamos de elemento por elemento, si el número es mayor a 0.5 escribe "Alto" y en caso contrario "Bajo".


Desde línea de comandos dentro de octave, basta con escribir el nombre del archivo donde escribimos nuestro código y veremos su ejecución.

octave:1> simplescript
0.766650 = Alto
0.778489 = Alto
0.651956 = Alto
0.715153 = Alto
0.389429 = Bajo
0.608944 = Alto
0.429080 = Bajo
octave:2>

Y también podemos crear nuestras propias funciones, que reciban parámetros y que den como salida algún resultado, o que al llamarlas hagan alguna acción, en este caso recibe el nombre de un archivo y un número N, crea el archivo y hace una lista de N filas enumeradas desde 0 a N y coloca un número aleatorio.


Es importante saber que los archivos deben de estar en la carpeta desde donde se ejecuta "octave" para poder hacer uso de las funciones, en otro caso tendría que ponerse la ruta para llegar al archivo del script o la función.

Gráficas 2D y 3D


Y como ya alargue demasiado esta entrada, ya no me extiendo mucho en la creación de gráficas desde Octave, ya que en realidad ocuparía una entrada del largo de esta para hacer cosas buenas, pero veamos esta gran utilidad que nos provee con unos simples ejemplos escritos desde la línea de comandos y la gráfica que resulta de cada una.

octave:1> x = rand(30,1);
octave:2> plot(x)


La siguientes líneas las obtuve de un tutorial mencionado al final en referencias, y dan como resultado la creación de una gráfica tridimensional.

octave:1> x=[-2:0.1:2];
octave:2> [xx,yy]=meshgrid(x,x);
octave:3> z=sin(xx.^2 - yy.^2);
octave:4> grid
octave:5> mesh(x,x,z)


Fue un poco extensa la entrada, pero trate de abarcar todos los aspectos fundamentales de octave, y espero les sea de ayuda.

Referencias:
Introducción a GNU Octave
Octave Ubuntu
GNU Octave - Wikipedia
Manual de Octave
Tutorial rápido de Octave

3 comentarios:

Nota: solo los miembros de este blog pueden publicar comentarios.