Está en la página 1de 92

ManualdeiniciacinaGNUOctave

Autor:JosMaraValienteCifuentes
TrabajorealizadodentrodeunProyectoFindeCarreradirigidopor
CarlosMedranoSnchez
enlaE.U.PolitcnicadeTeruel
Ao2006

Licencia
Copyright(c)2006JosMaraValienteCifuentes

Permission is granted to copy, distribute and/or modify this document


underthetermsoftheGNUFreeDocumentationLicense,Version1.2or
any later version published by the Free Software Foundation; with no
InvariantSections,noFrontCoverTexts,andnoBackCoverTexts.Acopy
ofthelicenseisincludedinthesectionentitled"GNUFreeDocumentation
License",attheendofthedocument.

Manual de Iniciacin a GNU Octave

Manual
De
GNU Octave

Pg -1-

Manual de Iniciacin a GNU Octave

1. Operaciones Bsicas
1.1. Operaciones con matrices y vectores
1.1.1. Introduccin de matrices desde el teclado
1.1.2. Operaciones con matrices
1.1.3. Tipos de datos
1.1.3.1. Nmeros reales de doble precisin
1.1.3.2. Nmeros Complejos
1.1.3.3. Cadenas de caracteres
1.1.3.4. Otras formas de definir matrices
1.1.3.4.1 Tipos de matrices predefinidos
1.1.3.4.2 Formacin de una matriz a partir de otras
1.1.3.4.3 Direccionamiento de vectores y matrices a partir de
vectores
1.1.3.4.4 Operador <<Dos Puntos>> (:)
1.1.3.4.5 Definicin de matrices y vectores desde fichero
1.1.3.5. Operadores Relacionales
1.1.3.6. Operadores Lgicos
1.2. Funciones de Librera
1.2.1 Caractersticas Generales de las funciones de librera
1.2.2. Funciones matemticas elementales que operan de modo escalar
1.2.3. Funciones que actan sobre matrices
1.2.3.1 Funciones elementales
1.2.3.2 Funciones Especiales
1.2.3.3 Funciones de Factorizacin y/o Descomposicin Matricial
1.3. Ms sobre operadores relacionales con vectores y matrices
1.4. Otras funciones que actan sobre vectores y matrices
2. Otros tipos de datos de GNU Octave
2.1. Cadenas de caracteres
2.2 Hipermatrices (arrays de ms de dos dimensiones)
2.2.1 Definicin de Hipermatrices

Pg -2-

Manual de Iniciacin a GNU Octave


2.3 Estructuras
2.3.1 Creacin de Estructuras
2.3.2 Funciones para operar con Estructuras
2.4 Vectores o matrices de celdas (Cell Array)
2.4.1 Creacin de vectores y matrices de Celdas
2.4.2 Funciones para trabajar con vectores y matrices de celda
3. Programacin en GNU Octave
3.1. Bifurcaciones y bucles
3.1.1. Sentencia IF
3.1.2. Sentencia SWITCH
3.1.3. Sentencia FOR
3.1.4. Sentencia DO-UNTIL
3.1.5. Sentencia WHILE
3.1.6. Sentencia BREAK y CONTINUE
3.2 Ficheros *.m
3.2.1 Ficheros de Comandos (SCRIPTS)
3.2.2 Definicin de Funciones
3.2.3. HELP para las funciones de usuario
4. Grficos bidimensionales
4.1 Funciones grficas 2D elementales
4.1.1 Funcin PLOT
4.1.2 Estilos de Lnea y Marcadores para PLOT
4.1.3 Aadir Lneas a un grfico ya existente
4.1.4 Comando SUBPLOT
4.1.5 Control de los Ejes
4.2 Control de ventanas grficas: Funcin Figure
4.3 Otras funciones grficas 2-D
5. Grficos tridimensionales
5.1 Tipos de funciones grficas tridimensionales
5.1.1 Dibujo de lneas: Funcin PLOT3
5.1.2 Dibujo de mallados: Funciones MESHGRID, MESH Y SURF
5.1.3 Dibujo de lneas de contorno: Funcin CONTOUR
5.2. Elementos Generales: Ejes, Puntos de vista, lneas ocultas,

Pg -3-

Manual de Iniciacin a GNU Octave


6. Otros aspectos de GNU Octave
6.1 Guardar variables y estados de una sesin: Comandos save y load
6.2 Guardar sesin: Comando diary
6.3 Medida de tiempos y de esfuerzo de clculo
6.4. Funciones de funcin
6.4.1 Integracin numrica de funciones
6.4.2 Integracin Numrica de Ecuaciones Diferenciales Ordinarias

Pg -4-

Manual de Iniciacin a GNU Octave

1. Operaciones Bsicas

1.1. Operaciones con matrices y vectores


Como se coment en la introduccin que hemos visto en el punto anterior, GNU
Octave es un programa creado para trabajar con matrices, por lo tanto, este punto es
probablemente el ms importante y en el que mejor tenemos que aclararnos para
empezar a trabajar. Tenemos muchas opciones para trabajar con ellas, podemos
intercambiar matrices, permutarlas, invertirlas; GNU Octave es una herramienta de
clculo muy potente en lo que a matrices se refiere.

1.1.1. Introduccin de matrices desde el teclado


Las matrices y vectores son variables del programa cuyos nombres podemos
definir, siempre y cuando no utilicemos los caracteres que el programa tiene como
caracteres prohibidos.
Para definir una matriz en GNU Octave se determina el nmero de filas y de
columnas en funcin del nmero de elementos que se proporcionan (o se utilizan). Las
matrices se definen por filas; los elementos de una misma fila estn separados por
blancos o comas, mientras que las filas estn separadas por pulsaciones intro o por
caracteres punto y coma (;). Tomemos como ejemplo:

octave:31> a=[1 1; 2 5]

Cuya salida ser:


a =

A partir de este momento la matriz a est disponible para hacer cualquier tipo de
operacin con ella (adems de valores numricos, en la definicin de una matriz o
vector se pueden utilizar expresiones y funciones matemticas). Por ejemplo, una

Pg -5-

Manual de Iniciacin a GNU Octave


sencilla operacin con a es hallar su matriz traspuesta. En GNU Octave, el apstrofo
(') es el smbolo de trasposicin matricial. Para calcular a (traspuesta de a) basta
teclear lo siguiente (se aade a continuacin la respuesta del programa):
octave:32> a
ans =

Como el resultado de la operacin no ha sido asignado a ninguna otra matriz,


GNU Octave utiliza un nombre de variable por defecto (ans, de answer), que contiene
el resultado de la ltima operacin. La variable ans puede ser utilizada como operando
en la siguiente expresin que se introduzca. Tambin podra haberse asignado el
resultado a otra matriz llamada b.
Ahora vamos a definir una matriz b diferente para hacer operaciones bsicas
con estas 2 matrices:
octave:32> b=[7 6; 8 3]
b =

Comenzamos con las operaciones ms bsicas que podemos encontrar, la suma


y la resta de matrices:
octave:33> a + b
ans =

10

octave:34> a -b
ans =

-6

-5

-6

Si realizamos la multiplicacin de matrices con el operando * tendremos que


tener cuidado con que el nmero de columnas de la primera matriz debe coincidir con el
nmero de filas de la segunda:
Pg -6-

Manual de Iniciacin a GNU Octave


octave:35> a * b
ans =

15

54

27

Tambin podemos utilizar una multiplicacin elemento a elemento, que aunque


no tiene demasiado sentido como multiplicacin de matrices, si que es muy utilizable en
el caso de que la matriz no sea ms que un conjunto ordenado de valores.
octave:36> a .* b
ans =

16

15

A continuacin vamos a definir una nueva matriz a a partir de una funcin que
genera valores aleatorios entre 0 y 1.
octave:4> a=rand(3); #generar una matriz aleatoria de 3x3
octave:5> a
a =

0.6086115

0.0010003

0.3250563

0.4910289

0.2250230

0.4538064

0.6238124

0.5558372

0.9002053

Vamos ahora a crear una matriz 3x3 para realizar nuevos clculos a partir de una
matriz ms manejable si queremos comprobar a mano los datos que creamos.
octave:6> a=[1 2 1;1 2 3;4 3.4 4.5]
a =

1.0000

2.0000

1.0000

1.0000

2.0000

3.0000

4.0000

3.4000

4.5000

A partir de esta matriz a calculamos su inversa con el comando inv(a):


octave:7> b=inv(a)
b =

Pg -7-

Manual de Iniciacin a GNU Octave

-0.13043

-0.60870

0.43478

0.81522

0.05435

-0.21739

-0.50000

0.50000

0.00000

Podemos comprobar multiplicando una por la otra que el clculo es correcto:


octave:9> c=a*b
c =

1.00000

0.00000

0.00000

0.00000

1.00000

0.00000

0.00000

0.00000

1.00000

Si los valores no son exactos podemos utilizar el comando round() ya que


debido a los errores de aproximacin en los clculos podemos encontrar valores como
2.3e-109 que representa un valor extremadamente pequeo.

Si queremos comentar las lneas de cdigo que ejecutamos, a continuacin de la


operacin podemos poner un comentario anteponiendo el carcter # o %
octave:10> c=a*b #podemos ver que la matriz c es la matriz identidad

De igual manera que se define una matriz podemos definir un vector:


octave:49> b=[2 0 0]
b =

2 0 0
octave:50> b=[2 0 0]
b =

2
0
0

Como podemos observar, podemos definir vectores fila y vectores columna, con
slo hacer la traspuesta del vector en la definicin. Tambin podemos definir un vector
columna como si hicieramos una matriz de 1xn
octave:46> b=[1;0];

Como podemos ver, no hemos obtenido resultado tras realizar la operacin; esto
es debido a que hemos puesto un ; al final de la lnea de comando, esto hace que no
salga por pantalla lo que hemos ejecutado, cosa que resulta muy til cuando las
Pg -8-

Manual de Iniciacin a GNU Octave


matrices/vectores son de un nmero muy grande (100, 1000, ) y por lo tanto, difciles
de manejar visualmente.
En GNU Octave se accede a los elementos de un vector poniendo el ndice entre
parntesis (por ejemplo x(3) x(i)). Los elementos de las matrices se acceden poniendo
los dos ndices entre parntesis, separados por una coma (por ejemplo A(1,2) A(i,j)).
Las matrices se almacenan por columnas (aunque se introduzcan por filas, como se ha
dicho antes), y teniendo en cuenta esto puede accederse a cualquier elemento de una
matriz con un slo subndice. Por ejemplo, si A es una matriz (3x3) se obtiene el mismo
valor escribiendo A(1,2) que escribiendo A(4).

Pg -9-

Manual de Iniciacin a GNU Octave

1.1.2. Operaciones con matrices


GNU Octave puede operar con matrices por medio de operadores y por medio
de funciones. Se han visto ya los operadores suma (+), producto (*) y traspuesta ('), as
como la funcin invertir inv( ). Los operadores matriciales de GNU OCTAVE son los
siguientes:
+

adicin o suma

sustraccin o resta

multiplicacin

'

traspuesta

potenciacin

divisin-izquierda

divisin-derecha

.* producto elemento a elemento


./ y .\ divisin elemento a elemento
.^ elevar a una potencia elemento a elemento
Estos operadores se aplican tambin a las variables o valores escalares, aunque
con

algunas

diferencias.

Todos

estos

operadores

son

coherentes

con

las

correspondientes operaciones matriciales: no se puede por ejemplo sumar matrices que


no sean del mismo tamao. Si los operadores no se usan de modo correcto se obtiene un
mensaje de error.
Veamos un ejemplo del uso del divisor:
octave:45> #vamos a resolver un sistema de ecuaciones
octave:45> #x+y=1
octave:45> #2x+5y=0
octave:45> a=[1 1;2 5];
octave:46> b=[1;0];
octave:47> x=inv(a)*b
x =
1.66667
-0.66667

Pg -10-

Manual de Iniciacin a GNU Octave

octave:48> #por tanto x=1.6667 e y=-0.66667


octave:48> a\b
ans =

1.66667
-0.66667

Vase el siguiente ejemplo de tres ecuaciones formadas por una recta que no
pasa por el origen y los dos ejes de coordenadas:

octave:49> A=[1 2; 1 0; 0 1], b=[2 0 0]'


A =

b =

2
0
0

octave:50> x=A\b, resto=A*x-b


x =

0.33333
0.66667

resto =

-0.33333
0.33333
0.66667

Pg -11-

Manual de Iniciacin a GNU Octave

Vamos a ver como funcionan una serie de operadores:


octave:37> a/b

0.185185

-0.037037

1.259259

-0.851852

octave:38> a\b
ans =

9.0000

9.0000

-2.0000

-3.0000

Si los operadores / y \ van precedidos de un . La operacin se realiza elemento


a elemento:
octave:39> a./b
ans =

0.14286

0.16667

0.25000

1.66667

octave:40> a.\b
ans =

7.00000

6.00000

4.00000

0.60000

Podemos comprobar que premultiplicar con / es lo mismo que postmultiplicar con


\ .
octave:41> b./a
ans =

7.00000

6.00000

4.00000

0.60000

Pg -12-

Manual de Iniciacin a GNU Octave

1.1.3. Tipos de datos


GNU Octave trabaja siempre con el tipo Real de doble precisin, sobre el que se
implementan el resto de tipos, avanzados o no. Este tipo de dato se guarda con un
tamao de 8 bytes, que tiene un tamao de 15 cifras exactas. Adems del tipo Real,
podremos trabajar con strings, matrices, hipermatrices y estructuras ms avanzadas.

1.1.3.1. Nmeros reales de doble precisin

Los elementos constitutivos de vectores y matrices son nmeros reales


almacenados en 8 bytes (53 bits para la mantisa y 11 para el exponente de 2; entre 15 y
16 cifras decimales equivalentes). Es importante saber cmo trabaja GNU Octave con
estos nmeros y los casos especiales que presentan. GNU Octave mantiene una forma
especial para los nmeros muy grandes (ms grandes que los que es capaz de
representar), que son considerados como infinito. Por ejemplo, obsrvese cmo
responde el programa al ejecutar el siguiente comando:
octave:52> 1/0
warning: division by zero
ans = Inf

As pues, para GNU Octave el infinito se representa como inf Inf. GNU
Octave tiene tambin una representacin especial para los resultados que no estn
definidos como nmeros. Por ejemplo, ejectense los siguientes comandos y obsrvense
las respuestas obtenidas:
octave:51> 0/0
warning: division by zero
ans = NaN

La respuesta es NaN, que es la abreviatura de Not a Number. Este tipo de


respuesta, as como la de Inf, son enormemente importantes en GNU Octave, pues
permiten controlar la fiabilidad de los resultados de los clculos matriciales. Los NaN
se propagan al realizar con ellos cualquier operacin aritmtica, por ejemplo, cualquier

Pg -13-

Manual de Iniciacin a GNU Octave


nmero sumado a un NaN da otro NaN. GNU Octave tiene esto en cuenta. Algo
parecido sucede con los Inf.
Podemos encontrar 3 variables predefinidas por GNU Octave que nos dan los
valores mximos y mnimos de este tipo de datos:

eps

devuelve la diferencia entre 1.0 y el nmero de coma flotante

inmediatamente superior. Da una idea de la precisin o nmero de cifras


almacenadas. En un computador, eps vale 2.2204e-016.

realmin

devuelve el nmero ms pequeo con que se puede trabajar

(2.2251e-308)

realmax

devuelve el nmero ms grande con que se puede trabajar

(1.7977e+308)

1.1.3.2. Nmeros complejos (complex)


Muchas veces nos vamos a encontrar que el clculo que necesitamos ejecutar
nos lleva a tener que definir el cuerpo de los nmeros complejos, dado que el cuerpo de
los nmeros reales no es suficiente, por ejemplo, para realizar transformadas de Fourier
o Laplace. Para ello se define la variable compleja i o j:
octave:61> i
i = 0 + 1i
octave:62> j
j = 0 + 1i
octave:63> I
I = 0 + 1i
octave:64> 2J
J = 0 + 2i

Como podemos ver, se pueden definir tanto en mayscula como en minscula, y


que no es necesario el uso del operador * para multiplicarlo por un escalar. Debemos
tener la precaucin de no redefinir la variable i o j, ya que nos podra llevar a equvocos.
octave:63> i=2
i = 2

Podemos definir a su vez un nmero complejo con la funcin complex:


octave:77> complex(7,6)
ans = 7 + 6i

Es importante advertir que el operador de matriz transpuesta (), aplicado a


matrices complejas, produce la matriz transpuesta conjugada. Existe una funcin que

Pg -14-

Manual de Iniciacin a GNU Octave


permite hallar simplemente la matriz conjugada (conj()) y el operador punto y apstrofo
(.) que calcula simplemente la matriz transpuesta.
octave:78> conj(a)
ans = 1 - 1i

Esta funcin conj() puede ser empleada con escalares debido a que podemos
entender dicho escalar como una matriz de 1x1.

1.1.3.3. Cadenas de caracteres


Para crear una cadena de caracteres (string) en GNU Octave podemos hacerlo de
estos dos modos:
octave:79> s='cadena de caracteres'
s = cadena de caracteres
octave:80> s="cadena de caracteres"
s = cadena de caracteres

Debido a que para su uso es necesario un conocimiento previo de las funciones


orientadas a matrices, postpondr otras explicaciones hasta que se hayan explicado
stas, al igual que con los strings, se postpone la explicacin de hipermatrices, structs
y cell arrays.
Ya han aparecido algunos ejemplos de variables y expresiones matriciales.
Ahora se va a tratar de generalizar un poco lo visto hasta ahora. Una variable es un
nombre que se da a una entidad numrica, que puede ser una matriz, un vector o un
escalar. El valor de esa variable, e incluso el tipo de entidad numrica que representa,
puede cambiar a lo largo de una sesin de GNU OCTAVE o a lo largo de la ejecucin
de un programa. La forma ms normal de cambiar el valor de una variable es
colocndola a la izquierda del operador de asignacin (=).
Una expresin de GNU OCTAVE puede tener las dos formas siguientes:
primero, asignando su resultado a una variable,
variable = expresin

y segundo evaluando simplemente el resultado del siguiente modo, expresin


en cuyo caso el resultado se asigna automticamente a una variable interna de GNU
OCTAVE llamada ans (de answer) que almacena el ltimo resultado obtenido. Se
considera por defecto que una expresin termina cuando se pulsa intro. Si se desea que
una expresin contine en la lnea siguiente, hay que introducir tres puntos (...) antes de

Pg -15-

Manual de Iniciacin a GNU Octave


pulsar intro. Tambin se pueden incluir varias expresiones en una misma lnea
separndolas por comas (,) o puntos y comas (;). Si una expresin termina en punto y
coma (;) su resultado se calcula, pero no se escribe en pantalla. Esta posibilidad es muy
interesante, tanto para evitar la escritura de resultados intermedios, como para evitar la
impresin de grandes cantidades de nmeros cuando se trabaja con matrices de gran
tamao.
A semejanza de C, GNU OCTAVE distingue entre maysculas y minsculas
en los nombres de variables. A diferencia del lenguaje C, no hace falta declarar las
variables que se vayan a utilizar. Esto hace que se deba tener especial cuidado con no
utilizar nombres errneos en las variables, porque no se recibir ningn aviso del
ordenador. Cuando se quiere tener una relacin de las variables que se han utilizado en
una sesin de trabajo se puede utilizar el comando who. Existe otro comando llamado
whos que proporciona adems informacin sobre el tamao, la cantidad de memoria
ocupada y el carcter real o complejo de cada variable.

El comando clear tiene varias formas posibles:

clear sin argumentos, clear elimina todas las variables creadas previamente
(excepto las variables globales).

clear A, b borra las variables indicadas.

clear global borra las variables globales.

1.1.3.4. Otras formas de definir matrices


GNU OCTAVE dispone de varias formas de definir matrices. El introducirlas
por teclado slo es prctico en casos de pequeo tamao y cuando no hay que repetir
esa operacin muchas veces. Recurdese que en GNU OCTAVE no hace falta definir el
tamao de una matriz. Las matrices toman tamao al ser definidas y este tamao puede
ser modificado por el usuario mediante adicin y/o borrado de filas y columnas. A
continuacin se van a ver otras formas ms potentes y generales de definir y/o modificar
matrices.

Pg -16-

Manual de Iniciacin a GNU Octave

1.1.3.4.1 Tipos de matrices predefinidos


Existen en GNU OCTAVE varias funciones orientadas a definir con gran
facilidad matrices de tipos particulares. Algunas de estas funciones son las siguientes:

eye(2) forma la matriz unidad de tamao (2x2)

octave:84> eye(2)
ans =

zeros(3,5) forma una matriz de ceros de tamao (3x5)

octave:83> zeros(3,5)
ans =

zeros(2) dem de tamao (2x2)

octave:85> zeros(2)
ans =

ones(3) forma una matriz de unos de tamao (3x3)

ones(3,4) idem de tamao (3x4)

octave:87> ones(3,4)
ans =

linspace(x1,x2,n) genera un vector con n valores igualmente espaciados


entre x1 y x2

octave:88> linspace(1,10,9)
ans =

Pg -17-

Manual de Iniciacin a GNU Octave

Columns 1 through 8:

1.0000

2.1250

3.2500

4.3750

5.5000

6.6250

7.7500

8.8750

Column 9:

10.0000

octave:89> #semejante a la definicion 1:1.125:10

logspace(d1,d2,n) genera un vector con n

valores espaciados

logartmicamente entre 10^d1 y 10^d2.

rand(3) forma una matriz de nmeros aleatorios entre 0 y 1, con


distribucin uniforme, de tamao (3x3)

rand(2,5) idem de tamao (2x5)

randn(4) forma una matriz de nmeros aleatorios de tamao (4x4), con


distribucin normal, de valor medio 0 y varianza 1.

magic(3) crea una matriz (3x3) con los nmeros 1, 2, ... 3*3, con la
propiedad de que todas las filas y columnas suman lo mismo.

octave:92> magic(3)
ans =

compan(pol) construye una matriz cuyo polinomio caracterstico tiene


como coeficientes los elementos del vector pol (ordenados de mayor
grado a menor).

octave:100> compan([1 2 1])


ans =

-2

-1

Hay ms tipos predefinidos de matrices, podemos encontrar en la ayuda todos


estos tipos y otros muchos ms con solo hacer help i matrix.
Pg -18-

Manual de Iniciacin a GNU Octave

1.1.3.4.2 Formacin de una matriz a partir de otras


GNU Octave ofrece tambin la posibilidad de crear una matriz a partir de
matrices previas ya definidas, por varios posibles caminos:
recibiendo alguna de sus propiedades (como por ejemplo el tamao),
por composicin de varias submatrices ms pequeas,
modificndola de alguna forma.
A continuacin se describen algunas de las funciones que crean una nueva
matriz a partir de otra o de otras, comenzando por dos funciones auxiliares:

[m,n]=size(A) devuelve el nmero de filas y de columnas de la matriz A.


Si la matriz es cuadrada basta recoger el primer valor de retorno

octave:103> a=[1 2 1;3 2 5;6 7 5];


octave:104> [m,n]=size(a)
m = 3
n = 3

n=length(x) calcula el nmero de elementos de un vector x

octave:105> x=1:0.00001:2;
octave:106> longitud_vector=length(x)
longitud_vector = 100001

zeros(size(A)) forma una matriz de ceros del mismo tamao que una
matriz A previamente creada.

octave:107> zeros(size(a))
ans =

ones(size(A)) dem con unos

A=diag(x) forma una matriz diagonal A cuyos elementos diagonales son


los elementos de un vector ya existente x.

x=diag(A) forma un vector x a partir de los elementos de la diagonal de


una matriz ya existente A.

Pg -19-

Manual de Iniciacin a GNU Octave


octave:111> diag(a)
ans =

1
2
5

diag(diag(A)) crea una matriz diagonal a partir de la diagonal de la


matriz A.

octave:112> diag(diag(a))
ans =

triu(A) forma una matriz triangular superior a partir de una matriz A (no
tiene por qu ser cuadrada).

octave:110> triu(a)
ans =

tril(A) dem con una matriz triangular inferior.

octave:109> tril(a)
ans =

Pg -20-

Manual de Iniciacin a GNU Octave

rot90(A,k) Gira k*90 grados la matriz rectangular A en sentido


antihorario. k es un entero que puede ser negativo. Si se omite, se supone
k=1

octave:113> rot90(a,1)
ans =

flipud(A) halla la matriz simtrica de A respecto de un eje horizontal

octave:114> flipud(a)
ans =

Un caso especialmente interesante es el de crear una nueva matriz componiendo


como submatrices otras matrices definidas previamente. A modo de ejemplo, vamos a
realizar la matriz generadora de un cdigo ortogonal con M=2:
octave:124> a=[0 0;0 1];
octave:125> h2=[a a;a not(a)]
h2 =

Pg -21-

Manual de Iniciacin a GNU Octave

1.1.3.4.3 Direccionamiento de vectores y matrices a partir de


vectores
Los elementos de una matriz a pueden direccionarse a partir de los elementos de
vectores:

octave:127> a=rand(2,5)
a =

0.253124

0.517686

0.089229

0.382511

0.177737

0.081242

0.079172

0.841718

0.649800

0.634496

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


octave:129> a(b)
ans =

0.253124

0.081242

0.089229

Podemos ver que hemos obtenido las posiciones 1, 2 y 5 de la matriz a, que


debemos contar teniendo en cuenta que la matriz se recorre por columnas y no por filas.
Si queremos ver un elemento concreto de la matriz, podemos ejecutar lo
siguiente:
octave:132> a(2,1)
ans = 0.081242

Creamos esta nueva matriz a para que sea ms fcil seguir los valores:
octave:133> a=randn(4)*10
a =

-22.94025

6.55306

-2.80857

-1.33060

5.12081

8.98726

1.81236

3.29938

-0.69713

1.40557

25.56103

5.62650

-17.50361

-0.63861

4.61985

1.21845

octave:134> a(2,3)
ans = 1.8124

Pg -22-

Manual de Iniciacin a GNU Octave

Ahora podemos ver las columnas 1, 2 y 3 de la 4 fila


octave:135> a(4,1:3)
ans =

-17.50361

-0.63861

4.61985

octave:136> #tercera fila


octave:136> a(3,:)
ans =

-0.69713

1.40557

25.56103

5.62650

octave:137> #tercera columna


octave:137> a(:,3)
ans =

-2.8086
1.8124
25.5610
4.6199

Para ver el ltimo elemento de una matriz podemos usar el direccionamiento


end:
octave:139> a(end,end)
ans = 1.2185

1.1.3.4.4 Operador <<Dos Puntos>> (:)


Se trata de una de las formas de definir vectores y matrices ms usada y ms
fcil de utilizar, dada la rpida visualizacin de la salida sin necesidad de ver el
resultado:
octave:140> x=1:1:10;
octave:141> x
x =

10

Pg -23-

Manual de Iniciacin a GNU Octave


En cierta forma se podra decir que el operador (:) representa un rango: en este
caso, los nmeros enteros entre el 1 y el 10. Por defecto el incremento es 1, pero este
operador puede tambin utilizarse con otros valores enteros y reales, positivos o
negativos. En este caso el incremento va entre el valor inferior y el superior, pero
podemos hacer que el incremento sea negativo, o que se haga con un incremento mayor
o menor:
octave:142> x=10:-1:1
x =

10

1.1.3.4.5 Definicin de matrices y vectores desde fichero


GNU Octave acepta el uso de scripts desde los que crear matrices, vectores,
variables, etc; como si estuviramos ejecutndolo desde la propia lnea de comandos.
Por ejemplo, si creamos el fichero matriz_a.m donde creamos una matriz a cualquiera,
al ejecutarla en GNU Octave podremos ver que se crea como si estuvieramos
generndola en el propio programa:
#primer script
a=randn(4)*10
#fin del script
octave:133> matriz_a
a =

-22.94025

6.55306

-2.80857

-1.33060

5.12081

8.98726

1.81236

3.29938

-0.69713

1.40557

25.56103

5.62650

-17.50361

-0.63861

4.61985

1.21845

Nota: Tenemos que estar dentro del directorio de trabajo o


incluir el directorio donde encontrar la funcin dentro del path

Pg -24-

Manual de Iniciacin a GNU Octave

1.1.3.5. Operadores Relacionales


El lenguaje de programacin de GNU Octave dispone de los siguientes
operadores relacionales:

< menor que

> mayor que

<= menor o igual que

>= mayor o igual que

== igual que

~= distinto que

Obsrvese que, salvo el ltimo de ellos, coinciden con los correspondientes


operadores relacionales de C. Sin embargo, sta es una coincidencia ms bien formal.
En GNU Octave los operadores relacionales pueden aplicarse a vectores y matrices, y
eso hace que tengan un significado especial. Al igual que en C, si una comparacin se
cumple el resultado es 1 (true), mientras que si no se cumple es 0 (false).
Recprocamente, cualquier valor distinto de cero es considerado como true y el cero
equivale a false. La diferencia con C est en que cuando los operadores relacionales de
GNU Octave se aplican a dos matrices o vectores del mismo tamao, la comparacin se
realiza elemento a elemento, y el resultado es otra matriz de unos y ceros del mismo
tamao, que recoge el resultado de cada comparacin entre elementos.
octave:147> a=7;
octave:148> b=8;
octave:149> a<b
ans = 1
octave:155> a==b
ans = 0

Pg -25-

Manual de Iniciacin a GNU Octave

1.1.3.6. Operadores Lgicos


Los operadores lgicos de GNU Octave son los siguientes:

& and

| or

~ negacin lgica

Obsrvese que estos operadores lgicos tienen distinta notacin que los
correspondientes operadores de C (&&, || y !). Los operadores lgicos se combinan con
los relacionales para poder comprobar el cumplimiento de condiciones mltiples.
octave:165> a=true
a = 1
octave:166> b=not(a)
b = 0
octave:167> c=a&b
c = 0
octave:168> c=a|b
c = 1

Pg -26-

Manual de Iniciacin a GNU Octave

1.2. Funciones de Librera

GNU Octave posee un gran nmero de funciones integradas y de funciones


definidas por el usuario, las primeras son funciones optimizadas para Octave, las
segundas, con extensin *.m son funciones definidas en ficheros, que pueden ser:
o Definidas por GNU Octave
o Definidas por grupos/usuarios desinteresados que ofrecen su cdigo a los
dems usuarios de GNU Octave
o Definidas por el propio usuario, para su uso y/o comparticin con otros
usuarios.

1.2.1 Caractersticas Generales de las funciones de librera


El concepto de funcin en GNU OCTAVE es semejante al de C y al de otros
lenguajes de programacin, aunque con algunas diferencias importantes. Al igual que en
C, una funcin tiene nombre, valor de retorno y argumentos. Una funcin se llama
utilizando su nombre en una expresin o utilizndolo como un comando ms.
#funcion de prueba para evaluar

function y=prueba(x)

y=x+3;

endfunction

Podemos ver que esta funcin es solamente la funcin de una recta, cuya
pendiente es de 45 y desplazada 3 unidades.
y : es el valor de retorno.
prueba : es el nombre de la funcin.
x : es el argumento de entrada.
Una caracterstica de GNU OCTAVE es que las funciones que no tienen
argumentos no llevan parntesis, por lo que a simple vista no siempre son fciles de
distinguir de las simples variables. Ejemplo:
#! hello -qf
printf("hello, world \n")

Pg -27-

Manual de Iniciacin a GNU Octave

octave:1> hello

hello, word

Los nombres de las funciones de GNU Octave no son palabras reservadas del
lenguaje. Es posible crear una variable llamada sin o cos, que ocultan las funciones
correspondientes. Para poder acceder a las funciones hay que eliminar (clear) las
variables del mismo nombre que las ocultan.
Podemos encontrar gran variedad de tipos de funcin segn lo que resuelvan:
1.- Funciones matemticas elementales.
2.- Funciones especiales.
3.- Funciones matriciales elementales.
4.- Funciones matriciales especficas.
5.- Funciones para la descomposicin y/o factorizacin de matrices.
6.- Funciones para anlisis estadstico de datos.
7.- Funciones para anlisis de polinomios.
8.- Funciones para integracin de ecuaciones diferenciales ordinarias.
9.- Resolucin de ecuaciones no-lineales y optimizacin.
10.- Integracin numrica.
11.- Funciones para procesamiento de seal.

Las caractersticas principales de estas funciones son:


o

Los argumentos actuales de estas funciones pueden ser expresiones y tambin


llamadas a otra funcin.

o Admite valores de retorno matriciales mltiples. Por ejemplo, en el comando:


octave:177> a=[1 2;2 3];
octave:179> [vector_propio, valor_propio]=eig(a)
vector_propio =

-0.85065

0.52573

0.52573

0.85065

Pg -28-

Manual de Iniciacin a GNU Octave


valor_propio =

-0.23607

0.00000

0.00000

4.23607

la funcin eig() calcula los valores y vectores propios de la matriz cuadrada A. Los
vectores propios se devuelven como columnas de la matriz vector_propio, mientras
que los valores propios son los elementos de la matriz diagonal valor_propio.
o

Las operaciones de suma y/o resta de una matriz con un escalar consisten en
sumar y/o restar el escalar a todos los elementos de la matriz.

Recurdese que tecleando help nombre_funcion se obtiene de inmediato


informacin sobre la funcin de ese nombre.

1.2.2. Funciones matemticas elementales que operan de modo


escalar.
Estas funciones, que comprenden las funciones matemticas trascendentales y
otras funciones bsicas, actan sobre cada elemento de la matriz como si se tratase de
un escalar. Se aplican de la misma forma a escalares, vectores y matrices. Algunas de
las funciones de este grupo son las siguientes:
o sin(x) : seno
o cos(x) : coseno
o tan(x) : tangente
o asin(x) : arco seno
o acos(x) : arco coseno
o atan(x) : arco tangente (devuelve un ngulo entre -90 y 90)
o sinh(x) : seno hiperblico
o cosh(x) : coseno hiperblico
o tanh(x) : tangente hiperblica
o asinh(x) : arco seno hiperblico
o acosh(x) : arco coseno hiperblico
o atanh(x) : arco tangente hiperblica
o log(x) : logaritmo natural
o log10(x) : logaritmo decimal
o exp(x) : funcin exponencial
Pg -29-

Manual de Iniciacin a GNU Octave


o sqrt(x) : raz cuadrada
o round(x) : redondeo hacia el entero ms prximo
o fix(x) : redondea hacia el entero ms prximo a 0
o floor(x) : valor entero ms prximo hacia -
o ceil(x) : valor entero ms prximo hacia +
o gcd(x) : mximo comn divisor
o lcm(x) : mnimo comn mltiplo
o real(x) : partes reales
o imag(x) : partes imaginarias
o abs(x) : valores absolutos
o

angle(x) : ngulos de fase

En realidad estas funciones se pueden aplicar tambin a matrices, pero en ese


caso se aplican por separado a cada columna de la matriz, dando como valor de retorno
un vector resultado de aplicar la funcin a cada columna de la matriz considerada como
vector. Si estas funciones se quieren aplicar a las filas de la matriz basta aplicar dichas
funciones a la matriz traspuesta.

Pg -30-

Manual de Iniciacin a GNU Octave

1.2.3. Funciones que actan sobre matrices


Las siguientes funciones exigen que el/los argumento/s sean matrices. En este
grupo aparecen algunas de las funciones ms tiles y potentes de GNU OCTAVE. Se
clasificarn en varios subgrupos.

1.2.3.1 Funciones elementales


o B = A' calcula la traspuesta (conjugada) de la matriz A
octave:29> a=[1+i,2+3i;1+2i,2+i];
octave:30> b=a'
b =

1 - 1i

1 - 2i

2 - 3i

2 - 1i

o B = A.' calcula la traspuesta (sin conjugar) de la matriz A


octave:31> b=a.'
b =

1 + 1i

1 + 2i

2 + 3i

2 + 1i

o v = poly(A) devuelve un vector v con los coeficientes del polinomio


caracterstico de la matriz cuadrada A
octave:35> x=[1 2 1];
octave:36> v=poly(x)
v =

-4

-2

o t = trace(A) devuelve la traza t (suma de los elementos de la diagonal) de


una matriz cuadrada A
octave:37> t=trace(c)
t = 2

Pg -31-

Manual de Iniciacin a GNU Octave


o [m,n] = size(A) devuelve el nmero de filas m y de columnas n de una
matriz rectangular A
octave:38> [m,n]=size(c)
m = 2
n = 2

o n = size(A) devuelve el tamao de una matriz cuadrada A


octave:39> n=size(c)
n = 2

1.2.3.2 Funciones Especiales


Las funciones exp(), sqrt() y log() se aplican elemento a elemento a las matrices
y/o vectores que se les pasan como argumentos. Existen otras funciones similares que
tienen tambin sentido cuando se aplican a una matriz como una nica entidad. Estas
funciones son las siguientes (se distinguen porque llevan una "m" adicional en el
nombre):
o expm(A) : si A=XDX, expm(A) = X*diag(exp(diag(D)))*X
o sqrtm(A) : devuelve una matriz que multiplicada por s misma da la
matriz A
o logm(A) : es la funcin inversa de expm(A)
octave:39> logm(c)
ans =

0.8047 + 1.5708i

0.3540 - 1.2825i

0.5309 - 1.9238i

0.8047 + 1.5708i

Pg -32-

Manual de Iniciacin a GNU Octave

1.2.3.3 Funciones de Factorizacin y/o Descomposicin Matricial


A su vez este grupo de funciones se puede subdividir en 4 subgrupos:
Funciones basadas en la factorizacin triangular (eliminacin de Gauss):
o [L,U] = lu(A) descomposicin de Crout (A = LU) de una matriz. La matriz L es
una permutacin de una matriz triangular inferior (dicha permutacin es
consecuencia del pivotamiento por columnas utilizado en la factorizacin).
octave:42> a=rand(3)
a =

0.521692

0.247373

0.174305

0.245762

0.047457

0.744174

0.468085

0.375004

0.362295

octave:43> [L,U]=lu(a)
L =

1.00000

0.00000

0.00000

0.47109

-0.45134

1.00000

0.89725

1.00000

0.00000

U =

0.52169

0.24737

0.17430

0.00000

0.15305

0.20590

0.00000

0.00000

0.75499

Pg -33-

Manual de Iniciacin a GNU Octave

o B = inv(A) calcula la inversa de A. Equivale a B=inv(U)*inv(L)


octave:63> a=[1 1;2 2];
octave:65> inv(a)
warning: inverse: matrix singular to machine precision, rcond = 0
ans =

2.00000

2.00000

0.50000

0.00000

o d = det(A) devuelve el determinante d de la matriz cuadrada A. Equivale a


d=det(L)*det(U)
o E = rref(A) reduccin a forma de escaln (mediante la eliminacin de Gauss con
pivotamiento por columnas) de una matriz rectangular A. Slo se utiliza la
diagonal y la parte triangular superior de A. El resultado es una matriz triangular
superior tal que A = U'*U.
octave:46> a=[2 1 3 0;1 2 1 1;1 1 1 3];
octave:47> e=rref(a)
e =

1.00000

0.00000

0.00000

13.00000

0.00000

1.00000

0.00000

-2.00000

0.00000

0.00000

1.00000

-8.00000

o c = rcond(A) devuelve una estimacin del recproco de la condicin numrica de


la matriz A basada en la norma sub-1. Si el resultado es prximo a 1 la matriz A
est bien condicionada; si es prximo a 0 no lo est.

Funciones basadas en el clculo de valores y vectores propios:

o [X,D] = eig(A) valores propios (diagonal de D) y vectores propios (columnas de


X) de una matriz cuadrada A. Con frecuencia el resultado es complejo (si A no
es simtrica).
o [X,D] = eig(A,B) valores propios (diagonal de D) y vectores propios (columnas
de X) de dos matrices cuadradas A y B (Ax = Bx).

Funciones basadas en la descomposicin QR:

Pg -34-

Manual de Iniciacin a GNU Octave


o [Q,R] = qr() descomposicin QR de una matriz rectangular. Se utiliza para
sistemas con ms ecuaciones que incgnitas.
octave:51> a=[1 1 1 1;1 1 2 4; 1 2 1 2; 1 2 2 3];
octave:52> [q,r]=qr(a);
octave:53> q
q =

-0.50000

-0.50000

0.50000

0.50000

-0.50000

-0.50000

-0.50000

-0.50000

-0.50000

0.50000

0.50000

-0.50000

-0.50000

0.50000

-0.50000

0.50000

-2.00000

-3.00000

-3.00000

-5.00000

0.00000

1.00000

0.00000

0.00000

0.00000

0.00000

-1.00000

-2.00000

0.00000

0.00000

0.00000

-1.00000

octave:54> r
r =

o B = null(A) devuelve una base ortonormal del subespacio nulo (kernel, o


conjunto de vectores x tales que Ax = 0) de la matriz rectangular A.
octave:56> a=[1 1; 2 1];
octave:57> null(a)
ans = [](2x0)

Pg -35-

Manual de Iniciacin a GNU Octave

o Q = orth(A) las columnas de Q son una base ortonormal del espacio vectorial de
las columnas de A, y el nmero de columnas de Q es el rango de A .
octave:62> q=orth(a)
q =

0.36060

0.93272

0.93272

-0.36060

Funciones basadas en la descomposicin de valor singular

o B = pinv(A) calcula la pseudo-inversa de una matriz rectangular A


octave:63> a=[1 1;2 2];
octave:64> pinv(a)
ans =

0.100000

0.200000

0.100000

0.200000

o r = rank(A) calcula el rango r de una matriz rectangular A


o nor = norm(A) calcula la norma sub-2 de una matriz (el mayor valor singular)
o nor = norm(A,2) lo mismo que la anterior
octave:67> x=rand(1,4)
x =

0.84525

0.67284

0.87206

0.57248

octave:68> norm(x,2)
ans = 1.5018

Pg -36-

Manual de Iniciacin a GNU Octave

Clculo del rango, normas y condicin numrica:


Existen varias formas de realizar estos clculos, con distintos niveles de esfuerzo
de clculo y de precisin en el resultado. El rango se calcula implcitamente (sin que el
usuario lo pida) al ejecutar las funciones rref(A), orth(A), null(A) y pinv(A).
Normas de vectores:

norm(x,p) norma sub-p, es decir sum(abs(x)^p)^(1/p).

norm(x) norma eucldea; equivale al mdulo o norm(x,2).

norm(x,inf) norma sub-, es decir max(abs(x)).

norm(x,1) norma sub-1, es decir sum(abs(x)).

octave:67> x=rand(1,4)
x =

0.84525

0.67284

0.87206

0.57248

octave:68> norm(x,2)
ans = 1.5018
octave:69> norm(x,3)
ans = 1.2072

Pg -37-

Manual de Iniciacin a GNU Octave

1.3. Ms sobre operadores relacionales con vectores y matrices

Cuando alguno de los operadores relacionales vistos previamente (<, >, <=, >=,
== y =) acta entre dos matrices (vectores) del mismo tamao, el resultado es otra
matriz (vector) de ese mismo tamao conteniendo unos y ceros, segn los resultados de
cada comparacin entre elementos hayan sido true o false, respectivamente.
De ordinario, las matrices "binarias" que se obtienen de la aplicacin de los
operadores relacionales no se almacenan en memoria ni se asignan a variables, sino que
se procesan sobre la marcha. GNU OCTAVE dispone de varias funciones para ello.
Recurdese que cualquier valor distinto de cero equivale a true, mientras que un valor
cero equivale a false. Algunas de estas funciones son:

any(x) funcin vectorial; chequea si alguno de los elementos del vector x


cumple una determinada condicin (en este caso ser distinto de cero). Devuelve
un uno un cero

octave:70> any(x)
ans = 1

any(A) se aplica por separado a cada columna de la matriz A. El resultado es un


vector de unos y ceros all(x) funcin vectorial; chequea si todos los elementos
del vector x cumplen una condicin. Devuelve un uno un cero.

octave:71> any(a)
ans =

Pg -38-

Manual de Iniciacin a GNU Octave

all(A) se aplica por separado a cada columna de la matriz A. El resultado es un


vector de unos y ceros.

octave:74> all(a)
ans =

find(x) busca ndices correspondientes a elementos de vectores que cumplen una


determinada condicin. El resultado es un vector con los ndices de los
elementos que cumplen la condicin.

octave:82> x
x =

0.84525

0.67284

0.87206

0.57248

octave:83> find(x>0)
ans =

find(A) cuando esta funcin se aplica a una matriz la considera como un vector
con una columna detrs de otra, de la 1 a la ltima.

Pg -39-

Manual de Iniciacin a GNU Octave

1.4. Otras funciones que actan sobre vectores y matrices


Las siguientes funciones pueden actuar sobre vectores y matrices, y sirven para
chequear ciertas condiciones:

exist(var) comprueba si la variable var existe

isnan() chequea si hay valores NaN, devolviendo una matriz de unos y ceros

octave:89> x=[1 2 3 4 0/0 6]


warning: division by zero
x =

NaN

octave:90> isnan(x)
ans =

isinf() chequea si hay valores Inf, devolviendo una matriz de unos y ceros

octave:91> isinf(x)
ans =

isfinite() chequea si los valores son finitos

octave:94> isfinite(x)
ans =

isempty() chequea si un vector o matriz est vaco

ischar() chequea si una variable es una cadena de caracteres (string)

octave:95> ischar(x)
ans = 0

isglobal() chequea si una variable es global

octave:97> isglobal(y)
ans = 0

Pg -40-

Manual de Iniciacin a GNU Octave

issparse() chequea si una matriz es dispersa (sparse, es decir, con un gran


nmero de elementos cero)

2. Otros tipos de datos de GNU OCTAVE

En los Captulos precedentes se ha visto la especialidad de GNU OCTAVE:


trabajar con vectores y matrices. En este Captulo se va a ver que GNU OCTAVE puede
tambin trabajar con otros tipos de datos:
1. Conjuntos o cadenas de caracteres, fundamentales en cualquier lenguaje de
programacin.
2. Hipermatrices, o matrices de ms de dos dimensiones.
3. Estructuras, o agrupaciones bajo un mismo nombre de datos de naturaleza diferente.
4. Vectores o matrices de celdas (cell arrays), que son vectores o matrices cuyos
elementos pueden ser cualquier otro tipo de dato.

2.1. Cadenas de caracteres

GNU OCTAVE trabaja tambin con cadenas de caracteres, con ciertas


semejanzas y tambin diferencias respecto a C/C++. A continuacin se explica lo ms
importante del manejo de cadenas de caracteres en GNU OCTAVE. Los caracteres de
una cadena se almacenan en un vector, con un carcter por elemento. Cada carcter
ocupa dos bytes. Las cadenas de caracteres van entre apstrofos o comillas simples,
como por ejemplo: 'cadena'. Si la cadena debe contener comillas, stas se representan
por un doble carcter comilla, de modo que se pueden distinguir fcilmente del
principio y final de la cadena. Por ejemplo, para escribir la cadena ni idea se
escribira niidea.
Una matriz de caracteres es una matriz cuyos elementos son caracteres, o bien
una matriz cuyas filas son cadenas de caracteres. Todas las filas de una matriz de
caracteres deben tener el mismo nmero de elementos. Si es preciso, las cadenas (filas)
ms cortas se completan con blancos.
Las funciones ms importantes para manejo de cadenas de caracteres son las siguientes:

Pg -41-

Manual de Iniciacin a GNU Octave

double(c) convierte en nmeros ASCII cada carcter

char(v) convierte un vector de nmeros v en una cadena de caracteres

char(c1,c2) crea una matriz de caracteres, completando con blancos las cadenas
ms cortas

deblank(c) elimina los blancos al final de una cadena de caracteres

disp(c) imprime el texto contenido en la variable c

ischar(c) detecta si una variable es una cadena de caracteres

isletter() detecta si un carcter es una letra del alfabeto. Si se le pasa un vector o


matriz de caracteres devuelve un vector o matriz de unos y ceros

isspace() detecta si un carcter es un espacio en blanco. Si se le pasa un vector o


matriz de caracteres devuelve un vector o matriz de unos y ceros

strcmp(c1,c2) comparacin de cadenas. Si las cadenas son iguales devuelve un


uno, y si no lo son, devuelve un cero (funciona de modo diferente que la
correspondiente funcin de C)

strcmpi(c1,c2) igual que strcmp(c1,c2), pero ignorando la diferencia entre


maysculas y minsculas

strncmp(c1,c2,n) compara los n primeros caracteres de dos cadenas

c1==c2 compara dos cadenas carcter a carcter. Devuelve un vector o matriz de


unos y ceros

s=[s,' y ms'] concatena cadenas, aadiendo la segunda a continuacin de la


primera

findstr(c1,c2) devuelve un vector con las posiciones iniciales de todas las veces
en que la cadena ms corta aparece en la ms larga

num2str(x,n) convierte un nmero real x en su expresin por medio de una


cadena de caracteres, con cuatro cifras decimales por defecto (pueden
especificarse ms cifras, con un argumento opcional n)

str2double(str) convierte una cadena de caracteres representando un nmero real


en el nmero real correspondiente

vc=cellstr(cc) convierte una matriz de caracteres

strrep(c1,c2,c3) sustituye la cadena c2 por c3, cada vez que c2 es encontrada en


c1

Pg -42-

Manual de Iniciacin a GNU Octave


octave:3> c=char('mas','madera')
c =

mas
madera

octave:4>

a=[11,112,121,23];

#podemos

crear

los

caracteres

con

su

numero en ascii
octave:5> b=char(a)
b=
py_
octave:6> char(11)
ans=

octave:7> char(112)
ans = p
octave:8> char(121)
ans = y
octave:9> char(23)
ans = _
octave:10> double(b)
ans =

11

112

121

23

octave:11> c='espacios

'

c = espacios
octave:12> size(c)
ans =

12

octave:13> deblank(c)

#de

este

modo

podemos

eliminar

espacios existentes en el string


ans = espacios
octave:14> size(ans)
ans =

Pg -43-

los

Manual de Iniciacin a GNU Octave


octave:15> strcmp(a,b)
ans = 0
octave:16> strcmp(b,b)
ans = 1
octave:17>

a='en

un

lugar

de

la

mancha

de

cuyo

nombre

no

puedo

acordarme'
a = en un lugar de la mancha de cuyo nombre no puedo acordarme
octave:18> b='n';
octave:19> findstr(a,b)
ans =

21

34

41

octave:20> strmatch(a,b)
ans = [](0x0)
octave:21> strrep(a,b,'T')
ans = eT uT lugar de la maTcha de cuyo Tombre To puedo acordarme

Pg -44-

Manual de Iniciacin a GNU Octave

2.2. Hipermatrices (arrays de ms de dos dimensiones)


GNU OCTAVE permite trabajar con hipermatrices, es decir con matrices de
ms de dos dimensiones. Una posible aplicacin es almacenar con un nico nombre
distintas matrices del mismo tamao (resulta una hipermatriz de 3 dimensiones). Los
elementos de una hipermatriz pueden ser nmeros, caracteres, estructuras, y vectores o
matrices de celdas.
El tercer subndice representa la tercera dimensin la profundidad de la hipermatriz.

2.2.1. Definicin de Hipermatrices


Las funciones que operan con matrices de ms de dos dimensiones son anlogas
a las funciones vistas previamente, aunque con algunas diferencias. Por ejemplo, las
siguientes sentencias generan, en dos pasos, una matriz de 2x2x2:

octave:25> rand(2,2,2)
ans =

ans(:,:,1) =

0.31106

0.70197

0.48694

0.45170

ans(:,:,2) =

0.017063

0.261818

0.234682

0.340703

Pg -45-

Manual de Iniciacin a GNU Octave

2.3. Estructuras
Una estructura (struct) es una agrupacin de datos de tipo diferente bajo un
mismo nombre. Estos datos se llaman miembros (members) o campos (fields). Una
estructura es un nuevo tipo de dato, del que luego se pueden crear muchas variables
(objetos o instances). Por ejemplo, la estructura alumno puede contener los campos
nombre (una cadena de caracteres) y carnet (un nmero).

2.3.1 Creacin de Estructuras


En GNU OCTAVE la estructura alumno se crea creando un objeto de dicha
estructura. A diferencia de otros lenguajes de programacin, no hace falta definir
previamente el modelo o patrn de la estructura. Una posible forma de hacerlo es crear
uno a uno los distintos campos, como en el ejemplo siguiente:
octave:35> alumno.nombre='jose';
octave:36> alumno.apellido='escriche';
octave:37> alumno
alumno =
{
apellido = escriche
nombre = jose
}

Tambin puede crearse la estructura por medio de la funcin struct(), como por
ejemplo,

octave:38> alumno=struct('nombre','jose maria','dni',77335559)


alumno =
{
dni = 77335559
nombre = jose maria
}

GNU Octave permite, adems, aadir un nuevo campo a una estructura en


cualquier momento. La siguiente sentencia aade el campo edad a todos los elementos
del vector alumno.

Pg -46-

Manual de Iniciacin a GNU Octave


octave:39> alumno.edad=23
alumno =
{
dni = 77334059
edad = 23
nombre = jose maria
}

Como hemos visto desde un inicio, GNU Octave trabaja con matrices, por lo tanto, todo
lo que veamos para un elemento es extrapolable a una matriz, vector o conjunto de
estos, por lo tanto, podemos hacer matrices de structs al igual que hemos hecho structs
de vectores/matrices.

2.3.2 Funciones para operar con Estructuras


Las estructuras de GNU OCTAVE disponen de funciones que facilitan su uso.
Algunas de estas funciones son las siguientes:

isstruct(ST) permite saber si ST es o no una estructura

fieldnames(struct) devuelve un array de celdas con el numero y nombre de los


elementos de la estructura

isfield (expr, nombre) nos dice si la structura posee un campo con el nombre
indicado.

Pg -47-

Manual de Iniciacin a GNU Octave

2.4. Vectores y matrices de Celda


Un vector (matriz o hipermatriz) de celdas es un vector (matriz o hipermatriz)
cuyos elementos son cada uno de ellos una variable de tipo cualquiera. En un array
ordinario todos sus elementos son nmeros o cadenas de caracteres. Sin embargo, en un
array de celdas, el primer elemento puede ser un nmero; el segundo una matriz; el
tercero una cadena de caracteres; el cuarto una estructura, etc.

2.4.1 Creacin de vectores y matrices de Celdas


Obsrvese por ejemplo cmo se crea, utilizando llaves {}, el siguiente vector de celdas,
octave:42> vc(1)={[1 1 2]}
vc =

{
[1,1] =

octave:43> vc(2)={'jose maria'}


vc =

{
[1,1] =

[1,2] = jose maria


}

Pg -48-

Manual de Iniciacin a GNU Octave

octave:44> vc(3)={rand(2,2)}
vc =

{
[1,1] =

[1,2] = jose maria


[1,3] =

0.39113

0.97938

0.41501

0.77790

Otra nomenclatura alternativa y similar, que tambin utiliza llaves, es la que


podemos ver a continuacin.
octave:45> v{1}=[1 2 1]
v =

{
[1,1] =

Pg -49-

Manual de Iniciacin a GNU Octave

octave:46> v{2}='escriche'
v =

{
[1,1] =

[1,2] = escriche
}

2.4.2 Funciones para trabajar con vectores y matrices de celdas


GNU OCTAVE dispone de las siguientes funciones para trabajar con cell
arrays:

cell(m,n) crea un cell array vaco de m filas y n columnas

celldisp(ca) muestra el contenido de todas las celdas de ca

cellplot(ca) muestra una representacin grfica de las distintas celdas

iscell(ca) indica si ca es un vector de celdas

num2cell() convierte un array numrico en un cell array

octave:48> c=cell(2,2)
c =

{
[1,1] = [](0x0)
[2,1] = [](0x0)
[1,2] = [](0x0)
[2,2] = [](0x0)
}

Pg -50-

Manual de Iniciacin a GNU Octave

octave:49> c{1,1}='jose maria'


c =

{
[1,1] = jose maria
[2,1] = [](0x0)
[1,2] = [](0x0)
[2,2] = [](0x0)
}

octave:50> c{2,2}='azucar'
c =

{
[1,1] = jose maria
[2,1] = [](0x0)
[1,2] = [](0x0)
[2,2] = azucar
}

Pg -51-

Manual de Iniciacin a GNU Octave

3. Programacin en GNU Octave


Este es uno de los puntos flojos de todo este tipo de herramientas de clculo
numrico, ya que no existen grandes posibilidades de programacin, aunque s las
formas de programacin bsicas.

3.1. Bifurcaciones y bucles


Como todo lenguaje de programacin, podemos encontrar bifurcaciones y bucles. Las
bifurcaciones sirven para realizar una u otra operacin:

Los bucles nos permiten realizar varias iteraciones de un mismo proceso, o sea, realizar
una misma operacin sobre distintos elementos. Podemos encontrar varios tipos de
bucles:

while

do-until

for

Adems de las sentencias break y continue utilizadas dentro de los bucles para salir del
proceso.

Pg -52-

Manual de Iniciacin a GNU Octave

3.1.1. Sentencia IF
Esta sentencia nos sirve para hacer bifurcaciones, podemos hacer 3 usos diferentes de
ella:

Una sola sentencia que utilizamos si es verdadera y sino no hacemos nada:

if (condition)
then-body
endif

Utilizando la expresin else con la que conseguiremos hacer uso de una


expresin u otra si es consecuentemente true o false.

if (condition)
then-body
else
else-body
endif

Utilizando la expression elseif con la que se pueden anidar bifurcaciones


(aunque es mejor usar la sentencia switch)

if (condition)
then-body
elseif (condition)
elseif-body
else

#es la opcin por defecto cuando no se cumple ninguna condicin


else-body

endif

Pg -53-

Manual de Iniciacin a GNU Octave


Una observacin muy importante: la condicin del if puede ser una condicin
matricial, del tipo A==B, donde A y B son matrices del mismo tamao. Para que se
considere que la condicin se cumple, es necesario que sean iguales dos a dos todos los
elementos de las matrices A y B. Basta que haya dos elementos diferentes para que las
matrices no sean iguales, y por tanto las sentencias del if no se ejecuten. Anlogamente,
una condicin en la forma A=B exige que todos los elementos sean diferentes dos a
dos. Bastara que hubiera dos elementos iguales para que la condicin no se cumpliese.
En resumen:

if A==B exige que todos los elementos sean iguales dos a dos

if A=B exige que todos los elementos sean diferentes dos a dos

3.1.2. Sentencia SWITCH


Se trata de una sentencia con la que podemos hacer una funcin similar a la
concatenacin de sentencias elseif, de manera que simplifiquemos el modo de
programar:

switch expression
case label
command_list
case label
command_list
...

otherwise
#con

este

ltimo

agregamos

todas

las

posibilidades

que

no

se

#contemplan en los anteriores


command_list
endswitch

Al principio se evala la expression, cuyo resultado debe ser un nmero escalar


o una cadena de caracteres. Este resultado se compara con las label, y se ejecuta el
bloque de sentencias que corresponda con ese resultado. Si ninguno es igual a
expression se ejecutan las sentencias correspondientes a otherwise.

Pg -54-

Manual de Iniciacin a GNU Octave

3.1.3. Sentencia FOR


Repite una serie de sentencias un nmero determinado de veces, sin importar los
procesos que ocurran dentro, por lo que la nica manera de salir del bucle es esperar que
acabe (ms adelante veremos la sentencia break).

for var = expression


body
endfor

cuando var llega al valor expression el bucle se detiene.

3.1.4. Sentencia DO-UNTIL


Repite una serie de sentencias hasta que la condicin until se hace true,
momento en el que se detiene la ejecucin.
do
body
until (condition)

3.1.5. Sentencia WHILE


Similar a DO-UNTIL salvo que la comprobacin de la condicin se hace antes
de la ejecucin de la iteracin.

while (condition)
body
endwhile

Pg -55-

Manual de Iniciacin a GNU Octave

3.1.6. Sentencia BREAK y CONTINUE


Al igual que en C/C++/Java, la sentencia break hace que se termine la ejecucin
del bucle ms interno de los que comprenden a dicha sentencia. La sentencia continue
hace que automticamente se pare la ejecucin de la iteracin actual, por lo que vuelve
al principio del bucle (slo sirve para el bucle FOR).

3.2 Ficheros *.m


Los ficheros con extensin (.m) son ficheros de texto sin formato (ficheros
ASCII) que constituyen el centro de la programacin en GNU OCTAVE. Ya se han
utilizado en varias ocasiones. Estos ficheros se crean y modifican con un editor de
textos cualquiera.
Existen dos tipos de ficheros *.m, los ficheros de comandos (llamados scripts
en ingls) y las funciones. Los primeros contienen simplemente un conjunto de
comandos que se ejecutan sucesivamente cuando se teclea el nombre del fichero en la
lnea de comandos de GNU OCTAVE. Un fichero de comandos puede llamar a otros
ficheros de comandos.
Las funciones permiten definir funciones enteramente anlogas a las de GNU
OCTAVE, con su nombre, sus argumentos y sus valores de retorno. Los ficheros *.m
que definen funciones permiten extender las posibilidades de GNU OCTAVE. Las
funciones definidas en ficheros *.m se caracterizan porque la primera lnea (que no sea
un comentario) comienza por la palabra function, seguida por los valores de retorno
(entre corchetes [ ] y separados por comas, si hay ms de uno), el signo igual (=) y el
nombre de la funcin, seguido de los argumentos (entre parntesis y separados por
comas).
Recurdese que un fichero *.m puede llamar a otros ficheros *.m, e incluso
puede llamarse a s mismo de forma recursiva. Los ficheros de comandos se pueden
llamar tambin desde funciones, en cuyo caso las variables que se crean pertenecen a
espacio de trabajo de la funcin. El espacio de trabajo de una funcin es independiente
del espacio de trabajo base y del espacio de trabajo de las dems funciones. Esto implica
por ejemplo que no puede haber colisiones entre nombres de variables aunque varias
funciones tengan una variable llamada A, en realidad se trata de variables
completamente distintas (a no ser que A haya sido declarada como variable global).

Pg -56-

Manual de Iniciacin a GNU Octave

3.2.1 Ficheros de Comandos (SCRIPTS)


Los ficheros de comandos o scripts son ficheros con un nombre tal como file1.m
que contienen una sucesin de comandos anloga a la que se tecleara en el uso
interactivo del programa. Dichos comandos se ejecutan sucesivamente cuando se teclea
el nombre del fichero que los contiene (sin la extensin), es decir cuando se teclea file1
con el ejemplo considerado.
Cuando se ejecuta desde la lnea de comandos, las variables creadas por file1
pertenecen al espacio de trabajo base de GNU OCTAVE. Por el contrario, si se ejecuta
desde una funcin, las variables que crea pertenecen al espacio de trabajo de la funcin.
En los ficheros de comandos conviene poner los puntos y coma (;) al final de
cada sentencia, para evitar una salida de resultados demasiado cuantiosa. Un fichero
*.m puede llamar a otros ficheros *.m, e incluso se puede llamar a s mismo de modo
recursivo.
El comando echo hace que se impriman los comandos que estn en un script a
medida que van siendo ejecutados. Este comando tiene varias formas:

echo on activa el echo en todos los ficheros script

echo off desactiva el echo

echo file on donde 'file' es el nombre de un fichero de funcin, activa el echo en


esa funcin

echo file off desactiva el echo en la funcin

echo file pasa de on a off y viceversa

echo on all activa el echo en todas las funciones

echo off all desactiva el echo de todas las funciones


Mencin especial merece el fichero de comandos octaverc. Este fichero se

ejecuta cada vez que se entra en GNU OCTAVE. En l puede introducir todos aquellos
comandos que le interesa se ejecuten siempre al iniciar la sesin, por ejemplo format
compact y los comandos necesarios para modificar el path.

Pg -57-

Manual de Iniciacin a GNU Octave

3.2.2 Definicin de Funciones


La primera lnea de un fichero llamado name.m que define una funcin tiene la forma:
function [lista de valores de retorno] = name(lista de argumentos)

donde name es el nombre de la funcin. Entre corchetes y separados por comas


van los valores de retorno (siempre que haya ms de uno), y entre parntesis tambin
separados por comas los argumentos. Puede haber funciones sin valor de retorno y
tambin sin argumentos. Recurdese que los argumentos son los datos de la funcin y
los valores de retorno sus resultados. Si no hay valores de retorno se omiten los
corchetes y el signo igual (=); si slo hay un valor de retorno no hace falta poner
corchetes. Tampoco hace falta poner parntesis si no hay argumentos.
Las variables definidas dentro de una funcin son variables locales, en el
sentido de que son inaccesibles desde otras partes del programa y en el de que no
interfieren con variables del mismo nombre definidas en otras funciones o partes del
programa. Se puede decir que pertenecen al propio espacio de trabajo de la funcin y no
son vistas desde otros espacios de trabajo. Para que la funcin tenga acceso a variables
que no han sido pasadas como argumentos es necesario declarar dichas variables como
variables globales, tanto en el programa principal como en las distintas funciones que
deben acceder a su valor.
Dentro de la funcin, los valores de retorno deben ser calculados en algn sitio.
De todas formas, no hace falta calcular siempre todos los posibles valores de retorno de
la funcin, sino slo los que el usuario espera obtener en la sentencia de llamada a la
funcin. En cualquier funcin existen dos variables definidas de modo automtico
llamadas nargin y nargout, que representan respectivamente el nmero de argumentos
y el nmero de valores de retorno con los que la funcin ha sido llamada. Dentro de la
funcin, estas variables pueden ser utilizadas como el programador desee ya que las
variables en Octave son pasadas por valor.
La ejecucin de una funcin termina cuando se llega a su ltima sentencia
ejecutable. Si se quiere forzar el que una funcin termine de ejecutarse se puede utilizar
la sentencia return, que devuelve inmediatamente el control al entorno de llamada.

Pg -58-

Manual de Iniciacin a GNU Octave

3.2.3. HELP para las funciones de usuario


Tambin las funciones creadas por el usuario pueden tener su help, anlogo al
que tienen las propias funciones de GNU OCTAVE. Esto se consigue de la siguiente
forma: las primeras lneas de comentarios de cada fichero de funcin son muy
importantes, pues permiten construir un help sobre esa funcin.
En otras palabras, cuando se teclea en la ventana de comandos de GNU
OCTAVE:
help mi_func

el programa responde escribiendo las primeras lneas del fichero mi_func.m que
comienzan por el carcter #, es decir, que son comentarios.

Pg -59-

Manual de Iniciacin a GNU Octave

4. Grficos bidimensionales
A estas alturas, despus de ver cmo funciona este programa, a nadie le puede
resultar extrao que los grficos 2-D de GNU Octave estn fundamentalmente
orientados a la representacin grfica de vectores (y matrices). En el caso ms sencillo
los argumentos bsicos de la funcin plot van a ser vectores. Cuando una matriz
aparezca como argumento, se considerar como un conjunto de vectores columna (en
algunos casos tambin de vectores fila).
GNU Octave utiliza un tipo especial de ventanas para realizar las operaciones
grficas. Ciertos comandos abren una ventana nueva y otros dibujan sobre la ventana
activa, bien sustituyendo lo que hubiera en ella, bien aadiendo nuevos elementos
grficos a un dibujo anterior. Todo esto se ver con ms detalle en las siguientes
secciones.
Todo este sistema de grficos est implementado a partir de GNU Plot, por lo
que si fuera necesario, siempre podramos llamar directamente a este programa en vez
de dejar que sea Octave el que lo haga por nosotros.

4.1 Funciones grficas 2D elementales


GNU Octave dispone de cuatro funciones bsicas para crear grficos 2-D. Estas
funciones se diferencian principalmente por el tipo de escala que utilizan en los ejes de
abscisas y de ordenadas. Estas cuatro funciones son las siguientes:

plot()

crea un grfico a partir de vectores y/o columnas de matrices,

con escalas lineales sobre ambos ejes.

loglog()

semilogx()

dem con escala logartmica en ambos ejes


dem con escala lineal en el eje de ordenadas y logartmica

en el eje de abscisas

semilogy()

dem con escala lineal en el eje de abscisas y logartmica

en el eje de ordenadas
En lo sucesivo se har referencia casi exclusiva a la primera de estas funciones
(plot). Las dems se pueden utilizar de un modo muy similar.

Pg -60-

Manual de Iniciacin a GNU Octave


Existen adems otras funciones orientadas a aadir ttulos al grfico, a cada uno
de los ejes, a dibujar una cuadrcula auxiliar, a introducir texto, etc. Estas funciones son
las siguientes:

title('ttulo')

aade un ttulo al dibujo.

xlabel('tal')

aade una etiqueta al eje de abscisas. Con xlabel off


desaparece.

ylabel('cual')

aade una etiqueta al eje de ordenadas. Con ylabel off


desaparece.

text(x,y,'texto') introduce 'texto' en el lugar especificado por las


coordenadas x e y. Si x e y son vectores, el texto se
repite por cada par de elementos. Si texto es tambin un
vector de cadenas de texto de la misma dimensin, cada
elemento

se

escribe

en

las

coordenadas

correspondientes.
legend()

define rtulos para las distintas lneas o ejes utilizados en


la figura. Para ms detalle, consultar el Help.

grid

activa la inclusin de una cuadrcula en el dibujo. Con


grid off desaparece la cuadrcula.

Los dos grupos de funciones anteriores no actan de la misma forma. As, la


funcin plot dibuja una nueva figura en la ventana activa (en todo momento GNU
Octave tiene una ventana activa de entre todas las ventanas grficas abiertas), o abre una
nueva figura si no hay ninguna abierta, sustituyendo cualquier cosa que hubiera
dibujada anteriormente en esa ventana.

Pg -61-

Manual de Iniciacin a GNU Octave

Ahora se deben ejecutar los comandos siguientes:


octave:2> grid
octave:3> x=0:0.1:10;y=sin(x);
octave:4> plot(x,y)

Ms adelante se ver que con la funcin hold pueden aadirse grficos a una
figura ya existente respetando su contenido.

Pg -62-

Manual de Iniciacin a GNU Octave

4.1.1 Funcin PLOT


Esta es la funcin clave de todos los grficos 2-D en GNU Octave. Ya se ha
dicho que el elemento bsico de los grficos bidimensionales es el vector. Se utilizan
tambin cadenas de 1, 2 3 caracteres para indicar colores y tipos de lnea. La funcin
plot(), en sus diversas variantes, no hace otra cosa que dibujar vectores. Un ejemplo
muy sencillo de esta funcin, en el que se le pasa un nico vector como argumento, es el
siguiente:
octave:6> x=[1 3 2 4 5 3],plot(x)
x =

El resultado de este comando es que se abre una ventana. Por defecto, los
distintos puntos del grfico se unen con una lnea continua. Tambin por defecto, el
color que se utiliza para la primera lnea es el rojo.
Cuando a la funcin plot() se le pasa un nico vector real como argumento,
dicha funcin dibuja en ordenadas el valor de los n elementos del vector frente a los
ndices 1, 2, ... n del mismo en abscisas. Ms adelante se ver que si el vector es
complejo, el funcionamiento es bastante diferente.

Pg -63-

Manual de Iniciacin a GNU Octave

En la pantalla de su ordenador se habr visto que GNU Octave utiliza por


defecto color blanco para el fondo de la pantalla y otros colores ms oscuros para los
ejes y las grficas.
Una segunda forma de utilizar la funcin plot() es con dos vectores como
argumentos. En este caso los elementos del segundo vector se representan en ordenadas
frente a los valores del primero, que se representan en abscisas. Vase por ejemplo
cmo se puede dibujar un cuadriltero de esta forma (obsrvese que para dibujar un
polgono cerrado el ltimo punto debe coincidir con el primero):
octave:8>x=[1 6 5 2 1]; y=[1 0 4 3 1];
octave:9>plot(x,y)

La funcin plot() permite tambin dibujar mltiples curvas introduciendo varias


parejas de vectores como argumentos. En este caso, cada uno de los segundos vectores
se dibujan en ordenadas como funcin de los valores del primer vector de la pareja, que
se representan en abscisas. Obsrvese bien cmo se dibujan el seno y el coseno en el
siguiente ejemplo:
octave:10> x=0:pi/25:6*pi;
octave:11>y=sin(x); z=cos(x);
octave:12>plot(x,y,x,z)

Ahora se va a ver lo que pasa con los vectores complejos. Si se pasan a plot()
arios vectores complejos como argumentos, GNU Octave simplemente representa las
partes reales y desprecia las partes imaginarias.
octave:12> a=rand(3,3)+rand(3,3)*i;
octave:13> plot(a)

Pg -64-

Manual de Iniciacin a GNU Octave

Como ya se ha dicho, si se incluye ms de un vector complejo como


argumento, se ignoran las partes imaginarias. Si se quiere dibujar varios vectores
complejos, hay que separar explcitamente las partes reales e imaginarias de cada
vector, como se acaba de hacer en el ltimo ejemplo.
El comando plot puede utilizarse tambin con matrices como argumentos.
Vanse algunos ejemplos sencillos:

plot(A)

dibuja una lnea por cada columna de A en ordenadas, frente

al ndice de los elementos en abscisas

plot(x,A)

dibuja las columnas (o filas) de A en ordenadas frente al

vector x en abscisas. Las dimensiones de A y x deben ser coherentes: si


la matriz A es cuadrada se dibujan las columnas, pero si no lo es y la
dimensin de las filas coincide con la de x, se dibujan las filas

plot(A,x)

anlogo al anterior, pero dibujando las columnas (o filas) de

A en abscisas, frente al valor de x en ordenadas

plot(A,B)

dibuja las columnas de B en ordenadas frente a las columnas

de A en abscisas, dos a dos. Las dimensiones deben coincidir

plot(A,B,C,D) anlogo al anterior para cada par de matrices. Las


dimensiones de cada par deben coincidir, aunque pueden ser diferentes
de las dimensiones de los dems pares.

Se puede obtener una excelente y breve descripcin de la funcin plot() con el


comando help plot. La descripcin que se acaba de presentar se completar en la
siguiente seccin, en donde se ver cmo elegir los colores y los tipos de lnea.

Pg -65-

Manual de Iniciacin a GNU Octave

4.1.2 Estilos de Lnea y Marcadores para PLOT


En la seccin anterior se ha visto cmo la tarea fundamental de la funcin plot()
era dibujar los valores de un vector en ordenadas, frente a los valores de otro vector en
abscisas. En el caso general esto exige que se pasen como argumentos un par de
vectores. En realidad, el conjunto bsico de argumentos de esta funcin es una tripleta
formada por dos vectores y una cadena de 1, 2 3 caracteres que indica el color y el
tipo de lnea o de marcador. En la tabla siguiente se pueden observar las distintas
posibilidades.
Smbolo

Color

Smbolo

Marcadores

yellow

puntos

magenta

cyan

crculos

marcas en x

r ed

marcas en +

green

marcas en *

blue

marcas
cuadradas (square)

white

marcas

en

diamante (diamond)
k

black

tringulo
apuntando arriba

Pg -66-

Manual de Iniciacin a GNU Octave

4.1.3 Aadir Lneas a un grfico ya existente


Existe la posibilidad de aadir lneas a un grfico ya existente, sin destruirlo o
sin abrir una nueva ventana. Se utilizan para ello los comandos hold on y hold off. El
primero de ellos hace que los grficos sucesivos respeten los que ya se han dibujado en
la figura (es posible que haya que modificar la escala de los ejes); el comando hold off
deshace el efecto de hold on. El siguiente ejemplo muestra cmo se aaden las grficas
de x2 y x3 a la grfica de x previamente creada (cada una con un tipo de lnea
diferente):
octave:16> closeplot
octave:17> x1=rand(100,1);
octave:18> x2=1+0.8*cos(0:0.1:10);
octave:19> plot(x1)
octave:20> hold on
octave:21> plot(x2)
octave:22> print('plot4.png','-dpng')

Pg -67-

Manual de Iniciacin a GNU Octave

4.1.4 Comando SUBPLOT


Una ventana grfica se puede dividir en m particiones horizontales y n verticales,
con objeto de representar mltiples grficos en ella. Cada una de estas subventanas tiene
sus propios ejes, aunque otras propiedades son comunes a toda la figura. La forma
general de este comando es:
subplot(m,n,i)

donde m y n son el nmero de subdivisiones en filas y columnas, e i es la


subdivisin que se convierte en activa. Las subdivisiones se numeran consecutivamente
empezando por las de la primera fila, siguiendo por las de la segunda, etc. Por ejemplo,
la siguiente secuencia de comandos genera cuatro grficos en la misma ventana:
octave:23> x=0:0.01:10;y=sin(x); z=cos(x); w=exp(-x*.1).*y; v=y.*z;
octave:24> subplot(2,2,1), plot(x,y)
octave:25> subplot(2,2,2), plot(x,z)
octave:26> subplot(2,2,3), plot(x,w)
octave:27> subplot(2,2,4), plot(x,v)

Se puede practicar con este ejemplo aadiendo ttulos a cada grfica, as


como rtulos para los ejes. Se puede intentar tambin cambiar los tipos de lnea.

4.1.5 Control de los Ejes


Tambin en este punto GNU Octave tiene sus opciones por defecto, que en
algunas ocasiones puede interesar cambiar. El comando bsico es el comando axis. Por
defecto, GNU Octave ajusta la escala de cada uno de los ejes de modo que vare entre el
mnimo y el mximo valor de los vectores a representar. Este es el llamado modo
"auto", o modo automtico. Para definir de modo explcito los valores mximo y
mnimo segn cada eje, se utiliza el comando:

axis([xmin, xmax, ymin, ymax])

mientras que :

axis(auto)

devuelve el escalado de los ejes al valor por defecto o automtico.

Pg -68-

Manual de Iniciacin a GNU Octave

4.2 Control de ventanas grficas: Funcin figure


Si se llama a la funcin figure sin argumentos, se crea una nueva ventana grfica
con el nmero consecutivo que le corresponda. El valor de retorno es dicho nmero.
Por otra parte, el comando figure(n) hace que la ventana n pase a ser la ventana
o figura activa. Si dicha ventana no existe, se crea una nueva ventana con el nmero
consecutivo que le corresponda (que se puede obtener como valor de retorno del
comando). La funcin close cierra la figura activa, mientras que close(n) cierra la
ventana o figura nmero n.
Para practicar un poco con todo lo que se acaba de explicar, ejectense las
siguientes instrucciones de GNU Octave, observando con cuidado los efectos de cada
una de ellas en la ventana activa.
octave:41> plot(x,sin(x),'r',x,cos(x),'g')
octave:42> title('Funcin seno(x) -en rojo- y funcin coseno(x) -en
verde-')
octave:43> xlabel('ngulo en radianes')
octave:43> ylabel('valor de la funcin trigonomtrica')
octave:44> axis([-12,12,-1.5,1.5])

Pg -69-

Manual de Iniciacin a GNU Octave

4.3 Otras funciones grficas 2-D


Existen otras funciones grficas bidimensionales orientadas a generar otro tipo
de grficos distintos de los que produce la funcin plot() y sus anlogas. Algunas de
estas funciones son las siguientes (para ms informacin sobre cada una de ellas en
particular, utilizar help nombre_funcin):

bar()

crea diagramas de barras

barh()

diagramas de barras horizontales

bar3()

diagramas de barras con aspecto 3-D

bar3h()

diagramas de barras horizontales con aspecto 3-D

pie()

grficos con forma de tarta

pie3()

grficos con forma de tarta y aspecto 3-D

area()

similar plot(), pero rellenando en ordenadas de 0 a y

stairs()

funcin anloga a bar() sin lneas internas

errorbar()

representa sobre una grfica mediante barras valores de


errores.

compass()

dibuja los elementos de un vector complejo como un


conjunto de vectores partiendo de un origen comn

feather()

dibuja los elementos de un vector complejo como un


conjunto

de

vectores

partiendo

de

orgenes

uniformemente espaciados sobre el eje de abscisas.

hist()

dibuja histogramas de un vector

A modo de ejemplo, genrese un vector de valores aleatorios entre 0 y 10, y


ejectense los siguientes comandos:
octave:53> x=[rand(1,100)*10];
octave:69> plot(x,'m')
octave:71> bar(x)

Pg -70-

Manual de Iniciacin a GNU Octave

Pg -71-

Manual de Iniciacin a GNU Octave

5. Grficos tridimensionales
Quizs sea sta una de las caractersticas de GNU OCTAVE que ms
admiracin despierta entre los usuarios no tcnicos (cualquier alumno de ingeniera sabe
que hay ciertas operaciones algebraicas como la descomposicin de valor singular, sin ir
ms lejos, que tienen dificultades muy superiores, aunque "luzcan" menos).

5.1 Tipos de funciones grficas tridimensionales


GNU Octave tiene posibilidades de realizar varios tipos de grficos 3D. Para
darse una idea de ello, lo mejor es verlo en la pantalla cuanto antes, aunque haya que
dejar las explicaciones detalladas para un poco ms adelante.
La primera forma de grfico 3D es la funcin plot3, que es el anlogo
tridimensional de la funcin plot. Esta funcin dibuja puntos cuyas coordenadas estn
contenidas en 3 vectores, bien unindolos mediante una lnea continua (defecto), bien
mediante markers.
Asegrese de que no hay ninguna ventana grfica abierta y ejecute el siguiente
comando que dibuja una lnea espiral:
octave:1> fi=[0:pi/20:6*pi]; plot3(cos(fi),sin(fi),fi,'g')

Ahora se ver cmo se representa una funcin de dos variables. Para ello se
va a definir una funcin de este tipo en un fichero llamado test3d.m. La frmula ser la
siguiente:
Pg -72-

Manual de Iniciacin a GNU Octave


function z=test3d(x,y)
z = 3*(1-x).^2.*exp(-(x.^2) - (y+1).^2) ...
- 10*(x/5 - x.^3 - y.^5).*exp(-x.^2-y.^2) ...
1/3*exp(-(x+1).^2 y.^2);

Ahora, ejectese la siguiente lista de comandos (directamente, o mejor


creando un fichero test3dFC.m que los contenga):
x=[-3:0.4:3]; y=x;
closeplot
figure(),fi=[0:pi/20:6*pi];
plot3(cos(fi),sin(fi),fi,'r')
[X,Y]=meshgrid(x,y);
Z=test3d(X,Y);
figure(), mesh(Z)

Estos son unos ejemplos de las posibilidades que GNU Octave ofrece para el uso
de grficos 3-D.

Pg -73-

Manual de Iniciacin a GNU Octave

5.1.1 Dibujo de lneas: Funcin PLOT3


La funcin plot3 es anloga a su homloga bidimensional plot. Su forma ms
sencilla es la siguiente:
octave:81>plot3(x,y,z)

que dibuja una lnea que une los puntos (x(1), y(1), z(1)), (x(2), y(2), z(2)), etc.
Y la proyecta sobre un plano para poderla representar en la pantalla. Al igual que en el
caso plano, se puede incluir una cadena de 1, 2 3 caracteres para determinar el color,
los markers, y el tipo de lnea:
octave:82>plot3(x,y,z,s)

Tambin se pueden utilizar tres matrices X, Y y Z del mismo tamao:


octave:83>plot3(X,Y,Z)

en cuyo caso se dibujan tantas lneas como columnas tienen estas 3 matrices,
cada una de las cuales est definida por las 3 columnas homlogas de dichas matrices.
A continuacin se va a realizar un ejemplo sencillo consistente en dibujar un
cubo. Para ello se crear una matriz que contenga las aristas correspondientes, definidas
mediante los vrtices del cubo como una lnea poligonal continua (obsrvese que
algunas aristas se dibujan dos veces). La matriz A cuyas columnas son las coordenadas
de los vrtices, y cuyas filas son las coordenadas x, y y z de los mismos:
octave:86>A=[0 1 1 0 0 0 1 0 1 1 0 0 1 1 1 1 0 0
0 0 1 1 0 0 0 0 0 1 1 0 0 0 1 1 1 1
0 0 0 0 0 1 1 1 1 1 1 1 1 0 0 1 1 0];

Ahora basta ejecutar los comandos siguientes (el trasponer los vectores en este
caso es opcional):
octave:87>plot3(A(1,:)',A(2,:)',A(3,:)')

Pg -74-

Manual de Iniciacin a GNU Octave

5.1.2 Dibujo de mallados: Funciones MESHGRID, MESH Y


SURF
Ahora se ver con detalle cmo se puede dibujar una funcin de dos variables
(z=f(x,y)) sobre un dominio rectangular. Se ver que tambin se pueden dibujar los
elementos de una matriz como funcin de los dos ndices.
Sean x e y dos vectores que contienen las coordenadas en una y otra direccin de
la retcula (grid) sobre la que se va a dibujar la funcin. Despus hay que crear dos
matrices X (cuyas filas son copias de x) e Y (cuyas columnas son copias de y). Estas
matrices se crean con la funcin meshgrid. Estas matrices representan respectivamente
las coordenadas x e y de todos los puntos de la retcula. La matriz de valores Z se
calcula a partir de las matrices de coordenadas X e Y. Finalmente hay que dibujar esta
matriz Z con la funcin mesh, cuyos elementos son funcin elemento a elemento de los
elementos de X e Y. Vase como ejemplo el dibujo de la funcin sen(r)/r (siendo
r=sqrt(x2+y2); para evitar dividir por 0 se suma al denominador el nmero pequeo
eps). Para distinguirla de la funcin test3d anterior se utilizar u y v en lugar de x e y.
Crese un fichero llamado sombrero.m que contenga las siguientes lneas:

closeplot
u=-8:0.5:8; v=u;
[U,V]=meshgrid(u,v);
R=sqrt(U.^2+V.^2)+eps;

Pg -75-

Manual de Iniciacin a GNU Octave


W=sin(R)./R;
mesh(W)

Se habr podido comprobar que la funcin mesh dibuja en perspectiva una


funcin en base a una retcula de lneas de colores, rodeando cuadrilteros del color de
fondo, con eliminacin de lneas ocultas. Ejectese ahora el comando:
octave:91> surf(W)

En vez de lneas aparece ahora una superficie faceteada (aunque no es


fcilmente visible, pero de manera terica es as). El color de las facetas depende
tambin del valor de la funcin.

Pg -76-

Manual de Iniciacin a GNU Octave

5.1.3 Dibujo de lneas de contorno: Funcin CONTOUR


Una forma distinta de representar funciones tridimensionales es por medio de
isolneas o curvas de nivel. A continuacin se ver cmo se puede utilizar estas
representaciones con las matrices de datos Z y W que se han calculado previamente:
octave:3>contour(Z,20)
octave:5>contour(W,20)

donde "20" representa el nmero de lneas de nivel. Si no se pone se utiliza un


nmero por defecto.
Otras posibles formas de estas funciones son las siguientes:

contour(Z, val)

siendo val un vector de valores para las isolneas a


dibujar.

contour(u,v,W,20) se utilizan u y v para dar valores a los ejes de


coordenadas.

Pg -77-

Manual de Iniciacin a GNU Octave

5.2. Elementos Generales: Ejes, Puntos de vista, lneas ocultas,


Las funciones surf y mesh dibujan funciones tridimensionales en perspectiva. La
localizacin del punto de vista o direccin de observacin se puede hacer mediante la
funcin view, que tiene la siguiente forma:
view(azimut, elev)

donde azimut es el ngulo de rotacin de un plano horizontal, medido sobre el


eje z a partir del eje x en sentido antihorario, y elev es el ngulo de elevacin respecto al
plano (x-y). Ambos ngulos se miden en grados, y pueden tomar valores positivos y
negativos. Tambin se puede definir la direccin del punto de vista mediante las tres
coordenadas cartesianas de un vector (slo se tiene en cuenta la direccin):
view([xd,yd,zd])

En los grficos tridimensionales existen funciones para controlar los ejes,


por ejemplo:

axis([xmin,xmax,ymin,ymax,zmin,zmax])

Tambin se pueden utilizar las funciones siguientes: xlabel, ylabel, zlabel,


axis(auto), axis(axis), etc.
Las funciones mesh y surf disponen de un algoritmo de eliminacin de lneas
ocultas (los polgonos o facetas, no dejan ver las lneas que estn detrs). El comando
hidden activa y desactiva la eliminacin de lneas ocultas.
En el dibujo de funciones tridimensionales, a veces tambin son tiles los NaNs.
Cuando una parte de los elementos de la matriz de valores Z son NaNs, esa parte de la
superficie no se dibuja, permitiendo ver el resto de la superficie.

Pg -78-

Manual de Iniciacin a GNU Octave

6. Otros aspectos de GNU Octave

6.1 Guardar variables y estados de una sesin: Comandos save y


load
En muchas ocasiones puede resultar interesante interrumpir el trabajo con GNU
Octave y poderlo recuperar ms tarde en el mismo punto en el que se dej (con las
mismas variables definidas, con los mismos resultados intermedios, etc.). Hay que tener
en cuenta que al salir del programa todo el contenido de la memoria se borra
automticamente.
Para guardar el estado de una sesin de trabajo en el directorio actual existe el
comando save. Si se teclea:

octave:2>save

antes de abandonar el programa, se crea un fichero binario con el estado de la


sesin (excepto los grficos, que por ocupar mucha memoria hay que guardar aparte).
Dicho estado puede recuperarse la siguiente vez que se arranque el programa
con el comando:
octave:3>load

Esta es la forma ms bsica de los comandos save y load. Se pueden guardar


tambin matrices y vectores de forma selectiva y en ficheros con nombre especificado
por el usuario. Por ejemplo, el comando:
octave:4>save filename A, x, y

guarda las variables A, x e y en un fichero binario llamado filename. Para


recuperarlas en otra sesin basta teclear:
octave:5>load filename

Pg -79-

Manual de Iniciacin a GNU Octave


Si no se indica ningn nombre de variable, se guardan todas las variables
creadas en esa sesin.
El comando save permite guardar el estado de la sesin en formato ASCII
utilizndolo de la siguiente forma:
octave:6>save
octave:7>save
octave:8>save
binario
octave:9>save

-ascii #guarda en formato compatible con matlab


text #guarda en formato texto
mat-binary #guarda en formato compatible con matlab en
hdf5

#guarda en formato hdf5

Cuando se recuperan estos ficheros con load tipo la informacin se recupera,


hay que tener cuidado si guardamos en ascii o en text dado que la informacin
recuperada se hace en una sola matriz.

Pg -80-

Manual de Iniciacin a GNU Octave

6.2 Guardar sesin: Comando diary


Los comandos save y load crean ficheros binarios o ASCII con el estado de la
sesin. Existe otra forma ms sencilla de almacenar en un fichero un texto que describa
lo que el programa va haciendo. El comando diary nos permite guardar el proceso de
trabajo en un archivo de tipo texto:

octave:32>diary filename

6.3 Medida de tiempos y de esfuerzo de clculo


GNU Octave dispone tambin de funciones que permiten calcular el tiempo
empleado en las operaciones matemticas realizadas. Algunas de estas funciones son las
siguientes:

cputime devuelve el tiempo de CPU (con precisin de centsimas de segundo)


desde que el programa arranc. Llamando antes y despus de realizar una
operacin y restando los valores devueltos, se puede saber el tiempo de CPU
empleado en esa operacin. Este tiempo sigue corriendo aunque GNU Octave
est inactivo.

etime(t2, t1) tiempo transcurrido entre los vectores t1 y t2 (atencin al orden!),


obtenidos como respuesta al comando clock.

tic operacioness toc imprime el tiempo en segundos requerido por ops. El


comando tic pone el reloj a cero y toc obtiene el tiempo transcurrido.

Pg -81-

Manual de Iniciacin a GNU Octave

6.4. Funciones de funcin


En GNU Octave existen funciones a las que hay que pasar como argumento el
nombre de otras funciones, para que puedan ser llamadas desde dicha funcin. As
sucede por ejemplo si se desea calcular la integral definida de una funcin, resolver una
ecuacin no lineal, o integrar numricamente una ecuacin diferencial ordinaria
(problema de valor inicial). Estos sern los tres casos de gran importancia prctica
que se van a ver a continuacin. Se comenzar por medio de un ejemplo, utilizando una
funcin llamada prueba que se va a definir en un fichero llamado prueba.m
function y=prueba(x)
y = 1./((x-.3).^2+.01)+1./((x-.9).^2+.04)-6;

6.4.1 Integracin numrica de funciones


Lo primero que se va a hacer es calcular la integral definida de esta funcin
entre dos valores de la abscisa x. En ingls, al clculo numrico de integrales definidas
se le llama quadrature. Sabiendo eso, no resulta extrao el comando con el cual se
calcula el rea comprendida bajo la funcin entre los puntos 0 y 1 (obsrvese que el
nombre de la funcin a integrar se pasa entre apstrofos, como cadena de caracteres):
octave:45>area = quad('prueba', 0, 1)
area =
29.8583

Si se teclea help quad se puede obtener ms de informacin sobre esta funcin.

Pg -82-

Manual de Iniciacin a GNU Octave

6.4.2

Integracin

Numrica

de

Ecuaciones

Diferenciales

Ordinarias
GNU Octave dispone de varias funciones capaces de realizar la integracin de
ecuaciones diferenciales; si hacemos uso del fichero tiropar.m:

function deriv=tiropar(t,y)
fac=-(0.001/1.0)*sqrt((y(1)^2+y(2)^2));
deriv=zeros(4,1);
deriv(1)=fac*y(1);
deriv(2)=fac*y(2)-9.8;
deriv(3)=y(1);
deriv(4)=y(2);
end

donde se han supuesto unas constantes con los valores de c=0.001, m=1 y g=9.8.
Falta fijar los valores iniciales de posicin y velocidad. Se supondr que el proyectil
parte del origen con una velocidad de 100 m/seg y con un ngulo de 30, lo que conduce
a los valores iniciales siguientes:
u(0)=100*cos(pi/6), v(0)=100*sin(pi/6), x(0)=0, y(0)=0.
Los comandos para realizar la integracin son los siguientes (se podran agrupar en un
fichero llamado tiroparMain.m):
t0=0;
tf=9;
y0=[100*cos(pi/6) 100*sin(pi/6) 0 0]';
[t,Y]=ode23('tiropar',[t0,tf],y0);
plot(t,Y(:,4))

# dibujo de la altura en funcion del tiempo

podemos encontrar varios tipos de funciones que resuelven ecuaciones


diferenciales:

ode23 : resuelve ecuaciones diferenciales de 2 y 3er orden

ode45 : resuelve ecuaciones diferenciales de 4 y 5 orden

ode78 : resuelve ecuaciones diferenciales usando frmulas de 7 orden

Pg -83-

GNUFreeDocumentationLicense
GNUFreeDocumentationLicense
Version1.2,November2002
Copyright(C)2000,2001,2002FreeSoftwareFoundation,Inc.
51FranklinSt,FifthFloor,Boston,MA021101301USA
Everyoneispermittedtocopyanddistributeverbatimcopies
ofthislicensedocument,butchangingitisnotallowed.
0.PREAMBLE
ThepurposeofthisLicenseistomakeamanual,textbook,orotherfunctionalandusefuldocument
"free"inthesenseoffreedom:toassureeveryonetheeffectivefreedomtocopyandredistributeit,
withorwithoutmodifyingit,eithercommerciallyornoncommercially.
Secondarily,thisLicensepreservesfortheauthorandpublisherawaytogetcreditfortheirwork,
whilenotbeingconsideredresponsibleformodificationsmadebyothers.
ThisLicenseisakindof"copyleft",whichmeansthatderivativeworksofthedocumentmust
themselvesbefreeinthesamesense.ItcomplementstheGNUGeneralPublicLicense,whichisa
copyleftlicensedesignedforfreesoftware.
WehavedesignedthisLicenseinordertouseitformanualsforfreesoftware,becausefreesoftware
needsfreedocumentation:afreeprogramshouldcomewithmanualsprovidingthesamefreedoms
thatthesoftwaredoes.ButthisLicenseisnotlimitedtosoftwaremanuals;itcanbeusedforany
textual work, regardless of subject matter or whether it is published as a printed book. We
recommendthisLicenseprincipallyforworkswhosepurposeisinstructionorreference.
1.APPLICABILITYANDDEFINITIONS
ThisLicenseappliestoanymanualorotherwork,inanymedium,thatcontainsanoticeplacedby
thecopyrightholdersayingitcanbedistributedunderthetermsofthisLicense. Suchanotice
grants a worldwide, royaltyfree license, unlimited in duration, to use that work under the
conditionsstatedherein.The"Document",below,referstoanysuchmanualorwork.Anymember
ofthepublicisalicensee,andisaddressedas"you".Youacceptthelicenseifyoucopy,modifyor
distributetheworkinawayrequiringpermissionundercopyrightlaw.
A"ModifiedVersion"oftheDocumentmeansanyworkcontainingtheDocumentoraportionofit,
eithercopiedverbatim,orwithmodificationsand/ortranslatedintoanotherlanguage.
A"SecondarySection"isanamedappendixorafrontmattersectionoftheDocumentthatdeals
exclusivelywiththerelationshipofthepublishersorauthorsoftheDocumenttotheDocument's
overallsubject(ortorelatedmatters)andcontainsnothingthatcouldfalldirectlywithinthatoverall

subject.(Thus,iftheDocumentisinpartatextbookofmathematics,aSecondarySectionmaynot
explainanymathematics.) Therelationshipcouldbeamatterofhistoricalconnectionwiththe
subjectorwithrelatedmatters,oroflegal,commercial,philosophical,ethicalorpoliticalposition
regardingthem.
The"InvariantSections"arecertainSecondarySectionswhosetitlesaredesignated,asbeingthose
ofInvariantSections,inthenoticethatsaysthattheDocumentisreleasedunderthisLicense.Ifa
sectiondoesnotfittheabovedefinitionofSecondarythenitisnotallowedtobedesignatedas
Invariant.TheDocumentmaycontainzeroInvariantSections.IftheDocumentdoesnotidentify
anyInvariantSectionsthentherearenone.
The"CoverTexts"arecertainshortpassagesoftextthatarelisted,asFrontCoverTextsorBack
CoverTexts,inthenoticethatsaysthattheDocumentisreleasedunderthisLicense.AFrontCover
Textmaybeatmost5words,andaBackCoverTextmaybeatmost25words.
A"Transparent"copyoftheDocumentmeansamachinereadablecopy,representedinaformat
whosespecificationisavailabletothegeneralpublic,thatissuitableforrevisingthedocument
straightforwardly with generic text editors or (for images composed of pixels) generic paint
programsor(fordrawings)somewidelyavailabledrawingeditor,andthatissuitableforinputto
text formatters or for automatic translation to a variety of formats suitable for input to text
formatters. AcopymadeinanotherwiseTransparentfileformatwhosemarkup,orabsenceof
markup, has been arranged to thwart or discourage subsequent modification by readers is not
Transparent.AnimageformatisnotTransparentifusedforanysubstantialamountoftext.Acopy
thatisnot"Transparent"iscalled"Opaque".
ExamplesofsuitableformatsforTransparentcopiesincludeplainASCIIwithoutmarkup,Texinfo
inputformat,LaTeXinputformat,SGMLorXMLusingapubliclyavailableDTD,andstandard
conforming simple HTML, PostScript or PDF designed for humanmodification. Examples of
transparent image formats include PNG, XCF and JPG. Opaque formats include proprietary
formatsthatcanbereadandeditedonlybyproprietarywordprocessors,SGMLorXMLforwhich
theDTDand/orprocessingtoolsarenotgenerallyavailable,andthemachinegeneratedHTML,
PostScriptorPDFproducedbysomewordprocessorsforoutputpurposesonly.
The"TitlePage"means,foraprintedbook,thetitlepageitself,plussuchfollowingpagesasare
neededtohold,legibly,thematerialthisLicenserequirestoappearinthetitlepage.Forworksin
formats which do not have any title page as such, "Title Page" means the text near the most
prominentappearanceofthework'stitle,precedingthebeginningofthebodyofthetext.
Asection"EntitledXYZ"meansanamedsubunitoftheDocumentwhosetitleeitherisprecisely
XYZorcontainsXYZinparenthesesfollowingtextthattranslatesXYZinanotherlanguage.(Here
XYZ stands for a specific section name mentioned below, such as "Acknowledgements",
"Dedications","Endorsements",or"History".)To"PreservetheTitle"ofsuchasectionwhenyou
modifytheDocumentmeansthatitremainsasection"EntitledXYZ"accordingtothisdefinition.

TheDocumentmayincludeWarrantyDisclaimersnexttothenoticewhichstatesthatthisLicense
appliestotheDocument.TheseWarrantyDisclaimersareconsideredtobeincludedbyreferencein
thisLicense,butonlyasregardsdisclaimingwarranties:anyotherimplicationthattheseWarranty
DisclaimersmayhaveisvoidandhasnoeffectonthemeaningofthisLicense.
2.VERBATIMCOPYING
You may copy and distribute the Document in any medium, either commercially or
noncommercially,providedthatthisLicense,thecopyrightnotices,andthelicensenoticesaying
this License applies to the Document are reproduced in all copies, and that you add no other
conditionswhatsoevertothoseofthisLicense.Youmaynotusetechnicalmeasurestoobstructor
controlthereadingorfurthercopyingofthecopiesyoumakeordistribute. However,youmay
acceptcompensationinexchangeforcopies.Ifyoudistributealargeenoughnumberofcopiesyou
mustalsofollowtheconditionsinsection3.
Youmayalsolendcopies,underthesameconditionsstatedabove,andyoumaypubliclydisplay
copies.
3.COPYINGINQUANTITY
If you publish printed copies (or copies in media that commonly have printed covers) of the
Document,numberingmorethan100,andtheDocument'slicensenoticerequiresCoverTexts,you
mustenclosethecopiesincoversthatcarry,clearlyandlegibly,alltheseCoverTexts:FrontCover
Textsonthefrontcover,andBackCoverTextsonthebackcover.Bothcoversmustalsoclearlyand
legiblyidentifyyouasthepublisherofthesecopies.Thefrontcovermustpresentthefulltitlewith
allwordsofthetitleequallyprominentandvisible.Youmayaddothermaterialonthecoversin
addition. Copyingwithchanges limited tothecovers,as longas theypreservethe titleof the
Documentandsatisfytheseconditions,canbetreatedasverbatimcopyinginotherrespects.
Iftherequiredtextsforeithercoveraretoovoluminoustofitlegibly,youshouldputthefirstones
listed(asmanyasfitreasonably)ontheactualcover,andcontinuetherestontoadjacentpages.
IfyoupublishordistributeOpaquecopiesoftheDocumentnumberingmorethan100,youmust
eitherincludeamachinereadableTransparentcopyalongwitheachOpaquecopy,orstateinor
witheachOpaquecopyacomputernetworklocationfromwhichthegeneralnetworkusingpublic
hasaccesstodownloadusingpublicstandardnetworkprotocolsacompleteTransparentcopyofthe
Document,freeofaddedmaterial.Ifyouusethelatteroption,youmusttakereasonablyprudent
steps,whenyoubegindistributionofOpaquecopiesinquantity,toensurethatthisTransparentcopy
willremainthusaccessibleatthestatedlocationuntilatleastoneyearafterthelasttimeyou
distributeanOpaquecopy(directlyorthroughyouragentsorretailers)ofthateditiontothepublic.
It is requested, but not required, that you contact the authors of the Document well before
redistributinganylargenumberofcopies,togivethemachancetoprovideyouwithanupdated
versionoftheDocument.

4.MODIFICATIONS
YoumaycopyanddistributeaModifiedVersionoftheDocumentundertheconditionsofsections
2and3above,providedthatyoureleasetheModifiedVersionunderpreciselythisLicense,withthe
ModifiedVersionfillingtheroleoftheDocument,thuslicensingdistributionandmodificationof
theModifiedVersiontowhoeverpossessesacopyofit.Inaddition,youmustdothesethingsinthe
ModifiedVersion:
A.UseintheTitlePage(andonthecovers,ifany)atitledistinctfromthatoftheDocument,and
fromthoseofpreviousversions(whichshould,iftherewereany,belistedintheHistorysection
oftheDocument).Youmayusethesametitleasapreviousversioniftheoriginalpublisherofthat
versiongivespermission.
B.ListontheTitlePage,asauthors,oneormorepersonsorentitiesresponsibleforauthorshipof
themodificationsintheModifiedVersion,togetherwithatleastfiveoftheprincipalauthorsofthe
Document(allofitsprincipalauthors,ifithasfewerthanfive),unlesstheyreleaseyoufromthis
requirement.
C.StateontheTitlepagethenameofthepublisheroftheModifiedVersion,asthepublisher.
D.PreserveallthecopyrightnoticesoftheDocument.
E. Add an appropriate copyright notice for your modifications adjacent to the other copyright
notices.
F.Include,immediatelyafterthecopyrightnotices,alicensenoticegivingthepublicpermissionto
usetheModifiedVersionunderthetermsofthisLicense,intheformshownintheAddendum
below.
G.PreserveinthatlicensenoticethefulllistsofInvariantSectionsandrequiredCoverTextsgiven
intheDocument'slicensenotice.
H.IncludeanunalteredcopyofthisLicense.
I.PreservethesectionEntitled"History",PreserveitsTitle,andaddtoitanitemstatingatleastthe
title,year,newauthors,andpublisheroftheModifiedVersionasgivenontheTitlePage.Ifthereis
no section Entitled "History" in the Document, create one stating the title, year, authors, and
publisheroftheDocumentasgivenonitsTitlePage,thenaddanitemdescribingtheModified
Versionasstatedintheprevioussentence.
J.Preservethenetworklocation,ifany,givenintheDocumentforpublicaccesstoaTransparent
copyoftheDocument,andlikewisethenetworklocationsgivenintheDocumentforprevious
versionsitwasbasedon.Thesemaybeplacedinthe"History"section.Youmayomitanetwork
locationforaworkthatwaspublishedatleastfouryearsbeforetheDocumentitself,orifthe
originalpublisheroftheversionitreferstogivespermission.
K.ForanysectionEntitled"Acknowledgements"or"Dedications",PreservetheTitleofthesection,
andpreserveinthesectionallthesubstanceandtoneofeachofthecontributoracknowledgements
and/ordedicationsgiventherein.
L.PreservealltheInvariantSectionsoftheDocument,unalteredintheirtextandintheirtitles.
Sectionnumbersortheequivalentarenotconsideredpartofthesectiontitles.
M. Delete any section Entitled "Endorsements". Such a section may not be included in the
ModifiedVersion.
N.DonotretitleanyexistingsectiontobeEntitled"Endorsements"ortoconflictintitlewithany

InvariantSection.
O.PreserveanyWarrantyDisclaimers.
IftheModifiedVersionincludesnewfrontmattersectionsorappendicesthatqualifyasSecondary
SectionsandcontainnomaterialcopiedfromtheDocument,youmayatyouroptiondesignate
someorallofthesesectionsasinvariant.Todothis,addtheirtitlestothelistofInvariantSections
intheModifiedVersion'slicensenotice.Thesetitlesmustbedistinctfromanyothersectiontitles.
YoumayaddasectionEntitled"Endorsements",provideditcontainsnothingbutendorsementsof
yourModifiedVersionbyvariouspartiesforexample,statementsofpeerrevieworthatthetexthas
beenapprovedbyanorganizationastheauthoritativedefinitionofastandard.
YoumayaddapassageofuptofivewordsasaFrontCoverText,andapassageofupto25words
asaBackCoverText,totheendofthelistofCoverTextsintheModifiedVersion. Onlyone
passageofFrontCoverTextandoneofBackCoverTextmaybeaddedby(orthrougharrangements
made by) any one entity. If the Document already includes a cover text for the same cover,
previouslyaddedbyyouorbyarrangementmadebythesameentityyouareactingonbehalfof,you
maynotaddanother;butyoumayreplacetheoldone,onexplicitpermissionfromtheprevious
publisherthataddedtheoldone.
Theauthor(s)andpublisher(s)oftheDocumentdonotbythisLicensegivepermissiontousetheir
namesforpublicityforortoassertorimplyendorsementofanyModifiedVersion.
5.COMBININGDOCUMENTS
YoumaycombinetheDocumentwithotherdocumentsreleasedunderthisLicense,undertheterms
definedinsection4aboveformodifiedversions,providedthatyouincludeinthecombinationallof
theInvariantSectionsofalloftheoriginaldocuments,unmodified,andlistthemallasInvariant
Sections of your combinedworkinits licensenotice,andthatyoupreservealltheirWarranty
Disclaimers.
ThecombinedworkneedonlycontainonecopyofthisLicense,andmultipleidenticalInvariant
Sectionsmaybereplacedwithasinglecopy.IftherearemultipleInvariantSectionswiththesame
namebutdifferentcontents,makethetitleofeachsuchsectionuniquebyaddingattheendofit,in
parentheses,thenameoftheoriginalauthororpublisherofthatsectionifknown,orelseaunique
number.MakethesameadjustmenttothesectiontitlesinthelistofInvariantSectionsinthelicense
noticeofthecombinedwork.
In the combination, you must combine any sections Entitled "History" in the various original
documents, forming one section Entitled "History"; likewise combine any sections Entitled
"Acknowledgements", and any sections Entitled "Dedications". You must delete all sections
Entitled"Endorsements".

6.COLLECTIONSOFDOCUMENTS
YoumaymakeacollectionconsistingoftheDocumentandotherdocumentsreleasedunderthis
License,andreplacetheindividualcopiesofthisLicenseinthevariousdocumentswithasingle
copy that is included in the collection, provided that you follow the rules of this License for
verbatimcopyingofeachofthedocumentsinallotherrespects.
Youmayextractasingledocumentfromsuchacollection,anddistributeitindividuallyunderthis
License,providedyouinsertacopyofthisLicenseintotheextracteddocument,andfollowthis
Licenseinallotherrespectsregardingverbatimcopyingofthatdocument.
7.AGGREGATIONWITHINDEPENDENTWORKS
AcompilationoftheDocumentoritsderivativeswithotherseparateandindependentdocumentsor
works, in or on a volume of a storage or distribution medium, is called an "aggregate" if the
copyrightresultingfromthecompilationisnotusedtolimitthelegalrightsofthecompilation's
usersbeyondwhattheindividualworkspermit.WhentheDocumentisincludedinanaggregate,
thisLicensedoesnotapplytotheotherworksintheaggregatewhicharenotthemselvesderivative
worksoftheDocument.
IftheCoverTextrequirementofsection3isapplicabletothesecopiesoftheDocument,thenifthe
Documentislessthanonehalfoftheentireaggregate,theDocument'sCoverTextsmaybeplaced
oncoversthatbrackettheDocumentwithintheaggregate,ortheelectronicequivalentofcoversif
theDocumentisinelectronicform.Otherwisetheymustappearonprintedcoversthatbracketthe
wholeaggregate.
8.TRANSLATION
Translationisconsideredakindofmodification,soyoumaydistributetranslationsoftheDocument
under the terms of section 4. Replacing Invariant Sections with translations requires special
permissionfromtheircopyrightholders,butyoumayincludetranslationsofsomeorallInvariant
Sections in addition to the original versions of these Invariant Sections. You may include a
translation of this License, and all the license notices in the Document, and any Warranty
Disclaimers,providedthatyoualsoincludetheoriginalEnglishversionofthisLicenseandthe
originalversionsofthosenoticesanddisclaimers.Incaseofadisagreementbetweenthetranslation
andtheoriginalversionofthisLicenseoranoticeordisclaimer,theoriginalversionwillprevail.
If a section intheDocumentisEntitled"Acknowledgements","Dedications", or"History", the
requirement(section4)toPreserveitsTitle(section1)willtypicallyrequirechangingtheactual
title.
9.TERMINATION
Youmaynotcopy,modify,sublicense,ordistributetheDocumentexceptasexpresslyprovidedfor
underthisLicense. Anyotherattempttocopy,modify,sublicenseordistributetheDocumentis
void,andwillautomaticallyterminateyourrightsunderthisLicense.However,partieswhohave

receivedcopies,orrights,fromyouunderthisLicensewillnothavetheirlicensesterminatedso
longassuchpartiesremaininfullcompliance.
10.FUTUREREVISIONSOFTHISLICENSE
TheFreeSoftwareFoundationmaypublishnew,revisedversionsoftheGNUFreeDocumentation
Licensefromtimetotime.Suchnewversionswillbesimilarinspirittothepresentversion,but
maydifferindetailtoaddressnewproblemsorconcerns.Seehttp://www.gnu.org/copyleft/.
EachversionoftheLicenseisgivenadistinguishingversionnumber.IftheDocumentspecifiesthat
aparticularnumberedversionofthisLicense"oranylaterversion"appliestoit,youhavetheoption
offollowingthetermsandconditionseitherofthatspecifiedversionorofanylaterversionthathas
beenpublished(notasadraft)bytheFreeSoftwareFoundation.IftheDocumentdoesnotspecify
aversionnumberofthisLicense,youmaychooseanyversioneverpublished(notasadraft)bythe
FreeSoftwareFoundation.

También podría gustarte