Introducción a Octave -...

50
INTRODUCCI ´ ON A GNU OCTAVE Francisco Javier Arag´ on Artacho Departamento de Estad´ ıstica e Investigaci´ on Operativa Universidad de Alicante Diciembre 2010

Transcript of Introducción a Octave -...

Page 1: Introducción a Octave - Computacion1-Solercomputacion1-soler.wikispaces.com/file/view/Introduccion+a+GNU...Es posible restablecer el valor de constantes del sistema mediante el comando

INTRODUCCION A

GNU OCTAVE

Francisco Javier Aragon Artacho

Departamento de Estadıstica e Investigacion OperativaUniversidad de Alicante

Diciembre 2010

Page 2: Introducción a Octave - Computacion1-Solercomputacion1-soler.wikispaces.com/file/view/Introduccion+a+GNU...Es posible restablecer el valor de constantes del sistema mediante el comando

Contenido

1 Primeros pasos con Octave 31.1 Operadores basicos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 31.2 Asignacion de variables . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 41.3 Vectores y matrices . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 5

1.3.1 Matrices especiales . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 61.3.2 Operaciones con matrices y vectores . . . . . . . . . . . . . . . . . . . . . . . 7

1.4 Operadores logicos y de comparacion . . . . . . . . . . . . . . . . . . . . . . . . . . 101.5 Cadenas de texto . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 111.6 Salida y entrada de datos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 131.7 Algunos comandos utiles . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 14

2 Control de flujo de ejecucion 162.1 Sentencia condicional if . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 162.2 Bucle for . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 172.3 Bucles while y do . . .until . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 182.4 Sentencias break y continue . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 192.5 Sentencia switch . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 192.6 Sentencia try . . .catch . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 20

3 Funciones 213.1 Funciones anonimas . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 213.2 Funciones en lınea . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 213.3 El comando function . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 22

4 Graficos 254.1 En el plano: 2D . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 254.2 En el espacio: 3D . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 32

5 Cargar y guardar datos en archivos 405.1 Datos numericos y funciones . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 405.2 Graficos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 405.3 Imagenes . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 41

6 Ejemplos practicos 436.1 Calculo aproximado de pi . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 436.2 Billetes y monedas . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 446.3 Edicion de una imagen . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 456.4 Metodo del trapecio . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 47

Indice de comandos 50

2

Page 3: Introducción a Octave - Computacion1-Solercomputacion1-soler.wikispaces.com/file/view/Introduccion+a+GNU...Es posible restablecer el valor de constantes del sistema mediante el comando

1 Primeros pasos con Octave

En esta seccion comenzaremos viendo los operadores basicos en Octave que nos permiten definir yhacer operaciones con escalares, vectores y matrices, ası como con “cadenas de texto”. Veremos comoutilizar los operadores logicos (con los cuales podremos hacer comparaciones logicas de tipo 0/1 overdadero/falso) y finalizaremos con unos cuantos comandos que pueden sernos utiles.

1.1 Operadores basicos

• +,−,∗,/ son los operadores suma, resta, multiplicacion y division, respectivamente. Con ( )agrupamos las operaciones.

>>> 8+5∗ (9−3)/2ans = 23

• ∧,∗∗ son dos formas de escribir el operador de potencia.

>>> 8∧2ans = 64>>> 8∗∗2ans = 64

• Para calcular la raız cuadrada se usa sqrt.

>>> sqrt(2)ans = 1.4142

• El valor absoluto se obtiene con la funcion abs.

>>> abs(−3.5)ans = 3.5

• El numero complejo i se puede escribir de varias formas: i,j,I,J.

>>> sqrt(−1)ans = 0+1i

• Las funciones trigonometricas mas usuales son sin,cos,tan,asin,acos,atan (seno, coseno,tangente, arcoseno, arcocoseno, arcotangente).

>>> cos(pi)ans =−1

• Las funciones exponencial y logaritmo neperiano se obtienen con los comandos exp,log.

>>> exp(log(2))ans = 2

• Para mostrar mas o menos cifras decimales, usamos format long y format short. Para otrasopciones, vease en la ayuda con help format.

>>> format long>>> 1/7ans = 0.142857142857143>>> format short>>> 1/7ans = 0.14286

3

Page 4: Introducción a Octave - Computacion1-Solercomputacion1-soler.wikispaces.com/file/view/Introduccion+a+GNU...Es posible restablecer el valor de constantes del sistema mediante el comando

1.2 Asignacion de variables

• Las variables se definen de forma muy sencilla con el operador “=”.

>>> a = 2;>>> 3∗aans = 6

Como podemos observar en este ejemplo, al escribir “;” al final de una sentencia ocultamos elresultado. Esto es util para no mostrar por pantalla resultados intermedios.

• Podemos definir varias variables a la vez si comparten un valor.

>>> a = b = c = 5;

Esto serıa equivalente a

>>> a = 5;b = 5;c = 5;

• Es posible restablecer el valor de constantes del sistema mediante el comando clear.

>>> pi = 5;2∗pians = 10>>> clear pi;pians = 3.1416

• Podemos aumentar el valor de una variable en una unidad mediante el operador “++”.

>>> a = 2;a++;aans = 3

El comando a++ es equivalente a escribir a = a+1. Es posible utilizar este operador dentrode cualquier expresion, en cuyo caso, dependiendo de si colocamos el operador “++” delante odetras de la variable tendra un comportamiento u otro. Al ponerlo a la derecha, primero se realizala operacion, y despues se incrementa el valor de la variable:

>>> a = 2;2+(a++)ans = 4>>> aans = 3

Si escribimos el operador a la izquierda de la variable, se incrementa el valor de la variable antesde realizar la operacion:

>>> a = 2;2+(++a)ans = 5>>> aans = 3

• El operador “−−” tiene un comportamiento similar al operador “++”, restando una unidad a lavariable.

• Con “+ =” podemos sumarle al valor de una variable el de otra. Por ejemplo

>>> a = 2; a+ = 4a = 6

serıa equivalente a escribir

>>> a = 2; a = a+4

De igual manera podemos restarle a una variable otra, multiplicarla, dividirla o elevarla, con losoperadores “−=”, “∗=”, “/ =” y “∧=”.

4

Page 5: Introducción a Octave - Computacion1-Solercomputacion1-soler.wikispaces.com/file/view/Introduccion+a+GNU...Es posible restablecer el valor de constantes del sistema mediante el comando

1.3 Vectores y matrices

• Los vectores fila se definen como numeros entre corchetes separados por comas o por espacios.Podemos realizar cualquier operacion con vectores, como multiplicar por un escalar:>>> v = [1,2,3];2∗vv =

2 4 6

• Para definir un vector columna, utilizamos punto y coma para separar las componentes.>>> w = [4;5;6]w =

456

• Es facil trasponer1 un vector (o matriz) mediante ′ (es el caracter que en los teclados espanolesaparece en la misma tecla que “?”).>>> w′

ans =4 5 6

• Podemos crear vectores de cualquier longitud cuyos elementos distan en una unidad mediante losrangos. La sintaxis es “PtoInicio : PtoFin”.>>> 1 : 5ans =

1 2 3 4 5

Para crear vectores con cualquier otro incremento, se usa “PtoInicio : Incremento : PtoFin”.>>> 10 :−2 : 1ans =

10 8 6 4 2

• Otra forma de crear vectores con valores equidistantes es mediante el comando linspace. Susintaxis es “linspace(Inicio,Fin,NumeroDePuntos)”.>>> linspace(1,2,5)ans =

1.0000 1.2500 1.5000 1.7500 2.0000

• Se puede obtener la longitud de cualquier vector mediante el comando length.>>> v = [2,4,8,−1]; length(v)ans = 4

• Las matrices se crean facilmente separando los elementos de una fila por comas (o espacios) y lasfilas por punto y coma.>>> A = [1,2,3;4,5,6;7,8,9]A =

1 2 34 5 67 8 9

1Realmente, el operador ′ calcula la traspuesta conjugada, que en el caso de matrices o vectores reales coincide con latraspuesta.

5

Page 6: Introducción a Octave - Computacion1-Solercomputacion1-soler.wikispaces.com/file/view/Introduccion+a+GNU...Es posible restablecer el valor de constantes del sistema mediante el comando

Mediante A(i,j) obtenemos el elemento de la fila i y la columna j de la matriz A.

>>> A(3,2)ans = 8

Es posible cambiar de forma sencilla cualquier elemento de una matriz, o introducir un nuevoelemento:

>>> A(1,1) = 0; AA =

0 2 34 5 67 8 9

>>> A(4,2) = 1

A =0 2 34 5 67 8 90 1 0

• El operador “:” sirve para seleccionar todos los elementos de una fila/columna en una matriz.

>>> A = [1,2,3;4,5,6;7,8,9]; A(2, :)ans =

4 5 6

Tambien podemos elegir elementos de una matriz (por ejemplo, una submatriz) mediante unvector que especifique las filas y/o columnas.

>>> A(2 : 3, [1,3])ans =

4 67 9

• El comando size nos devuelve un vector con las dimensiones de la matriz.

>>> A = [1,2,3;4,5,6]; size(A)ans =

2 3

• Se puede obtener el ultimo elemento de una fila o columna de una matriz o vector mediante end.

>>> A = [1,2,3;4,5,6]; A(end,1)ans = 4

1.3.1 Matrices especiales

• El comando rand nos permite crear numeros aleatorios2 distribuidos uniformemente en el inter-valo (0,1). Mediante rand(m,n) obtenemos una matriz de tamano m×n con elementos formadospor este tipo de numeros.

>>> rand(2,4)

0.832122 0.859706 0.078132 0.4235140.852109 0.752108 0.507478 0.197817

2En realidad se trata de numeros pseudoaleatorios. Para mas informacion, introducir “help rand” en Octave.

6

Page 7: Introducción a Octave - Computacion1-Solercomputacion1-soler.wikispaces.com/file/view/Introduccion+a+GNU...Es posible restablecer el valor de constantes del sistema mediante el comando

• La matriz identidad se obtiene con el comando eye.

>>> eye(3)ans =

1 0 00 1 00 0 1

• Para obtener una matriz de ceros3, usar el comando zeros.

>>> zeros(2)ans =

0 00 0

• Con el comando ones obtenemos una matriz de unos.

>>> ones(2,3)ans =

1 1 11 1 1

• Introduciendo diag(v) Octave nos devuelve una matriz con el vector v en la diagonal.

>>> diag([1,2,3])ans =

1 0 00 2 00 0 3

Escribiendo un segundo parametro diag(v,k) obtenemos una matriz con el vector v posicionadoen la k-esima diagonal superior (o inferior, si k < 0).

>>> diag([1,2,3],−1)ans =

0 0 0 01 0 0 00 2 0 00 0 3 0

Aplicado a una matriz, el comando diag devuelve su k-esima diagonal.

>>> A = [1,2,3;4,5,6;7,8,9]; diag(A)ans =

159

1.3.2 Operaciones con matrices y vectores

Es esencial tener siempre en cuenta que Octave ha sido disenado para trabajar con matrices. Es por elloque es necesario tener cuidado a la hora de utilizar operaciones como la multiplicacion, la division ola potencia, cuyo significado no es el mismo para escalares que para matrices. Esto suele originar lamayorıa de los fallos cuando utilizamos Octave.

3Es mas eficiente crear una matriz de ceros y luego cambiar los valores de sus elementos que crear una matriz vacıa e irrellenando sus valores (cuando se agranda una matriz, internamente se le asigna una nueva posicion en la memoria).

7

Page 8: Introducción a Octave - Computacion1-Solercomputacion1-soler.wikispaces.com/file/view/Introduccion+a+GNU...Es posible restablecer el valor de constantes del sistema mediante el comando

• Usaremos el producto ∗ para multiplicar cualquier matriz o vector por un escalar o por otra matriz.

>>> A = [1,1,1;0,1,0;0,1,1]; 5∗Aans =

5 5 50 5 00 5 5

>>> b = [1;2;3]; A∗bans =

625

>>> B = [0,0,2;1,5,4;3,2,1]; A∗Bans =

4 7 71 5 44 7 5

• Octave es capaz de elevar rapidamente una matriz a cualquier potencia, esto es, multiplicar lamatriz por sı misma un numero determinado de veces (por consiguiente la matriz debera sercuadrada). Para ello se usa el operador ∧. Ası A∧3 = A∗A∗A.

>>> A = [1,2,3;4,5,6;7,8,9]; A∧2ans =

30 36 4266 81 96102 126 150

• Es posible realizar operaciones elemento a elemento con vectores y matrices. Para ello solo hayque introducir un “.” antes del operador correspondiente. Ası tendrıamos las operaciones “.∗”,“.∧” o “./”. Con la suma y la resta no es necesario utilizarlo ya que ambas operaciones actuansiempre elemento a elemento.

>>> A = [1,2,3;4,5,6;7,8,9]; A.∧2ans =

1 4 916 25 3649 64 81

Comparar el resultado con el ejemplo previo.

• Para calcular la inversa de una matriz usaremos A∧−1 o inv(A).>>> A = [1,1,1;0,1,0;0,1,1]; A∧−1ans =

1 0 −10 1 00 −1 1

• El determinante de una matriz se obtiene con det.

>>> A = [1,1,1;0,1,0;0,1,1]; det(A)ans = 1

• Para resolver un sistema Ax = b, usaremos A\b. Octave lo resuelve con un algoritmo mucho maspreciso y rapido que si calculamos x = inv(A)∗b. Si la matriz A fuese singular, Octave devolvera

8

Page 9: Introducción a Octave - Computacion1-Solercomputacion1-soler.wikispaces.com/file/view/Introduccion+a+GNU...Es posible restablecer el valor de constantes del sistema mediante el comando

un mensaje de advertencia y calculara una solucion de norma mınima.>>> A = [1,2,1;3,5,2;3,2,1]; b = [1;2;3]; A\bans =

1.00000−1.000002.00000

• La funcion tril devuelve una matriz triangular inferior de una matriz dada. Introduciendo unsegundo argumento tril(A,k) especificamos cuantas diagonales por encima o por debajo de ladiagonal principal deben ser cero.>>> A = [1,2,3,4;5,6,7,8;9,10,11,12;13,14,15,16]; tril(A)ans =

1 0 0 05 6 0 09 10 11 013 14 15 16

>>> tril(A,1)ans =

1 2 0 05 6 7 09 10 11 1213 14 15 16

>>> tril(A,−1)ans =

0 0 0 05 0 0 09 10 0 013 14 15 0

• El comando triu se comporta como tril, pero devuelve una matriz triangular superior.

• Con poly obtenemos los coeficientes del polinomio caracterıstico de cualquier matriz.>>> poly([1,1,1;1,0,1;0,0,2])ans =

1.00000 −3.00000 1.00000 2.00000

• La funcion eig devuelve los autovalores de una matriz.>>> eig([1,1,1;1,0,1;0,0,2])ans =

1.61803−0.618032.00000

Se puede conseguir que la funcion eig nos devuelva tambien los vectores propios asociados aestos autovalores pidiendole 2 argumentos de salida, por ejemplo [V,L] = eig(A), en cuyo casoA∗V = V∗L.>>> [V,LAMBDA] = eig([1,1,1;1,0,1;0,0,2])V =

0.85065 −0.52573 0.801780.52573 0.85065 0.534520.00000 0.00000 0.26726

9

Page 10: Introducción a Octave - Computacion1-Solercomputacion1-soler.wikispaces.com/file/view/Introduccion+a+GNU...Es posible restablecer el valor de constantes del sistema mediante el comando

LAMBDA =

Diagonal Matrix

1.61803 0 00 −0.61803 00 0 2.00000

• El comando norm(v,k) permite calcular la norma de cualquier vector4 v = (v1, . . . ,vn). Pordefecto, si no se especifica k o si k = 2, calcula la norma euclıdea o L2, ‖v‖2 =

√v21 + . . .+v2n.

Otras opciones del parametro k son 1 para la norma L1, ‖v‖1 = |v1|+ . . .+ |vn|, e ”Inf” para lanorma L∞, ‖v‖∞ = max{|v1|, . . . , |vn|}.>>> v = [1,2,3,4]; norm(v)ans = 5.4772>>> norm(v,1)ans = 10

1.4 Operadores logicos y de comparacion

• En Octave el valor verdadero viene representado por 1 y falso por 0.

• El operador de comparacion de igualdad es ==. No debe confundirse con el operador de asig-nacion =. Si comparamos dos matrices obtendremos una matriz de unos y ceros, donde cadaelemento sera el resultado verdadero/falso de comparar ambas matrices.

>>> 2 == 3ans = 0>>> a = 2; a == 2ans = 1>>> A = [1,2,3;4,1,1]; A == 1ans =

1 0 00 1 1

• De manera similar se comportan los operadores de comparacion mayor estricto >, mayor o igual>=, menor estricto <, menor o igual <= y distinto ! =. Este ultimo tambien puede escribirsecomo5 ∼=.

>>> b = [1,2,3]; b > 1ans =

0 1 1>>> b! = 2ans =

1 0 1

• El comando all nos dice si todos los elementos de un vector son distintos de cero. En caso deemplearlo con una matriz, nos devuelve este resultado por columnas.

>>> b = [1,2,3]; all(b > 1)ans = 0

4Tambien calcula la norma de cualquier matriz, ver la ayuda para mas informacion.5El sımbolo ∼ se obtiene en un teclado espanol pulsando “Alt Gr”+ “4” y pulsando despues “espacio”.

10

Page 11: Introducción a Octave - Computacion1-Solercomputacion1-soler.wikispaces.com/file/view/Introduccion+a+GNU...Es posible restablecer el valor de constantes del sistema mediante el comando

>>> A = [1,2,3;4,1,1]; all(A <= 2)ans =

0 1 0

• El comando any nos dice si algun elemento es distinto de cero. Se utiliza de manera similar aall.

• El operador logico de conjuncion “y” se escribe en Octave con el sımbolo &. El valor de x&y es1 solo cuando x 6= 0 y y 6= 0. Su tabla de verdad es:

x y x&y0 0 00 1 01 0 01 1 1

Puede emplearse con vectores o matrices, en cuyo caso ofrecera una comparacion elemento aelemento.

>>> b = [−1,7,2,0,−3,4,5]; (b < 3)&(b! =−3)ans =

1 0 1 1 0 0 0

• El operador logico de disyuncion “o” se escribe6 con el sımbolo |. El valor de x|y es 1 si x 6= 0 osi y 6= 0. Su tabla de verdad es:

x y x|y0 0 00 1 11 0 11 1 1

Al igual que el operador & puede emplearse con vectores y matrices.

>>> b = [1,2,3,4,5,6]; (b < 3)|(b > 4)ans =

1 1 0 0 1 1

• El operador logico de negacion “no” se puede escribir de dos maneras: con el sımbolo ! o con elsımbolo sim. El valor de !x es 1 si x = 0. Su tabla de verdad es:

x !x0 11 0

Tambien puede emplearse con vectores y matrices.

>>> b = [1,2,3,4,5,6]; !((b < 3)|(b > 4))ans =

0 0 1 1 0 0

1.5 Cadenas de texto

Para escribir cadenas de texto en Octave tenemos dos opciones: escribir el texto entre comillas simples′ o entre comillas dobles ”.

>>> a =′ mi′; b = ”casa”;Es importante entender como Octave trata internamente las cadenas de texto. Podemos intuirlo si

6En un teclado espanol, pulsando “Alt Gr”+“1”.

11

Page 12: Introducción a Octave - Computacion1-Solercomputacion1-soler.wikispaces.com/file/view/Introduccion+a+GNU...Es posible restablecer el valor de constantes del sistema mediante el comando

sumamos a cualquier texto el numero cero:

>>> b+0ans =

99 97 115 97

En este ejemplo aparecen 4 numeros (tantos como letras tiene la palabra “casa”). Observamos que elsegundo numero es igual al ultimo. Esto ocurre porque Octave trata las cadenas de texto como si fueranmatrices. Los numeros representan el codigo ASCII7 extendido de cada letra. Podemos crear pues una“matriz” con las dos cadenas de texto definidas anteriormente:

>>> [a;b]ans =

micasa

Se pueden unir tambien horizontalmente:

>>> [a,” ”,b]ans = mi casa

Es sencillo trabajar con cadenas teniendo en cuenta que representan para Octave. Ası, si texto es unavariable que contiene cualquier cadena de texto, escribiendo texto(1) obtendremos la primera letra deesta palabra, con texto(end) la ultima, etc.

>>> b(2 : 3)ans = as

Para convertir cualquier vector con numeros entre 0 y 255 en una cadena de texto usaremos el comandochar.

>>> char([99,97,115,97])ans = casa Observar que la cadena que representa a cualquier numero es distinta al numero en sı. Porejemplo ”1” no es lo mismo que el numero 1:

>>> a =′ 1′; a+0ans = 49

Esto ocurre porque el codigo ASCII de ”1” es el 49. Sin embargo es posible convertir cualquier numeroescrito como cadena de texto en un numero con la funcion str2num:

>>> a =′ 1′; str2num(a)+0ans = 1

Tambien podemos realizar el proceso contrario con el comando num2str; esto es, convertir un numeroen una cadena de texto.

Un comando util cuando trabajamos con cadenas de texto es index, que busca una cadena de textodentro de otra y nos devuelve la posicion de la primera ocurrencia. Si no la encuentra, devuelve 0.

>>> index(”El coche de Carlos”,”coche”)ans = 4

Debemos siempre tener en cuenta que Octave distingue entre mayusculas y minusculas (ya que sucodigo ASCII es distinto):

>>> index(”El coche de Carlos”,”c”)ans = 4>>> index(”El coche de Carlos”,”C”)ans = 13

7ASCII es el acronimo ingles de American Standard Code for Information Interchange. Se trata de una tabla de 256caracteres que pueden ser representados mediante 8 bits.

12

Page 13: Introducción a Octave - Computacion1-Solercomputacion1-soler.wikispaces.com/file/view/Introduccion+a+GNU...Es posible restablecer el valor de constantes del sistema mediante el comando

1.6 Salida y entrada de datos

Los comandos de salida basicos son disp y printf.

• El comando disp nos muestra por pantalla el valor de una variable.

>>> disp(”El valor de pi es : ”); disp(pi)El valor de pi es :3.1416

• Con printf tenemos un control mayor del resultado que aparece en pantalla. Podemos especi-ficar operadores de conversion de las variables. Los mas usados son %d, %f y %s, que corre-sponden a numero entero, numero en punto flotante8 y cadena de texto, respectivamente. Veamosen unos ejemplos como funciona:

>>> a = 4; printf(”El valor de a es %d”,a)El valor de a es 4 >>>

Para conseguir introducir un salto de lınea, escribiremos \n.

>>> a = 4; printf(”El valor de a es %d\n”,a)El valor de a es 4

Aquı tenemos mas ejemplos con %f y %s:

>>> printf(”El valor de pi es%f\n.”,pi)El valor de pi es 3.141593.>>> nombre =′ Pedro′; printf(”¡Hola %s!\n”,nombre)¡Hola Pedro!

Es posible usar varias variables en una cadena de texto. Solo tendremos que introducir en el ordencorrespondiente las variables separadas por comas.

>>> a = 200; b = 50;>>> printf(”De las %d personas, solo %d iban disfrazadas\n.”,a,b)De las 200 personas, solo 50 iban disfrazadas.

Octave nos permite controlar la anchura mınima de una variable en punto flotante, ası como elnumero de decimales que apareceran por pantalla. La sintaxis es %ancho.decimalesf, dondeancho es un entero que representa la anchura mınima de la variable (incluyendo decimales y elsigno “.”) y decimales es el numero de decimales que mostrara. Si el tamano de la variable fuesemenor que la anchura especificada, se introduciran espacios. Por ejemplo:

>>> printf(”El valor de pi es%.10f\n.”,pi)El valor de pi es 3.1415926536.>>> printf(”%1.0f\n”,3.5); printf(”%2.0f\n”,3.5);44

En este ejemplo, como le hemos pedido que no muestre decimales, redondea el numero 3.5 a 4.Existen mas opciones, consultar el manual.

Como en la mayorıa de lenguajes de programacion, disponemos de la sentencia de entrada input quesolicita al usuario un valor.

>>> nombre = input(”¿Como te llamas?”)¿Como te llamas?

Octave esperara que el usuario introduzca un valor. Cuando pulse “Intro” lo que haya introducido pasaraa ser el valor de la variable nombre.

8Numeros con decimales.

13

Page 14: Introducción a Octave - Computacion1-Solercomputacion1-soler.wikispaces.com/file/view/Introduccion+a+GNU...Es posible restablecer el valor de constantes del sistema mediante el comando

1.7 Algunos comandos utiles

• La instruccion who muestra por pantalla los nombres de las variables definidas. La variante whosmuestra informacion mas detallada, incluyendo el tamano, el numero de bytes de memoria em-pleados en almacenar cada variable y el tipo de datos.

• Tenemos cuatro opciones para redondear un numero con decimales a entero: floor, ceil, fixy round. El comando floor(x) devuelve el mayor entero que sea menor o igual que x. Conceil(x) obtenemos el menor entero mayor o igual que x. La instruccion fix(x) nos da la parteentera de x. Por ultimo, round(x) redondea x hacia el entero mas proximo.

>>> floor([−1.3,−1.6,1.3,1.6])ans =−2 −2 1 1

>>> ceil([−1.3,−1.6,1.3,1.6])ans =−1 −1 2 2

>>> fix([−1.3,−1.6,1.3,1.6])ans =−1 −1 1 1

>>> round([−1.3,−1.6,1.3,1.6])ans =−1 −2 1 2

• La funcion rem(x,y) nos devuelve el resto de la division x./y, es decir, x−y.∗fix(x./y).>>> rem(10,4)ans = 2

• Para sumar elementos de un vector usaremos la funcion sum. Si la utilizamos con una matrizA, nos devolvera la suma de los elementos de cada columna. Para obtener la suma por filas,escribiremos sum(A,2).>>> A = [1,2,3;4,5,6]; sum(A)ans =

5 7 9>>> sum(A,2)ans =

615

• El producto de elementos de un vector o matriz se obtiene con la funcion prod. Su uso es similara sum.

• El comando clock nos proporciona un vector con la fecha y la hora actual del sistema en elsiguiente orden: [ano, mes, dıa, horas, minutos, segundos]. Con time obtenemos los segundostranscurridos desde el 1 de enero de 1970. En un principio podrıa parecer un dato bastante inutil,pero comparando dos valores de time podremos calcular el tiempo transcurrido en realizar unproceso. En el siguiente ejemplo lo utilizamos para calcular cuanto se tarda en obtener 100millones de numeros aleatorios y calcular su producto:

>>> t = time; prod(rand(1e8,1)); tiempo = time−t;>>> printf(”Tiempo transcurrido : %1.2f segundos\n”,time−t)Tiempo transcurrido : 4.22 segundos

14

Page 15: Introducción a Octave - Computacion1-Solercomputacion1-soler.wikispaces.com/file/view/Introduccion+a+GNU...Es posible restablecer el valor de constantes del sistema mediante el comando

Los comandos tic y toc tienen un fin similar. El primero no produce ningun resultado aparente,pero resulta como poner a cero un cronometro. Al introducir posteriormente toc nos dira lossegundos transcurridos desde que se ejecuto tic.

>>> tic; prod(rand(1e8,1)); tocElapsed time is 4.491 seconds.

• La funcion factor(n) nos devuelve la descomposicion en factores primos de n.

>>> factor(1150)ans =

2 5 5 23

15

Page 16: Introducción a Octave - Computacion1-Solercomputacion1-soler.wikispaces.com/file/view/Introduccion+a+GNU...Es posible restablecer el valor de constantes del sistema mediante el comando

2 Control de flujo de ejecucion

Vamos a estudiar las distintas sentencias que nos ofrece Octave para controlar el flujo de ejecucion de unalgoritmo. Estas sentencias nos permitiran dirigir el comportamiento de nuestro programa ante distintassituaciones, repetir procesos un numero determinado de veces o hasta que se cumpla cierta condicion,etc. Para ello disponemos de la sentencia condicional if, el bucle finito for, los bucles condicionadoswhile y do until, la sentencia switch y la sentencia try . . .catch. Ademas, con break y continuepodremos saltar iteraciones dentro de un bucle.

2.1 Sentencia condicional ifSe trata de una de las herramientas mas basicas, que esta disponible en todo lenguaje de programacionsensato. Nos permite evaluar si se cumple una condicion logica o no. Su forma mas sencilla serıa:

if condicionaccion

endif

Cuando ejecutemos este codigo, si condicion es cierta, se ejecutara accion. Veamos un ejemplo:

v=5;if v==3

printf("v vale 3\n")endif

El codigo anterior no devolverıa nada, ya que v tiene el valor 5. Solo ejecuta el comando printfcuando la condicion logica v == 3 sea cierta. Podrıamos estar interesados en que sucediera algo encaso contrario, esto es, cuando la condicion logica sea falsa. Es posible hacerlo usando else. Lasintaxis es la siguiente:

if condicionaccion1

elseaccion2

endif

En el ejemplo anterior, podrıamos escribir:

v=5;if v==3

printf("v vale 3\n")else

printf("v es distinto de 3\n")endif

Ahora al ejecutarlo nos devolverav es distinto de 3

Existe una tercera opcion, con elseif, mediante la cual podemos hacer que si la primera condicion noes cierta, evalue otras condiciones:

if condicion1accion1

elseif condicion2accion2

elseif condicion3accion3

...else

accionendif

16

Page 17: Introducción a Octave - Computacion1-Solercomputacion1-soler.wikispaces.com/file/view/Introduccion+a+GNU...Es posible restablecer el valor de constantes del sistema mediante el comando

Podrıamos utilizar tantos elseif como fuesen necesarios. En el ejemplito anterior:

v=5;if v==3

printf("v vale 3\n")elseif v==5

printf("v vale 5\n")else

printf("v es distinto de 3 y de 5\n")endif

2.2 Bucle forOtra de las herramientas claves en programacion son los bucles for, que nos permiten repetir una accionun numero finito de veces. Su sintaxis es:

for variable=expresionaccion

endfor

Su funcionamiento es el siguiente: variable va tomando de uno en uno los valores en expresion ypara cada uno de estos valores se ejecuta accion. Normalmente, expresion sera un rango como 1 : 100,un vector como [1,3,5,−2,1] o incluso una matriz. En el siguiente ejemplo sumamos9 los numeros de1 a 1000:

suma=0;for k=1:1000

suma=suma+k;endfordisp(suma)

En el siguiente ejemplo sumamos 1 a cada elemento de la matriz A definida con numeros aleatorios, ymostramos el resultado por pantalla:>>> A = rand(3)A =

0.57089 0.68758 0.271590.37951 0.90257 0.326290.26264 0.59358 0.76674

for j=Adisp(j+1);

endfor

>>> 1.57091.37951.26261.68761.90261.59361.27161.32631.7667

Podemos anidar varios bucles for, por ejemplo para recorrer los elementos de una matriz. El siguientealgoritmo define una matriz n×m cuyo elemento A(j,k) vale j∗k:

9Esta no serıa una forma eficiente de sumar los numeros del 1 al n. Una opcion preferible serıa escribir sum(1 : n), aunquela mas eficiente serıa usar la formula n(n+1)

2 .

17

Page 18: Introducción a Octave - Computacion1-Solercomputacion1-soler.wikispaces.com/file/view/Introduccion+a+GNU...Es posible restablecer el valor de constantes del sistema mediante el comando

n=2;m=3;for j=1:n

for k=1:mA(j,k)=j*k;

endforendforA

>>> A =1 2 32 4 6

2.3 Bucles while y do . . .until

Con la sentencia while podemos crear otro tipo de bucles que se ejecutaran hasta que se verifique ciertacondicion. Aunque son muy utiles, hay que llevar cuidado a la hora de usarlos, ya que podemos crearun bucle infinito si la condicion que imponemos nunca se verifica (lo cual colgarıa Octave). La sintaxises la siguiente:

while condicionaccion

endwhile

El codigo anterior se ejecuta si condicion tiene el valor verdadero, en cuyo caso, realizara accion yvolvera a verificar si se verifica condicion. Una vez iniciado un bucle while, se ejecutara la accionrepetidamente hasta que deje de verificarse la condicion. El siguiente bucle escribira los numeros del0 al 10:

a=0;while a<=10

disp(a);a=a+1;

endwhile

El siguiente bucle serıa infinito, ya que la condicion siempre es cierta (de hecho bloquea Octave):

a=0;while (a>-2)|(a<=10)

disp(a);a=a+1;

endwhile

Los bucles do . . .until son similares a los bucles while. La diferencia radica en el hecho de quela condicion es evaluada al final, en vez de al inicio del bucle, y el bucle no finaliza hasta que no severifique la condicion (al contrario que en un bucle while). Su sintaxis es:

doaccion

until condicion

En un bucle do . . .until la accion siempre se ejecutara al menos una vez. Veamos un ejemplo:

dox=rand

until x>0.6

El codigo anterior calcula un numero aleatorio entre 0 y 1 y lo muestra por pantalla, hasta que el numerocalculado sea mayor que 0.6.

18

Page 19: Introducción a Octave - Computacion1-Solercomputacion1-soler.wikispaces.com/file/view/Introduccion+a+GNU...Es posible restablecer el valor de constantes del sistema mediante el comando

>>> x = 0.48369x = 0.076110x = 0.13339x = 0.72870

2.4 Sentencias break y continue

Los comandos break y continue son bastante utiles. Con break escapamos de cualquier bucle for,while o do . . .until aunque el bucle no haya terminado. Por ejemplo, el siguiente codigo nos devuelveel valor k = 5, a pesar de que el bucle for llegarıa normalmente hasta 1000:

for k=1:1000if k==5

breakendif

endfordisp(k)

Con la sentencia continue saltamos al final del codigo de un bucle for, while o do . . .until, sinejecutar el resto del algoritmo y continua con el siguiente valor. Veamos un ejemplo:

for k=1:10if k==5

continueendifdisp(k)

endfor

El codigo anterior mostrarıa los numeros del 1 al 10 excepto el 5.

2.5 Sentencia switch

La sentencia switch es muy parecida a if. La sintaxis es:

switch xcase valor1

accion1case valor2

accion2...otherwise

accionendswitch

El codigo anterior serıa equivalente a escribir

if x==valor1accion1

elseif x==valor2accion2

...else

accionendswitch

En ciertos casos puede ser mas practico utilizar switch que un bucle if: el codigo puede ser mas clarode leer y mas facil de modificar. Tambien tiene la ventaja de que switch acepta comparaciones concadenas de texto del tipo

19

Page 20: Introducción a Octave - Computacion1-Solercomputacion1-soler.wikispaces.com/file/view/Introduccion+a+GNU...Es posible restablecer el valor de constantes del sistema mediante el comando

switch respuestacase "sı"

accion1case "no"

accion2otherwise

printf("Escriba sı o no")endswitch

Para hacer esto con if necesitarıamos usar el comando all, ya que para Octave una cadena de texto esun vector, y por tanto compararıa elemento a elemento. El codigo quedarıa:

if all(respuesta=="sı")accion1

elseif all(respuesta=="no")accion2

elseprintf("Escriba sı o no")

endif

Si quisieramos cambiar el nombre de la variable respuesta, con un codigo switch solo tendrıamosque cambiarlo en un lugar (al inicio), mientras que con if deberıamos cambiarlo en cada comparacion.

2.6 Sentencia try . . .catch

Para controlar posibles errores un comando util es try. Con el le pedimos a Octave que intente realizaruna accion. Si al hacerlo obtiene cualquier error, en vez de pararse le decimos que realice otra accion.Veamos su sintaxis:

tryaccion1

catchaccion2

end_try_catch

En el codigo anterior Octave intentara ejecutar accion1. Si se produjese un error, continuarıa normal-mente ejecutando accion2, en vez de accion1. El siguiente codigo intenta sumar al valor de x unaunidad. Si por ejemplo x no estuviera definida, en vez de sumarle una unidad, le da el valor cero.

tryx=x+1;

catchx=0;

end_try_catch

En catch podrıamos poner cualquier mensaje de advertencia al usuario.

20

Page 21: Introducción a Octave - Computacion1-Solercomputacion1-soler.wikispaces.com/file/view/Introduccion+a+GNU...Es posible restablecer el valor de constantes del sistema mediante el comando

3 Funciones

En esta seccion veremos como definir cualquier tipo de funcion en Octave. Existen tres tipos de fun-ciones: las funciones anonimas, funciones “en lınea” (del ingles inline) y las funciones definidas medi-ante el comando function. Los dos primeros tipos son usados para funciones matematicas sencillas,mientras que el tercer tipo se utiliza para crear algoritmos mas complicados.

En Octave podemos ver el codigo de cualquier funcion del sistema10, a diferencia de Matlabr, queal ser un software comercial, no nos permite saber que algoritmo hay detras de cada comando. Estaes una de las ventajas de Octave sobre Matlabr, ya que en el segundo estamos utilizando una “cajanegra” para obtener los resultados, sin poder saber como funcionan los algoritmos de las funciones queempleamos.

3.1 Funciones anonimas

Se trata de una de las formas mas sencillas de escribir una funcion en Octave. Para ello se utiliza elcomando @( ), especificando entre los parentesis la/s variable/s que emplea la funcion y escribiendo acontinuacion la funcion en sı. Por ejemplo, si quisieramos definir la funcion f(x) = x2 solo tendrıamosque introducir

>>> f = @(x) x∧2;Ahora podrıamos calcular el valor de la funcion en cualquier punto:

>>> f(2)ans = 4

Es conveniente definir las funciones de modo que sean aplicables a vectores y matrices. La funciondel ejemplo anterior no podrıa utilizarse con un vector, ya que al intentar multiplicar el vector darıaerror al no coincidir las dimensiones. Es por ello que es conveniente utilizar los operadores elemento aelemento, poniendo un “.” delante de operaciones como “∗”, “/” y “∧”, pues estas no actuan elementoa elemento cuando son aplicadas a matrices:

>>> f = @(x) x.∧2; f([1,2,3])ans =

1 4 9

Es igual de sencillo definir funciones de mas variables:

>>> g = @(x,y,z) x.∗y− (1+x)./(1+z.∧2); g(1,2,3)ans = 1.8000;>>> g([1,1], [2,3], [4,−2])ans =

1.8824 2.6000

3.2 Funciones en lınea

Resulta muy facil definir funciones en lınea utilizando el comando inline. Simplemente tendremosque escribir la funcion que deseemos definir entre comillas (simples o dobles). En realidad el comandoinline crea una funcion a partir de una cadena de texto. Veamos como se definirıa la funcion f(x) = x2:

>>> f = inline(”x.∧2”);f =f(x) = x.∧2

10El codigo de algunos comandos, como por ejemplo sort, no esta disponible. Esto ocurre porque son funciones compi-ladas con el fin de acelerar su ejecucion. Podemos encontrar todas las funciones en la carpeta “m” que es una de las subcarpetasque se encuentra dentro de la carpeta donde hayamos instalado Octave.

21

Page 22: Introducción a Octave - Computacion1-Solercomputacion1-soler.wikispaces.com/file/view/Introduccion+a+GNU...Es posible restablecer el valor de constantes del sistema mediante el comando

Tambien podemos definir funciones de mas variables. A la hora de llamar a la funcion, Octave usara elorden alfabetico para saber que valor corresponde a cada variable. Por ejemplo:>>> g = inline(”2.∗x+a.∧2+b”)g =f(a,b,x) = 2.∗x+a.∧2+b>>> g(1,2,3)ans = 9

Un comando util con las funciones en lınea es vectorize, que convierte cualquier operador quehayamos usado en un operador elemento a elemento, esto es, transforma cualquier aparicion de “∗”en “.∗”, “/” en “./”, etc.>>> f = inline(”x∧2+1/x”); f([1,2])>>> error : for A∧b, A must be squareerror : called from :error : at line −1, column −1

>>> g = vectorize(f)g =f(x) = x.∧2+1./x>>> g([1,2])ans =

2.0000 4.5000

3.3 El comando function

A la hora de definir funciones mas complejas disponemos de la sentencia function. En su forma massencilla tiene la siguiente sintaxis:

function nombrecomandos

endfunction

donde nombre es el nombre con el que llamaremos a la funcion11. Es posible definir funciones desdela consola en Octave. Sin embargo es mas practico hacerlo desde el editor, creando un fichero con ex-tension “.m” y cuyo nombre sea el mismo nombre que escribimos tras function. Debemos guardareste fichero en un lugar en el que Octave sea capaz de encontrarlo. Tenemos dos opciones: guardarloen una de las carpetas en las que Octave busca funciones12, o bien acceder al directorio correspondi-ente. Desde QtOctave podemos entrar facilmente a cualquier carpeta del sistema mediante el naveg-ador (la ventana que aparece por defecto en la esquina inferior izquierda), seleccionando el directoriodonde hayamos guardado nuestro archivo. Tambien es posible hacerlo directamente con el comando cdseguido de la ruta entre comillas:>>> cd ”F : /Documentos”Veamos una funcion sencilla:

function holaprintf("Hola Fran\n")

endfunction

Esta funcion debemos guardarla con el nombre hola.m, ya que de otro modo Octave no sera capaz dedetectarla. Ahora podemos llamar a nuestra funcion como si se tratara de cualquier otro comando delsistema:

11Evitar usar tildes, espacios, la letra “n” y caracteres extranos en el nombre de la funcion.12Escribiendo path Octave mostrara las carpetas en las que busca ficheros de funciones. Es posible anadir mas carpetas a

las existentes, para mas informacion introducir help path.

22

Page 23: Introducción a Octave - Computacion1-Solercomputacion1-soler.wikispaces.com/file/view/Introduccion+a+GNU...Es posible restablecer el valor de constantes del sistema mediante el comando

>>> holaHola Fran

Normalmente querremos que nuestra funcion acepte argumentos de entrada. En este caso escribiremos:

function nombre(ent1,ent2,...,entN)comandos

endfunction

donde ent1, . . . ,entN son los valores de entrada con los que el usuario llamara a la funcion. A contin-uacion mostramos una modificacion del ejemplo anterior.

function hola(nombre)printf("Hola %s\n",nombre)

endfunction

Ahora nuestra funcion hola acepta un valor de entrada:>>> hola(′Pedro′)Hola Pedro

Es muy sencillo definir valores por defecto de los argumentos de entrada. Solo tendremos que ponerarg=valor defecto cuando definamos la funcion. En la siguiente modificacion de hola, si el usuario nointroduce ningun argumento, el valor de la variable nombre sera ′Fran′.

function hola(nombre="Fran")printf("Hola %s\n",nombre)

endfunction

>>> holaHola Fran>>> hola(′Pedro′)Hola Pedro

Para especificar que nuestra funcion utilice el valor por defecto de un parametro debemos escribir :como valor de entrada de la funcion:>>> hola(:)Hola Fran

En la muchas ocasiones estaremos interesados en que nuestra funcion devuelva uno o varios valores desalida. Para esto escribiremos:

function [sal1,sal2,...,salM]=nombre(ent1,ent2,...,entN)comandos

endfunction

donde sal1,sal2, . . . ,salM son las variables de salida. No es necesario escribir los corchetes [ ] encaso de que solo necesitemos una variable de salida:

function valor=f(x)valor=x.ˆ2+1./x;

endfunction

Un ejemplo de funcion con dos valores de salida es el comando eig que hemos visto en la primeraseccion. Veamos otro ejemplo: imaginemos que queremos escribir una funcion que dado un vector vnos diga cual es el elemento maximo y en que posicion se encuentra13. En este caso, nuestra funcion,que llamaremos maximo tendra dos valores de salida: M que sera el valor maximo e id que guardara suposicion.

13Esta funcion viene ya predefinida (y compilada) en Octave, la funcion max, por lo que en realidad no serıa necesario crearuna nueva.

23

Page 24: Introducción a Octave - Computacion1-Solercomputacion1-soler.wikispaces.com/file/view/Introduccion+a+GNU...Es posible restablecer el valor de constantes del sistema mediante el comando

function [M,id]=maximo(v)M=v(1); id=1; n=length(v);for k=1:length(v)

if M<v(k)M=v(k); id=k;

endifendfor

endfunction

Escribimos la funcion anterior en la consola, o bien en el editor y la guardamos con el nombre maximo.m.>>> v = [1,4,2,7,−3,8,5,1]; [valor,posicion] = maximo(v)valor = 8posicion = 6

Dentro de cualquier funcion que definamos, contamos con dos variables especiales que pueden sernosbastante utiles: nargin y nargout. La primera toma el valor del numero de argumentos que hayaintroducido el usuario al llamar a la funcion; la segunda variable nargout nos devuelve el numero devariables que el usuario espera recibir de nuestra funcion. Veamos un ejemplo:

function pruebaprintf(’%d valores de entrada y %d valores de salida\n’,nargin,nargout)

endfunction

A continuacion llamamos a la funcion con un diferente numero de variables de entrada y salida:

>>> prueba0 valores de entrada y 0 valores de salida>>> prueba(1,2)2 valores de entrada y 0 valores de salida>>> [a,b,c] = prueba(1,2)2 valores de entrada y 3 valores de salida>>> error : value on right hand side of assignment is undefined

En el ultimo caso obtenemos un error debido a que estamos pidiendole a la funcion 3 valores de salida,cuando en realidad la funcion no devuelve ningun valor de salida. Las variables nargin y nargoutson utiles a la hora de escribir un algoritmo pues nos permiten controlar cuantos datos ha introducido elusuario y cuantos espera recibir de la funcion.

Finalizamos esta seccion con el comando return que finaliza una funcion aunque no haya termi-nado de ejecutar el codigo.

function k=prueba(n)for k=1:n

if k==10return

endifendfor

endfunction

>>> prueba(5)ans = 5>>> prueba(15)ans = 10

En la funcion anterior vemos que la ejecucion se detiene si k alcanza el valor 10 y devuelve el valor quek tenga en ese momento, sin finalizar de ejecutar el resto del algoritmo.

24

Page 25: Introducción a Octave - Computacion1-Solercomputacion1-soler.wikispaces.com/file/view/Introduccion+a+GNU...Es posible restablecer el valor de constantes del sistema mediante el comando

4 Graficos

4.1 En el plano: 2D

• El comando plot(x,y), donde x e y son vectores, dibuja una lınea en el plano que une consecuti-vamente los puntos

(x(1),y(1)

), . . . ,

(x(end),y(end)

). Este comando sera muy util a la hora de

dibujar graficas de funciones: solo tendremos que elegir un numero suficiente de puntos para queel grafico sea una buena aproximacion de la grafica real de la funcion.>>> x =−10 : 0.01 : 10;>>> plot(x,sin(x))

-1

-0.5

0

0.5

1

-10 -5 0 5 10

Podemos dibujar varias funciones a la vez:>>> plot(x,sin(x),x,cos(x))

-1

-0.5

0

0.5

1

-10 -5 0 5 10

Existen diversas opciones que pueden ser especificadas mediante el comando plot. Por ejemplo,mediante la opcion ′linewidth′ controlamos el grosor de la lınea. Con la opcion ′color′ pode-mos cambiar el color, introduciendo a continuacion un vector con 3 componentes RGB (rojo,

25

Page 26: Introducción a Octave - Computacion1-Solercomputacion1-soler.wikispaces.com/file/view/Introduccion+a+GNU...Es posible restablecer el valor de constantes del sistema mediante el comando

verde y azul) con valores entre 0 y 1. Tambien existen algunos colores predefinidos como ′red′,′green′, ′blue′ o ′yellow′. Para mas informacion, consultar el manual.>>> plot(x,x.∗cos(x),”color”, [1, .8, .6],”linewidth”,6)

-10

-5

0

5

10

-10 -5 0 5 10

Por defecto el comando plot dibuja puntos y los une con una recta (puede especificarse con laopcion ′−′). Es posible modificar este comportamiento con las opciones ′+′, ′∗′, ′o′, ′x′ y ′∧′.Usando una de estas opciones, plot dibujara uno de estos sımbolos:>>> x = linspace(−pi,pi,30); plot(x,sin(x),′o′)

-1

-0.5

0

0.5

1

-4 -3 -2 -1 0 1 2 3 4

Se puede cambiar el tamano de los marcadores anteriores con la opcion ′markersize′, especifi-cando despues un numero. Serıa interesante poder dibujar puntos rellenos, pero por algun prob-lema de Octave14 la opcion ′.′ solo produce puntos minusculos que no se ven afectados por elmodificador ′markersize′. Podemos sin embargo solucionar este problema facilmente dibujandocırculos con un tamano de pequeno y con una tamano de lınea gorda, con lo que conseguiremosla apariencia de puntos rellenos:>>> plot(x,sin(x),′o′,′markersize′,2,′linewidth′,5)

14En Matlabr sı que funciona correctamente.

26

Page 27: Introducción a Octave - Computacion1-Solercomputacion1-soler.wikispaces.com/file/view/Introduccion+a+GNU...Es posible restablecer el valor de constantes del sistema mediante el comando

-1

-0.5

0

0.5

1

-4 -3 -2 -1 0 1 2 3 4

• El comando area(x,y), donde x e y son vectores, se comporta como plot con la diferencia deque area pinta la grafica por debajo/arriba hasta el origen. Podemos cambiar el color con laopcion ”facecolor”.>>> x =−10 : 0.01 : 10;>>> area(x,sin(x),′facecolor′, [0,0.5,1])

-1

-0.5

0

0.5

1

-10 -5 0 5 10

Es posible cambiar la posicion hasta la cual rellena el grafico mediante un parametro adicional:>>> area(x,sin(x),0.5,′facecolor′, [0,0.5,1])

-1

-0.5

0

0.5

1

-10 -5 0 5 10

27

Page 28: Introducción a Octave - Computacion1-Solercomputacion1-soler.wikispaces.com/file/view/Introduccion+a+GNU...Es posible restablecer el valor de constantes del sistema mediante el comando

• Con axis off ocultamos los ejes de coordenadas. Para volver a mostrarlos, usar axis on.Mediante axis square conseguimos que ambos ejes midan lo mismo (y por tanto obtenemos undibujo cuadrado). Usando axis equal logramos que las longitudes en ambos ejes sean iguales.Tambien es posible especificar los ejes mediante axis([xmin,xmax,ymin,ymax]).

• Las figuras son las ventanas donde nos aparecen los graficos. Es posible crear nuevas figura me-diante el comando figure. Con figure(n) seleccionamos la figura activa (en la que se dibuja),donde n∈ N es un numero asignado a cada figura.

• Tras introducir hold on, Octave no creara una figura nueva cada vez que le pidamos que dibujeun grafico. Esto es util a la hora de dibujar varios graficos en una misma figura. Se restablece elcomportamiento con hold off.

• Introduciendo clf borramos la figura activa. Tambien podemos eliminarla escribiendo close.

• Para crear graficos en coordenadas polares, usaremos el comando polar(theta,rho).>>> polar(0 : 0.1 : 10∗pi,0 : 0.1 : 10∗pi)

-30

-20

-10

0

10

20

30

-30 -20 -10 0 10 20 30

• Es muy facil crear un grafico de sectores. Solo hay que introducir un vector con los porcentajesusando el comando pie.>>> pie([5,25,40,10,20]); axis off;

5%

25%

40%

10%

20%

28

Page 29: Introducción a Octave - Computacion1-Solercomputacion1-soler.wikispaces.com/file/view/Introduccion+a+GNU...Es posible restablecer el valor de constantes del sistema mediante el comando

Para otros tipos de graficos estadısticos consultar el manual.

• El comando grid on permite mostrar una rejilla de coordenadas. Para desactivarla escribiremosgrid off.

>>> x = linspace(−1,1,2000); plot(x,x.∗sin(1./x.∧2)); grid on;

-1

-0.5

0

0.5

1

-1 -0.5 0 0.5 1

• Al introducir box off eliminamos la caja que rodea por defecto a las graficas. Para mostrarlausaremos box on.

• Con fplot podemos dibujar varias funciones de forma sencilla, sin necesidad de definir previa-mente un vector x con valores:

>>> fplot(”sqrt(x)∗cos(1/x)”, [0, .1]); box off;

-0.4

-0.3

-0.2

-0.1

0

0.1

0.2

0.3

0.4

0 0.02 0.04 0.06 0.08 0.1

sqrt(x).*cos(1./x)

29

Page 30: Introducción a Octave - Computacion1-Solercomputacion1-soler.wikispaces.com/file/view/Introduccion+a+GNU...Es posible restablecer el valor de constantes del sistema mediante el comando

• ezplot nos permite tambien dibujar graficos de funciones sin tener que definir antes x. Si nose especifican los lımites dibuja por defecto entre −2π y 2π . Es posible especificar tambien elnumero de puntos que queremos dibujar:

>>> ezplot(”x∧2∗sin(1/x)”, [−.05, .05]︸ ︷︷ ︸lımites

, 1e4︸︷︷︸no puntos

)

-0.002

-0.001

0

0.001

0.002

-0.04 -0.02 0 0.02 0.04x

x2sin(1/x)

Podemos dibujar funciones definidas de forma implıcita, es decir, los puntos (x,y) tales queF(x,y) = 0 para una funcion F. Para ello solo debemos usar ezplot con una funcion dos variables(x,y) y Octave dibujara la funcion F(x,y) = 0.

>> ezplot(@(x,y) x.∧2+y.∧2−1,1000); axis equal;

-1

-0.5

0

0.5

1

-1 -0.5 0 0.5 1

y

x

x 2 + y 2 - 1 = 0

• Para ponerle un tıtulo a nuestro grafico usaremos el comando title. Para mostrar un nombre enlos ejes disponemos de los comandos15 xlabel e ylabel. Si queremos cambiar o introducir unaleyenda al grafico, usaremos legend.

15En dibujos en 3D disponemos tambien del comando zlabel.

30

Page 31: Introducción a Octave - Computacion1-Solercomputacion1-soler.wikispaces.com/file/view/Introduccion+a+GNU...Es posible restablecer el valor de constantes del sistema mediante el comando

>>> x =−2 : 0.01 : 2; plot(x,exp(−x.∧4),x,x.∗exp(−x.∧2),”color”,”red”);>>> title(”Mi grafico”); xlabel(”Eje x”); ylabel(”Eje y”);>>> legend(”exp(−x∧4)”,”x∗exp(−x∧2)”); axis([−2,2,−.5,1.2])

-0.4

-0.2

0

0.2

0.4

0.6

0.8

1

1.2

-2 -1.5 -1 -0.5 0 0.5 1 1.5 2

Eje

y

Eje x

Mi gráficoexp(-x4)

x*exp(-x2)

• Para introducir cualquier cadena de texto en un grafico usaremos text(posx,posy,”texto”),donde posx,posy son las coordenadas del ”texto” en el grafico. Se puede cambiar el tamanocon la opcion ”fontsize”. Existen mas parametros opcionales disponibles, consultar el manual.>>> text(1.1,2,”punto de inflexion”,”fontsize”,14)

• Con subplot(fil,col,id) podemos crear varios graficos dentro de una misma figura, dondefil es el numero de filas, col el numero de columnas, e id el ındice contando de izquierda aderecha por filas, empezando por arriba.>>> x =−1 : 1e−2 : 1;>>> subplot(2,3,1); plot(x,x.∧2); subplot(2,3,2); plot(x,x.∧3,”color”,”red”);>>> subplot(2,3,3); plot(x,sin(pi∗x),”color”, [0.6,0.4, .8]);>>> subplot(2,3,4); plot(x,x.∗sin(2∗pi∗x),”color”, [0, .7, .5]);>>> subplot(2,3,5); plot(x,exp(x).∗sin(2∗pi∗x),”color”, [0.6,0, .5]);>>> subplot(2,3,6); plot(x,x.∗exp(−x).∗sin(2∗pi∗x),”color”, [1,0.8,0]);

-2

-1.5

-1

-0.5

0

0.5

-1 -0.5 0 0.5 1-3

-2

-1

0

1

2

-1 -0.5 0 0.5 1-0.8

-0.6

-0.4

-0.2

0

0.2

0.4

-1 -0.5 0 0.5 1

-1

-0.5

0

0.5

1

-1 -0.5 0 0.5 1-1

-0.5

0

0.5

1

-1 -0.5 0 0.5 10

0.2

0.4

0.6

0.8

1

-1 -0.5 0 0.5 1

31

Page 32: Introducción a Octave - Computacion1-Solercomputacion1-soler.wikispaces.com/file/view/Introduccion+a+GNU...Es posible restablecer el valor de constantes del sistema mediante el comando

4.2 En el espacio: 3D

Para realizar graficos en dos dimensiones con el comando plot, hemos creado un vector de puntos xsobre los cuales calculabamos el vector y = f(x). El comando plot se encargaba de unir los pares(x(i),y(i)) por rectas. Para crear un grafico en tres dimensiones haremos algo similar, pero el procesoes ligeramente mas complicado. Ahora crearemos dos vectores de puntos x e y y calcularemos los pun-tos z = f(x,y) para todas las combinaciones posibles de puntos de x y de y. Necesitaremos pues crearuna rejilla con todas las combinaciones posibles. De ello se encarga el comando meshgrid:

>>> [X,Y] = meshgrid(−3 : 2︸ ︷︷ ︸vector x

, 3 : 2 : 9︸ ︷︷ ︸vector y

)

X =−3 −2 −1 0 1 2−3 −2 −1 0 1 2−3 −2 −1 0 1 2−3 −2 −1 0 1 2

Y =3 3 3 3 3 35 5 5 5 5 57 7 7 7 7 79 9 9 9 9 9

La funcion meshgrid crea dos matrices, que en este ejemplo hemos llamado X e Y. En la primeracopia el vector x′ por filas tantas veces como elementos tiene el vector y. En la segunda, el vector y escopiado por columnas tantas veces como filas tiene el vector x. De este modo tendremos dos matrices Xe Y cuya dimension sera length(y)×length(x), y los elementos (X(i,j),Y(i,j)) formaran todas lascombinaciones posibles de pares de elementos del vector x y del vector y. Solo quedara pues calcularla matriz z = f(x,y) y ası tendremos una nube de puntos en tres dimensiones:

>>> [X,Y] = meshgrid(−2 : 0.1 : 2,−2 : 0.1 : 2); Z = X.∗exp(−X.∧2−Y.∧2);

A continuacion mostramos los comandos mas utilizados.

• La funcion mesh crea una rejilla en 3D con los valores de las matrices (X,Y,Z).>>> mesh(X,Y,Z)

-2 -1.5 -1-0.5 0

0.5 1 1.5 2

-2-1.5

-1-0.5

00.5

11.5

2-0.8

-0.6

-0.4

-0.2

0

0.2

0.4

0.6

0.8

32

Page 33: Introducción a Octave - Computacion1-Solercomputacion1-soler.wikispaces.com/file/view/Introduccion+a+GNU...Es posible restablecer el valor de constantes del sistema mediante el comando

• El comando hidden off convierte la rejilla en transparente. Para volverla opaca (por defecto)introducir hidden on.

>>> mesh(X,Y,Z); hidden off;

-2 -1.5 -1-0.5 0

0.5 1 1.5 2

-2-1.5

-1-0.5

00.5

11.5

2-0.8

-0.6

-0.4

-0.2

0

0.2

0.4

0.6

0.8

• La variante meshc crea una rejilla en 3D con los valores de las matrices (X,Y,Z) y ademas muestraen el plano xy las curvas de nivel de la funcion.

>>> meshc(X,Y,Z)

-2 -1.5 -1-0.5 0

0.5 1 1.5 2

-2-1.5

-1-0.5

00.5

11.5

2-1.5

-1

-0.5

0

0.5

• Para crear un grafico solo con las curvas de nivel disponemos de los comandos contour, contourfy contour3. El primero crea una grafica en dos dimensiones con las curvas de nivel a partir delas matrices (X,Y,Z):

>>> contour(X,Y,Z)

33

Page 34: Introducción a Octave - Computacion1-Solercomputacion1-soler.wikispaces.com/file/view/Introduccion+a+GNU...Es posible restablecer el valor de constantes del sistema mediante el comando

-2

-1.5

-1

-0.5

0

0.5

1

1.5

2

-2 -1.5 -1 -0.5 0 0.5 1 1.5 2

El comando contourf es similar, pero pinta las areas entre las curvas de nivel.

>>> contourf(X,Y,Z)

-2

-1.5

-1

-0.5

0

0.5

1

1.5

2

-2 -1.5 -1 -0.5 0 0.5 1 1.5 2

Con contour3 crearemos un grafico en 3D con las curvas de nivel, donde cada curva estara a laaltura z que le corresponderıa en la grafica.

>>> contour3(X,Y,Z)

-2 -1.5 -1-0.5 0

0.5 1 1.5 2

-2-1.5

-1-0.5

00.5

11.5

2-0.4

-0.3

-0.2

-0.1

0

0.1

0.2

0.3

0.4

34

Page 35: Introducción a Octave - Computacion1-Solercomputacion1-soler.wikispaces.com/file/view/Introduccion+a+GNU...Es posible restablecer el valor de constantes del sistema mediante el comando

• Los comandos surf y surfc son similares a mesh y meshc. A diferencia de los ultimos, estoscolorean el interior de la rejilla.

>>> surf(X,Y,Z); axis([−2,2,−2,2,−0.5,0.5]);

-2 -1.5 -1-0.5 0

0.5 1 1.5 2

-2-1.5

-1-0.5

00.5

11.5

2-0.4

-0.2

0

0.2

0.4

Con shading podemos controlar la apariencia de los “pedazos” o “parches” que componen unasuperficie dibujada con surf. Disponemos de las opciones flat, faceted e interp. Por defectose representan las superficies con la opcion faceted, que dibuja los bordes de los “pedazos”.Introduciendo shading flat conseguiremos eliminar estos bordes. La opcion interp, interpolael color entre los distintos “parches” y hace invisible los vertices, dando la apariencia de una curvasuave sin bordes.

>>> shading flat

-2 -1.5 -1-0.5 0

0.5 1 1.5 2

-2-1.5

-1-0.5

00.5

11.5

2-0.4

-0.2

0

0.2

0.4

35

Page 36: Introducción a Octave - Computacion1-Solercomputacion1-soler.wikispaces.com/file/view/Introduccion+a+GNU...Es posible restablecer el valor de constantes del sistema mediante el comando

>>> shading interp

-2 -1.5 -1-0.5 0

0.5 1 1.5 2

-2-1.5

-1-0.5

00.5

11.5

2-0.4

-0.2

0

0.2

0.4

• Es posible cambiar los colores usados en los graficos con el comando colormap A, donde A esuna matriz con 3 columnas correspondientes a los matices RGB de cada color (fila). Podemoscrear una matriz de colores A o bien usar una de las predefinidas: autumn, bone, cool, copper,flag, gray, hot, hsv, jet, ocean, pink, prism, rainbow, spring, summer, white, winter.Se puede restablecer la configuracion por defecto (jet) introduciendo colormap default.>>> [X,Y] = meshgrid(−3∗pi : 0.5 : 3∗pi,−3∗pi : 0.5 : 3∗pi);>>> Z = sin(sqrt(X.∧2+Y.∧2))./sqrt(X.∧2+Y.∧2);>>> surf(X,Y,Z); colormap cool;

-10-5

05

10

-10

-5

0

5

10-0.4

-0.2

0

0.2

0.4

0.6

0.8

1

El comando plot3 nos permite dibujar curvas parametricas en el espacio. Dados tres vectores(x,y,z), dibuja una lınea que une sucesivamente los puntos: (x(1),y(1),z(1)) con (x(2),y(2),z(2)),

36

Page 37: Introducción a Octave - Computacion1-Solercomputacion1-soler.wikispaces.com/file/view/Introduccion+a+GNU...Es posible restablecer el valor de constantes del sistema mediante el comando

(x(2),y(2),z(2)) con (x(3),y(3),z(3)), etc. Para dibujar la curva parametrica {x= f(t),y= g(t),z=t}, solo tendremos pues que crear un vector de valores t y a partir de el los vectores x = f(t) e y = g(t),y finalmente representar los puntos con plot3(x,y,t).>>> t = linspace(0,2∗pi,1000); x = 5∗cos(5∗t); y = 5∗sin(5∗t);>>> plot3(x,y,t);

-6-4

-20

24

6

-6-4

-20

24

60

1

2

3

4

5

6

7

Para realizar dibujos en el plano disponıamos del comando ezplot con el cual se puede representaruna funcion sin tener que definir previamente un conjunto de puntos. En el espacio disponemos tambiende comandos similares:

• ezplot3 dibuja una curva definida de forma parametrica mediante funciones.

>>> ezplot3(”t∗cos(t)”,”t∗sin(t)”,”t”, [0,10∗pi],1000);

x = tcos(t),y = tsin(t), z = t

-30-20

-100

1020

3040

x-30

-20-10

010

2030

y

0

5

10

15

20

25

30

35

• ezmesh dibuja una rejilla de una funcion.

>>> f = @(x,y) sqrt(abs(x.∗y))./(1+x.∧2+y.∧2); ezmesh(f, [−3,3]);

37

Page 38: Introducción a Octave - Computacion1-Solercomputacion1-soler.wikispaces.com/file/view/Introduccion+a+GNU...Es posible restablecer el valor de constantes del sistema mediante el comando

sqrt (abs (x y)) / (1 + x 2 + y 2)

-3-2

-10

12

3

x-3

-2-1

01

23

y

0

0.05

0.1

0.15

0.2

0.25

0.3

0.35

0.4

Pasandole tres funciones de dos variables al comando ezmesh conseguimos que realize un dibujode la funcion parametrica (fx(s,t),fy(s,t),fz(s,t)):

>>> fx = @(s,t) cos(s).∗cos(t); fy = @(s,t) sin(s).∗cos(t); fz = @(s,t) sin(t);>>> ezmesh(fx,fy,fz, [−pi,pi,−pi/2,pi/2],20);

x = cos (s) cos (t),y = sin (s) cos (t), z = sin (t)

-1-0.5

00.5

1

s-1

-0.5

0

0.5

1

t

-1

-0.5

0

0.5

1

• ezsurf se comporta como ezmesh pero pintando el interior de la rejilla:>>> ezsurf(fx,fy,fz, [−pi,pi,−pi/2,pi/2],20);

-1-0.5

00.5

1

-1

-0.5

0

0.5

1-1

-0.5

0

0.5

1

x = cos (s) cos (t),y = sin (s) cos (t), z = sin (t)

st

38

Page 39: Introducción a Octave - Computacion1-Solercomputacion1-soler.wikispaces.com/file/view/Introduccion+a+GNU...Es posible restablecer el valor de constantes del sistema mediante el comando

• ezcontour dibuja las curvas de nivel de una funcion.

>>> ezcontour(”sqrt(abs(x.∗y))./(1+x.∧2+y.∧2)”, [−2,2],200)

-2

-1.5

-1

-0.5

0

0.5

1

1.5

2

-2 -1.5 -1 -0.5 0 0.5 1 1.5 2

y

x

sqrt(abs(x y)) / (1 + x2 + y2)

En el ejemplo anterior, el intervalo [−2,2] son los valores mınimo y maximo de ambos ejes, y200 es el numero de puntos. La variante ezcontourf pinta las areas entre las curvas de nivel:

>>> ezcontourf(”sqrt(abs(x.∗y))./(1+x.∧2+y.∧2)”, [−2,2],200)

y

x

sqrt(abs(x y)) / (1 + x2 + y2)

-2

-1.5

-1

-0.5

0

0.5

1

1.5

2

-2 -1.5 -1 -0.5 0 0.5 1 1.5 2

39

Page 40: Introducción a Octave - Computacion1-Solercomputacion1-soler.wikispaces.com/file/view/Introduccion+a+GNU...Es posible restablecer el valor de constantes del sistema mediante el comando

5 Cargar y guardar datos en archivos

5.1 Datos numericos y funcionesLos comandos save y load permiten, respectivamente, guardar y cargar datos en Octave de forma facil.Con save podemos guardar variables, matrices y funciones; datos que podremos recuperar posterior-mente con load durante otra sesion sin necesidad de tener que introducirlos o calcularlos de nuevo. Lasintaxis del comando save es (la de load es similar):save nombre.extension dato 1 dato 2 . . . dato ndonde nombre es el nombre del fichero a guardar, extension es la extension del fichero (por ejemplotxt), y dato 1 dato 2 . . . dato n son los datos (variables, matrices y/o funciones) que queremos guardar(cargar, en el caso de load). Veamos un ejemplo sencillo, donde crearemos una matriz aleatoria A detamano 4×4 con numeros enteros entre 0 y 9, y una funcion f. Guardaremos en el fichero “datos.txt”la matriz A, la funcion f y la matriz f(A). Para almacenar f(A) debemos asignar su valor a una variable(matriz) B.>>> A = floor(rand(4)∗10); f = @(x) x.∗sin(x.∧2); B = f(A);>>> save datos.txt A f BLa funcion save creara un fichero llamado “datos.txt” en el directorio donde estemos trabajando. Elcontenido de este fichero sera semejante a:

# Created by Octave 3.2.4, Sat Dec 18 19:16:44 2010 Hora estandar romance <unknown@unknown># name: A# type: matrix# rows: 4# columns: 46 8 0 76 6 3 95 7 2 96 9 2 5# name: f# type: function handle@<anonymous>@(x) x .* sin (x .ˆ 2)# length: 2# name: .nargin.# type: scalar1# name: .nargout.# type: scalar1# name: B# type: matrix# rows: 4# columns: 4-5.950673120658695 7.360208305574325 0 -6.676268569316303-5.950673120658695 -5.950673120658695 1.23635545572527 -5.668991948470085-0.6617587504888651 -6.676268569316303 -1.513604990615856 -5.668991948470085-5.950673120658695 -5.668991948470085 -1.513604990615856 -0.6617587504888651

En una sesion posterior podrıamos cargar todos estos datos (o solo algunos, en cuyo caso debemosespecificar cuales tras el nombre del fichero):

>>> load datos.txt

5.2 Graficos

Es posible guardar la figura actual (el grafico) en un archivo mediante el comando print. Admitemultitud de formatos en los que almacenar la imagen; entre ellos los mas usuales son pdf, eps y jpg. Laopcion para especificar el formato es “−d” seguido del formato en el que queremos guardar la imagen.Ası, los tres formatos anteriores serıan “−dpdf”, “−depsc” y “−djpg” (usaremos “−depsc” para queguarde la figura en color, ya que la opcion “−deps” lo hace en escala de grises). A la hora de incrustarun grafico en un documento de LATEXes preferible usar archivos pdf o eps, ya que son mas pequenos y

40

Page 41: Introducción a Octave - Computacion1-Solercomputacion1-soler.wikispaces.com/file/view/Introduccion+a+GNU...Es posible restablecer el valor de constantes del sistema mediante el comando

ofrecen una calidad mucho mayor16. El comando plot admite otras opciones, vease la ayuda.El resultado puede no ser muy satisfactorio en el caso de ficheros eps y pdf, principalmente porque

el tamano del texto de los graficos aparece muy pequeno. Ademas suele dejar bastante espacio en blancoalrededor del grafico, por lo que al incluirlo en un documento LATEX no queda ajustado al texto. Paraevitar estos problemas, es aconsejable usar las siguientes funciones:

function eps(nombre)papersize=[30,21]/9;set(gcf,"papersize",papersize);set(gcf,"paperposition",[0,0,papersize]);print("-depsc", strcat(nombre,".eps"))

endfunction

function pdf(nombre)set(gcf,"paperorientation","landscape");papersize=[30,21]/2.54;set(gcf,"papersize",papersize);set(gcf,"paperposition",[0,0,papersize]);print(strcat(nombre,".pdf"))

endfunction

Guardando cada funcion en un archivo “.m” (la primera en “eps.m” y la segunda en “pdf.m”) dentrodel directorio de trabajo, resultara muy sencillo crear documentos eps y pdf adecuados. Solo tendremosque introducir uno de los siguientes comandos

>>> eps(”nombre”)>>> pdf(”nombre”)donde nombre es el nombre con el que queremos guardar el grafico sin la extension (las funcionesanteriores se encargan de introducirla).

5.3 Imagenes

Una imagen digitalizada es, basicamente, un conjunto de tres matrices de datos correspondientes a laintensidad de cada componente RGB (rojo, verde y azul; del ingles Red, Green, Blue) de cada pıxelde la imagen17. En Octave es posible utilizar 256 intensidades distintas de cada uno de estos colores,lo que proporciona un total de casi 16,8 millones de colores distintos18. Por tanto cualquier imagenquedara determinada al especificar que cantidad de cada uno de estos colores se debe utilizar en cadauno de los pıxeles que la forman. Necesitarıamos 8 bits para almacenar la informacion de la intensidadde cada color RGB en cada pıxel, lo cual requerirıa unos archivos de gran tamano para albergar toda estainformacion. Es por eso que normalmente las imagenes se encuentran comprimidas, siendo el formatomas usual en la actualidad el jpg.

Con Octave es muy facil obtener la informacion de una imagen en una matriz mediante el comandoimread, el cual es capaz de leer multitud de formatos. Su sintaxis es

hip mat = imread(”nombre archivo”)donde hip mat es la hipermatriz19 en la que queramos guardar los datos de la imagen. Por ejemplo:

16Los archivos pdf y eps guardan la informacion del grafico de forma vectorial en vez de convertirlo a un mapa de pıxelescomo hacen los jpg (en los cuales ademas se pierde calidad al comprimirse la informacion).

17Cualquier color se puede obtener como la composicion de los colores primarios rojo, verde y azul.182563 = 16.777.216≈ 16,8 millones de colores.19Las hipermatrices son una generalizacion del concepto de matriz. Una matriz tiene dos dimensiones: filas (dimension 1)

y columnas (dimension 2). Una hipermatriz de 3 dimensiones de tamano m×n×k podrıamos imaginarla en el espacio comoun cubo, y estarıa formada for k matrices de tamano m×n. Octave permite trabajar con hipermatrices de cualquier dimension,no solo 3.

41

Page 42: Introducción a Octave - Computacion1-Solercomputacion1-soler.wikispaces.com/file/view/Introduccion+a+GNU...Es posible restablecer el valor de constantes del sistema mediante el comando

>>> A = imread(”Irlanda.jpg”);La imagen “Irlanda.jpg” tiene un tamano 600× 800, por lo que la hipermatriz A tendra un tamano600×800×3 (tendremos 3 matrices A(:, :,1), A(:, :,2) y A(:, :,3) de tamano 600×800, una para cadacolor).

Para mostrar imagenes en pantalla podemos usar dos comandos: imshow e image. Su compor-tamiento es bastante similar, aunque imshow tiene la ventaja de no mostrar los ejes y de poder mostrarimagenes en blanco y negro (las cuales son bidimensionales).

>>> imshow(A);

Si quisieramos guardar la imagen anterior (por ejemplo, tras modificarla o editarla) en un archivode imagen, usaremos el comando imwrite:

>>> imwrite(A,”Irlanda2.jpg”)La sentencia anterior nos crearıa un nuevo archivo llamado “Irlanda2.jpg” que contendrıa la imagenalmacenada en la hipermatriz A.

42

Page 43: Introducción a Octave - Computacion1-Solercomputacion1-soler.wikispaces.com/file/view/Introduccion+a+GNU...Es posible restablecer el valor de constantes del sistema mediante el comando

6 Ejemplos practicos

En esta seccion veremos algunos algoritmos sencillos: un metodo bastante rudimentario para calculo elcalculo aproximado de π , un algoritmo que nos facilite la division de una cantidad dada en billetes ymonedas, la edicion de una imagen cualquiera, y el metodo del trapecio para la integracion aproximadade una funcion en un intervalo dado.

6.1 Calculo aproximado de π

Vamos a ver como ejemplo un metodo bastante simple para el calculo aproximado de π . La idea esla siguiente: si dibujamos un cırculo inscrito en un cuadrado de lado unitario (pongamos un metro) ylanzamos granos de arroz al aire, de forma aleatoria, contando los granos que caigan dentro del cırculo ydividiendolo por el numero total de granos que haya caıdo dentro del cuadrado nos dara una estimaciondel area del cırculo; que en este caso serıa π/4.

Ahora bien, ¿como podemos crear un algoritmo que realice este experimento por nosotros? Comence-mos por facilitar el analisis anadiendo unos ejes de coordenadas al dibujo anterior, haciendolo masgrande (con el cırculo de radio 1, en vez de 1/2) y dibujando solo un cuarto de circunferencia. Podemosrepresentar un grano de arroz por un punto (x,y) ∈ [0,1]× [0,1]. Para saber si el grano esta dentro delcırculo, solo tendremos que calcular su distancia al origen y ver si es menor o igual que 1:

0

0.2

0.4

0.6

0.8

1

0 0.2 0.4 0.6 0.8 1

(x,y)

43

Page 44: Introducción a Octave - Computacion1-Solercomputacion1-soler.wikispaces.com/file/view/Introduccion+a+GNU...Es posible restablecer el valor de constantes del sistema mediante el comando

Para “tirar aleatoriamente” los granos de arroz usaremos el comando rand. Vamos a ver dos algoritmosdistintos para resolver el problema: en el primero lanzaremos n granos de arena y contaremos losque hay dentro; en el segundo, lanzaremos un grano y repetiremos el experimento n veces. Podemostirar n granos de arroz con el comando rand(2,n), el cual nos construye una matriz aleatoria 2× ndonde cada columna representara un grano de arroz. Para calcular la distancia al origen de cada grano(x,y) necesitamos calcular

√x2 +y2 y contar los que su distancia sea menor o igual que 1. Podemos

ahorrarnos calcular La raız cuadrada, pues√x2 + y2 ≤ 1 ⇐⇒ x2 + y2 ≤ 1.

El calculo de cada componente x e y al cuadrado lo obtenemos con rand(2,n).∧2. Con el comandosum obtenemos la suma por columnas: sum(rand(2,n).∧2). Anadimos ahora la condicion <= 1 ysumamos para contar ası el numero de granos que cayeron dentro, esto es, sum(sum(rand(2,n).∧2) <= 1).Para obtener una aproximacion de π , como el area del cuarto de cırculo en la figura anterior es π/4,solo tendremos que multiplicar por 4 el numero de granos que cayeron dentro y dividirlo por el numerototal de granos lanzados n. Definimos una funcion con todo ello:>>> aprox pi = @(n)4∗sum(sum(rand(2,n).∧2) <= 1)/n;>>> aprox pi(1000)ans = 3.1200>>> aprox pi(1e7)ans = 3.1410

Observamos que el metodo no es muy preciso. Ademas, si intentamos repetir el experimento con n muygrande vamos a tener problemas de memoria:>>> aprox pi(1e8)>>> error : memory exhausted or requested size too large for range of Octave′s index type −− trying to return to prompt

Esto ocurre porque estamos creando y almacenando en memoria una matriz extremadamente grande.Podemos evitar este error considerando un algoritmo que en vez de “lanzar” todos los granos a la vez,lo haga de uno en uno y repita el proceso n veces, usando para ello un bucle for:

function p=aprox_pi(n)p=0;for k=1:n

p=p+(sum(rand(2,1).ˆ2)<=1);endforp=4*p/n;

endfunction

Este algoritmo podremos ejecutarlo con un tamano n tan grande como queramos, aunque es bastantemas lento que el anterior. Solo sera cuestion de tiempo obtener el resultado...

>>> tic; aprox pi(1e7); tocElapsed time is 380.1 seconds.

Quizas lo mas eficiente para el calculo aproximado de π por este metodo rudimentario sea una mezclade ambos algoritmos.

6.2 Billetes y monedas

Imaginemos que queremos construir un algoritmo para un banco o una tienda, de modo que dada unacantidad, nos la descomponga en billetes de 500, 200, 100, 50, 20 y 5 y en monedas de 2, 1, 0.50, 0.20,0.10, 0.05, 0.02 y 0.01. El objetivo es utilizar el menor numero de billetes y monedas posible, por lo quela solucion “devolver todo en centimos” no serıa valida. El siguiente algoritmo construye una funcionque realiza tal descomposicion.

44

Page 45: Introducción a Octave - Computacion1-Solercomputacion1-soler.wikispaces.com/file/view/Introduccion+a+GNU...Es posible restablecer el valor de constantes del sistema mediante el comando

function desc(c)printf("\n%.2f EUR pueden descomponerse en:\n\n",c)c=c*100; %Transformamos la cantidad a centimos para evitar errores de redondeoV=[50000,20000,10000,5000,2000,1000,500,200,100,50,20,10,5,2,1];for k=1:length(V)

numero=fix(c/V(k));if numero>0

if k<8texto1="billete";

elsetexto1="moneda";

endifif k<10

texto2="euros";valor=num2str(V(k)/100);

elseif k<15 %Distinguimos la moneda de 1 centimo (evita "1 centimos")texto2="centimos";valor=num2str(V(k));

elsetexto2="centimo";valor=num2str(V(k));

endifif numero>1

texto1=[texto1,"s"]; %Agregamos una ’s’ en caso de que sean variosendifprintf("%d %s de %s %s\n",numero,texto1,valor,texto2)c=round(rem(c,V(k))); %Redondeamos el resto (evita errores de aproximacion)

endifendfor

endfunction

>>> desc(1927.48)

1927.48 EUR pueden descomponerse en :

3 billetes de 500 euros2 billetes de 200 euros1 billete de 20 euros1 billete de 5 euros1 moneda de 2 euros2 monedas de 20 centimos1 moneda de 5 centimos1 moneda de 2 centimos1 moneda de 1 centimo

6.3 Edicion de una imagen

En este ejemplo vamos a manipular una imagen de una ardilla. Antes que nada es importante entendercomo es guardada una imagen en formato digital (vease la Seccion 5.3). Mostramos que con Octave esmuy sencillo cargar la informacion de una imagen en una matriz mediante imread(”NombreArchivo”).Veamos un ejemplo de una ardilla, guardada en el archivo “squirrel.jpg”.>>> A = imread(”squirrel.jpg”);>>> size(A)ans =

300 400 3

45

Page 46: Introducción a Octave - Computacion1-Solercomputacion1-soler.wikispaces.com/file/view/Introduccion+a+GNU...Es posible restablecer el valor de constantes del sistema mediante el comando

Vemos que se trata de una imagen de 300 pixels de alto por 400 pixels de ancho. La tercera dimensioncorresponde a cada color RGB. Mostramos la imagen con imshow:

>>> imshow(A)

La matriz tridimensional A contiene numeros enteros entre 0 y 255. Si dividimos A entre 2, conseguire-mos oscurecer la imagen, ya que el valor de cada color sera proporcionalmente mas bajo:

>>> imshow(A/2)

Multiplicando por 2 conseguirıamos el efecto contrario. Es facil conseguir un negativo de la imagen:solo tendremos que restar 255 a cada color de la matriz A para obtener el color complementario.

>>> imshow(255−A)

46

Page 47: Introducción a Octave - Computacion1-Solercomputacion1-soler.wikispaces.com/file/view/Introduccion+a+GNU...Es posible restablecer el valor de constantes del sistema mediante el comando

El siguiente codigo voltea la imagen horizontalmente guardandola en una matriz B :

[m,n,colores]=size(A);for k=1:n

B(:,k,:)=A(:,n+1-k,:);endforimshow(B)

Para voltearla verticalmente solo tendrıamos que modificar ligeramente el codigo anterior:

[m,n,colores]=size(A);for k=1:m

B(k,:,:)=A(n+1-k,:,:);endforimshow(B)

6.4 Metodo del trapecio

Se trata de un metodo numerico de integracion (por tanto aproximado) de una funcion dada f : R→R enun intervalo [a,b]. La idea no es muy complicada: la integral (area) de f puede aproximarse dividiendo

47

Page 48: Introducción a Octave - Computacion1-Solercomputacion1-soler.wikispaces.com/file/view/Introduccion+a+GNU...Es posible restablecer el valor de constantes del sistema mediante el comando

el intervalo [a,b] en n subintervalos y calculando una aproximacion de la integral en cada uno de estossubintervalos mediante el area de un trapecio.

ba xk xk+1

f

Cada subintervalo tiene longitud (b−a)/n, por lo que el area de cada uno de estos trapecios vale

f (xk)+ f (xk+1)2

· b−an

,

donde xk y xk+1 son dos puntos adyacentes.

f(xk+1 )

f(xk)

(b-a)/n

A continuacion mostramos un posible algoritmo que ademas de calcular la integral, ofrece la posi-bilidad de dibujar la grafica.

function suma=trapecio(f,a,b,n=1000,graf="n")%Por defecto divide [a,b] en 1000 subintervalos y no dibujaL=(b-a)/n;x0=a;suma=0;x=a;fx=f(x);for k=1:n

x1=x0+L;x=[x,x1];fx=[fx,f(x1)];% Usaremos los valores almacenados en el vector fx para ahorrar calculossuma=suma+(fx(k)+fx(k+1))/2*L;x0=x1;

endforif graf=="s"

xx=linspace(a,b,1000);clf;hold on;area(x,fx,’facecolor’,[0,0.5,1]);

48

Page 49: Introducción a Octave - Computacion1-Solercomputacion1-soler.wikispaces.com/file/view/Introduccion+a+GNU...Es posible restablecer el valor de constantes del sistema mediante el comando

plot(xx,f(xx),’r’,’linewidth’,3);for k=1:n

plot([x(k),x(k)],[0,fx(k)],’k’)endfor

endifendfunction

>>> trapecio(@(x)x.∧3,−1,1,8,”s”)ans = 0

-1

-0.5

0

0.5

1

-1 -0.5 0 0.5 1

49

Page 50: Introducción a Octave - Computacion1-Solercomputacion1-soler.wikispaces.com/file/view/Introduccion+a+GNU...Es posible restablecer el valor de constantes del sistema mediante el comando

Indice de comandos

abs, 3acos, 3all, 10any, 11area, 27asin, 3atan, 3axis, 28

box, 29break, 19

cd, 22ceil, 14char, 12clear, 4clf, 28clock, 14close, 28colormap, 36continue, 19contour, 33contour3, 33contourf, 33cos, 3

det, 8diag, 7disp, 13do. . . until, 18

eig, 9else, 16elseif, 16end, 6exp, 3eye, 7ezcontour, 39ezcontourf, 39ezmesh, 37ezplot, 30ezplot3, 37ezsurf, 38

factor, 15

figure, 28fix, 14floor, 14format, 3fplot, 29function, 22

grid, 29

hidden, 33hold, 28

if, 16image, 42imread, 41, 45imshow, 42, 46imwrite, 42index, 12inline, 21input, 13inv, 8

legend, 30length, 5linspace, 5, 26load, 40log, 3

max, 23mesh, 32meshc, 33meshgrid, 32

nargin, 24nargout, 24norm, 10num2str, 12

ones, 7

path, 22pie, 28plot, 25

’color’, 25’linewidth’, 25’markersize’, 26

plot3, 36polar, 28poly, 9print, 40printf, 13prod, 14

rand, 6, 40, 44rem, 14return, 24round, 14

save, 40shading, 35sin, 3size, 6sqrt, 3str2num, 12subplot, 31sum, 14surf, 35surfc, 35switch, 19

tan, 3text, 31tic, 15time, 14title, 30toc, 15tril, 9triu, 9try. . . catch, 20

vectorize, 22

while, 18who, 14whos, 14

xlabel, 30

ylabel, 30

zeros, 7zlabel, 30

50