INTRODUCCIÓN A OCTAVE
MTIE ROBERTO DIAZ CUESTA
¿QUÉ ES GNU OCTAVE?
El proyecto nace alrededor de 1988 con la finalidad de ser usado en
un curso de reactores químicos y en 1992 lo extienden para su uso
como el día de hoy.
Octave o GNU Octave es un programa libre para realizar cálculos
numéricos. Como indica su nombre es parte del proyecto GNU.
Apoyado en una amplia comunidad de desarrolladores y usuarios,
Octave cuenta con herramientas para la resolución de problemas de
cálculo numérico lineales y no lineales: álgebra lineal, aproximación
de raíces de ecuaciones, integración numérica, integración de
ecuaciones diferenciales, etc., así como para la representación de
gráficos en dos y tres dimensiones. Es fácilmente extensible y
adaptable mediante funciones definidas por el usuario, bien
utilizando el propio lenguaje de Octave o bien mediante módulos
escritos en C++, C, Fortran u otros lenguajes.
INSTALACIÓN:
https://octave.org/download#ms-Windows
https://octave-online.net/
INTERFAZ GRÁFICA DE USUARIO (GUI)
FUNDAMENTOS DE PROGRAMACIÓN EN OCTAVE
CURSO GNU OCTAVE
PARA NO ROMPER LA TRADICIÓN: VARIABLES
Variables simples numéricas, entre Enteros. Contienen un valor entero.
estas: Reales. Contiene un valor real.
Variables múltiples numéricas, entre Vectores. Contiene un vector de valores.
estas: Matrices. Contiene una matriz de valores.
Cadenas de caracteres. Contiene una cadena de caracteres.
Registros.
DECLARACIÓN DE VARIABLES
• Enteros:
int = 2; % Este crea una variable llamada 'int' con el valor 2
•
Reales:
float = 1.5; % Este crea una variable llamada 'float' con el valor 1,5
•
Cadenas de caracteres, un tipo de cadena sería:
cad = 'Hola mundo'; % Este crea una variable llamada 'cad' con la cadena de
caracteres 'Hola mundo'.
Una variable se puede declarar con el ';' al final o sin él. La diferencia es que con el ';', la variable no es mostrada
en el terminal.
DECLARACIÓN DE VARIABLES
Vectores
Los vectores pueden distinguirse por:
•
Vector fila. Este tipo de vector es declarado mediante:
V = [1 2 3]
•
Vector columna. Este otro tipo se declara:
V = [1 ; 2 ; 3]
DECLARACIÓN DE VARIABLES
Matrices
Como sabemos las matrices poseen filas y columnas, por lo que para ello se realiza una combinación de los dos
tipos de vectores:
M = [1 2 ; 3 4 ; 5 6]
Esto declarará un vector de tres filas y dos columnas.
ACCESO A ELEMENTOS DE VARIABLES MÚLTIPLES
Acceso a elementos
El acceso a un elemento de un vector o matriz, se hace indicando su posición en el vector o matriz. Los vectores en este
caso pueden ser tratados como matrices, obligatoriamente los vectores columnas deben ser tratados como matrices 1XN.
En Octave la primera fila de un vector o matriz se identifica mediante 1 y la última posición se identifica mediante N.
Vector fila. Si se quiere acceder a la posición N de un vector usaríamos: V(N).
Vector Columna. Si se quiere acceder a la posición N de un vector columna: V(1,N).
Matrices: Para acceder a la posición N,M de una matriz, usaremos: M(N,M)
Esto nos puede permitir editar una determinada posición de un vector o matriz.
OPERACIONES BÁSICAS
Suma. Esta operación se realiza mediante el uso del símbolo '+'. Por lo que para realizar una suma tan solo tendremos que poner los valores a sumar:
suma = 1 + 2
Resta. Esta operación se realiza mediante el uso del símbolo '-'. Por lo que para realizar una resta tan solo tendremos que poner los valores a restar:
resta = 1 - 2
Multiplicación. Esta operación se realiza mediante el uso del símbolo '*'. Por lo que para realizar una multiplicación tan solo tendremos que poner los valores a multiplicar:
multiplicación=1*2
División. Esta operación se realiza mediante el uso del símbolo '/'. Por lo que para realizar una división tan solo tendremos que poner los valores a dividir:
división = 1 / 2
Raíz cuadrada. Esta operación se realiza mediante la función sqrt(). Por lo que para calcular la raiz cuadrada de un número N, usamos:
sqrt(N)
Exponenciales. Para calcular el exponencial de un número se utiliza el símbolo '^'. Para calcular 2 elevado a 3, se usa:
2 ^ 3.
OPERACIONES CON VECTORES Y MATRICES
En Octave podemos realizar también operaciones con matrices y vectores, como pueden ser:
Transposición.
Aritmética escalar.
Aplicación de funciones sobre matrices.
Suma y resta.
Producto escalar.
Multiplicación.
Determinantes.
Matriz inversa.
Estas operaciones se puede realizar mediante el uso de funciones definidas por Octave, por lo que las veremos en el tema de funciones.
ENTRADA Y SALIDA
Entrada de datos por teclado
Para que nuestro programa en Octave sea interactivo, debemos
dar al usuario la posibilidad de hacer selección de opciones e
introducir datos por teclado cuando sea necesario. Para realizar
esta tarea, llamada de "entrada de datos", usaremos la
función input. Por ejemplo, vamos a pedir al usuario la base y la
altura de un triángulo:
base = input('Introduce la longitud de la base: ');
altura = input('Introduce la altura: ');
De esta manera, cuando nuestro programa se ejecute, mostrará
al usuario el primer mensaje y quedará la espera de que el
usuario introduzca un valor numérico y pulse la tecla Intro,
almacenando el valor introducido en la variable 'base'. Después
mostrará el siguiente mensaje para recoger el valor de la altura.
ENTRADA Y SALIDA
Cada vez que queremos mostrar en pantalla un
resultado al usuario, debemos hacer uso de las
llamadas funciones de "salida". La función más
popular de Octave para realizar dicha tarea se
llama disp. Por ejemplo, el siguiente código mostrará
el resultado de sumar dos variables:
a = 3.14/2;
b = sin(a);
c = a+b;
disp(c);
EJERCICIOS PRACTICA
• Ejercicio 1: Escribe un programa en Octave que muestre en pantalla "¡Hola, Octave!".
• Ejercicio 2: Crea un script en Octave que solicite al usuario su nombre y luego lo imprima en pantalla junto con
un saludo personalizado.
RELACIONES LÓGICAS Y OPERADORES LÓGICOS
Operadores de comparación
x < y. Verdadero si x es menor que y.
x <= y. Verdadero si x es menor igual que y.
x == y. Verdadero si x es igual que y.
x >= y. Verdadero si x es mayor igual que y.
x > y. Verdadero si x es mayor que y.
x != y Verdadero si x es distinto que y.
RELACIONES LÓGICAS Y OPERADORES LÓGICOS
Operadores lógicos
•
condicion1 && condicion2. Indica que los elementos que son unidos por este operador tienen que ser verdaderos
para que sea verdadero.
•
condicion1 || condicion2. Indica que al menos un elemento de los cuales son unidos por este operador tiene que ser
verdadero para que sea verdadero.
CONDICIONALES
as sentencias condicionales se utilizan para ejecutar
líneas de código de forma opcional, para ello existen
distintas sencias condicionales entre las que podemos
encontrar:
•
if
•
elseif
•
else
•
switch
SENTENCIA IF
La sentencia if, evalúa una condición. Si la condición es verdadera ejercutará su cuerpo, en caso contrario no lo hará, su estructura es la
siguiente:
if condicion
cuerpo
end
Para entenderlo mejor vamos a ver un ejemplo donde queremos comprobar que un número sea mayor que diez, para
conseguir esto el código a introducir debería ser el siguiente:
if n > 10
disp("El número es mayor que diez")
end
SENTENCIA ELSEIF
La sentencia elseif, va junto a la sentencia if. En primer lugar evalua la sentencia if y si su condición else es cierta, evalúa la condición de la sentencia elseif. Pasa exactamente igual que con la sentencia if, si la
condición es verdadera ejecuta el cuerpo, mientras que si es falsa no lo hace. Su estructura es:
if condicionIf
cuerpoIf
elseif conficionElseif
cuerpoElseif
end
Vamos a continuar con el ejemplo anterior en el que comprobamos si un número era mayor que diez, ahora queremos que también podamos saber si dicho número es menor que diez,
por ello el código sería:
if n > 10
disp("El número es mayor que diez")
elseif n < 10
disp("El número es menor que diez")
end
SENTENCIA ELSE
La sentencia else, irá junto con con la sentencia if, también puede ir la sentencia elseif. En este caso si ninguna de las condiciones anteriores es cierta, se ejecutará el else. Su estructura es la siguiente:
if condicionIf
cuerpoIf
elseif conficionElseif
cuerpoElseif
else
cuerpoElse
end
Finalmente si en el ejemplo anterior queremos también que compruebe si dicho número es igual a diez, tendríamos que poner:
if n > 10
disp("El número es mayor que diez")
elseif n < 10
disp("El número es menor que diez")
else
disp("El número es diez")
end
SENTENCIA SWITCH
Si lo que buscamos es tener varios if juntos, podemos usar la sentencia switch la cual simplifica esta operación. La sentencia switch, se compara el valor de una variable o el resultado de evaluar una
expresión, con un conjunto de valores valor1, valor2, ..., cuando coinciden se ejecuta el bloque de sentencias que están asociadas. Si el compilador no encuentra coincidencia, se ejecuta la
sentencia otherwise, si es que está presente en el código. Su estructura es la siguiente:
switch expresion
case valor 1
sentencias_1
case valor 2
sentencias_2
case valor 3
sentencias_3
otherwise
sentencias_otherwise
end
CICLO FOR
El bucle for hace que sea más conveniente para contar las iteraciones de un bucle. La forma general para declarar un for es:
for variable = expresion
cuerpo
end
Donde el cuerpo significa cualquier declaración o lista de instrucciones, expresión cualquier expresión válida, y variable puede tomar
varias formas. Por lo general, se trata de un nombre de variable simple o una variable indexada. Si el valor de la expresión es una
estructura, variable también puede ser un vector de dos elementos.
La expresión de asignación en el comando for, funciona de forma diferente a lo normal. En lugar de asignar el resultado completo de
la expresión, se asigna cada columna de la expresión a su vez a variable. Si la expresión es un rango, un vector fila, o un escalar, el valor
de variable será un escalar cada vez que se ejecuta el cuerpo del bucle. Si variable es un vector columna o una matriz, variable será un
vector columna cada vez que e ejecuta el cuerpo del bucle.
EJEMPLO FOR
Para entender bien el funcionamiento de un bucle for, vamos a poner un ejemplo. Supongamos que tenemos un vector
columna, y queremos que se muestren cada uno de los elementos de este vector, por ello el código a usar será el siguiente:
V = [1 ; 2 ; 3 ; 4] % Vector que tenemos
[f,c] = size(V) % La función size devuelve dos valores, el primero indica el numero
de filas, el segundo el numero de columnas, por lo que se almacenan en las
variables f y c
for i = 1:f % i tomara los valores de 1 a f
V(i,1) % mostrara los elementos del vector uno a uno
end
CICLO WHILE
Este tipo de bucle realiza una operación mientras su condición es válida, la estructura de este tipo de bucle es la
siguiente:
while condicion do
cuerpo
end
En este tipo de bucles la condición se evalúa antes de que el cuerpo se ejecute por primera vez. Si la condición es
verdadera, se entra en el cuerpo del bucle, se evaluará y ejecutará el cuerpo hasta que la condición sea falsa.
EJEMPLO WHILE
Para entenderlo mejor vamos a ver un ejemplo, en el que vamos a tener un número que empieza en 0, y va a entrar
en un bucle while que se evaluará mientras este número sea menor que 10 y dentro del bucle iremos
incrementando en uno este número, por ello el número finalmente valdrá 10.
n = 0
while n < 10
n = n + 1; % El valor de dicha variable incrementa en 1 unidad
end
EJERCICIOS PRACTICA
Reto 1 Sección 1
SECCIÓN 2
FUNCIONES
Las funciones son estructuras de código que poseen una entrada, con la cual trabaja dicha función generando una
salida.
Generalmente nosotros trabajamos con funciones del tipo y=f(x) donde f(x) es una expresión matemática en
términos de la variable x. Se calcula un valor de y (salida) cuando se proporciona un valor de x (entrada) en la
expresión.
CREANDO FUNCIONES
Nosotros podemos crear nuestras propias funciones guardándolas en un fichero, con el fin de usarlas como las funciones predefinidas en Octave. Estas se pueden crear en:
•
Línea de comandos.
•
Fichero, estos deben tener una extensión '.m' y debe encontrarse en el directorio donde estamos ejecutando.
Deben presentar la siguiente estructura:
function variable_salida = nombre_funcion (argumentos_entrada)
cuerpo
end
Un ejemplo para crear una función, sería crear una función que nos de el seno de un número:
function s = sind(x)
s = sin(x*pi/180);
end
A esta función se le llama por medio de la sentencia 'sind(n)', donde 'n' es el número al que queremos obtener su seno.
MATRICES
Es fácil definir valores de matrices en Octave. El tamaño de la matriz se determina automáticamente.
Ejemplo:
a = [1, 2; 3, 4]
Resulta en la matriz:
/ \
|1 2|
a = | |
|3 4|
\ /
MATRICES
Los elementos de la matriz pueden ser elementos arbitrarios, como resultado las dimensiones tienen sentido
cuando combinas varias partes.
Ejemplo:
[ a, a ]
La expresión produce la siguiente matriz:
ans =
1 2 1 2
3 4 3 4
RANGOS Y MATRICES
Definir series de datos equiespaciados a base
de rangos es aplicable a la definición de matrices.
Habrá que tener la precaución de que las filas deben
ser todas con el mismo número de columnas:
A = [1:10; 11:20] % El resultado será la matriz A= [1 2 3...9 10 ; 11 12 ... 19
20]
LECTURA DE LAS COMPONENTES DE UNA MATRIZ
Para leer el valor de una componente de una matriz se pone el nombre de la variable que guarda la matriz y a continuación,
entre paréntesis, la fila y la columna de la componente buscada. La primera fila y la primera columna tienen el índice 1, y
también aquí podemos referirnos abreviadamente al índice de la última fila o columna de la matriz utilizando la claúsula end:
A = [1,2; 3, 4]
A(1,1)
% El resultado será: ans = 1
A(1,end)
% El resultado será: ans = 2
A(end,end)
% El resultado será: ans = 4
LECTURA DE LAS COMPONENTES DE UNA MATRIZ
Podemos utilizar rangos para extraer una serie de valores de la matriz. En este caso el resultado será una
matriz (submatriz) con el numero de filas y columnas acorde a los rangos solicitados:
A = [1,2,3,4; 5,6,7,8; 9,10,11,12; 13,14,15,16]
A(2:3, 2:3)
% El resultado será la matriz [6, 7; 10, 11]
A([2 4],[2 4])
% El resultado será la matriz [6, 8; 14, 16]
LECTURA DE LAS COMPONENTES DE UNA MATRIZ
En el caso de las matrices existe una construcción especial para referirse a todos los elementos de una fila
o columna y es utilizando los dos puntos ‘:’ como índice:
A = [1,2,3,4; 5,6,7,8; 9,10,11,12; 13,14,15,16]
A(:,3)
% El resultado será la columna 3
A(2,:)
% El resultado será la fila 2
MATRICES PREDEFINIDAS
Hay varias funciones utilitarias que permiten construir matrices de tipos particulares:
• eye(n) Forma la matriz identidad cuadrada de dimensión n
• zeros(n) Forma una matriz de ceros cuadrada de dimensión n
• zeros(m,n) Forma una matriz de ceros de m filas y n columnas
• ones(n) Forma una matriz de unos cuadrada de dimensión n
• ones(m,n) Forma una matriz de unos de m filas y n columnas
LA FUNCIÓN SIZE()
La función size(), recibe como parámetro una matriz y nos devuelve un vector de dos componentes con el número de filas y el número de
columnas de la matriz. La forma de la función es:
[ nfilas, ncols] = size(A)
Ejemplo:
A=[123;456;789]
dims=size(A)
La función size() admite un segundo parámetro que si vale 1 nos devolverá el número de filas y si vale 2 nos devolverá el número de
columnas:
Ejemplo: numfilas=size(A,1)
INVERSA, DETERMINANTE Y TRAZA DE UNA MATRIZ
Existen funciones específicas para calcular la inversa, el determinante y la traza de una matriz cuadrada:
• inv()
• det()
• trace()
Si la matriz es singular se producirá un error que será indicado por Octave
APLICACIÓN DE FUNCIONES A MATRICES
En general, cuando pasemos una matriz o un vector como argumento de una función, nos devolvera una
matriz o vector de las mismas dimensiones con la función aplicada elemento a elemento. Por ejemplo:
v=[-pi:pi/4:pi]
sin(v)
APLICACIÓN DE OPERADORES LÓGICOS A MATRICES
Los operadores lógicos (&, |, xor()) o relacionales (<, >, <=, >=, ==, ~=) se pueden utilizar cuando uno o los dos
operandos son matrices.
Cuando aplicamos un operador lógico o relacional a una matriz, el operador se aplicará elemento a elemento,
obteniendo como resultado una matriz de las mismas dimensiones y cuyas componentes son valores logical,
resultado de aplicar la operación al elemento.
A = [1, 2; 3, 4];
B = [1, 0, 3, 0];
C =A&B
% El resultado será: C = [1 0; 1 0]
D=A>2
% El resultado será: D = [0 0; 1 1]
FUNCIONES UTILITARIAS PARA MATRICES
• repmat(A,m,n) Devuelve una matriz resultado de copiar la matriz A en m filas y n columnas. Si A es un
escalar, el resultado será una matriz mxn con valor A en todos los elementos
• diag(A) Siendo A una matriz, devuelve un vector columna con los elementos de la diagonal de A
• diag(v) Siendo v un vector, devuelve una matriz diagonal con los elementos de v ocupando la diagonal.
• blkdiag(A,B) Crea una matriz diagonal de submatrices (por bloques) a partir de las matrices A y AB
EJERCICIOS PRACTICA 2
La variable result = '11X121XX1X21X1' contiene los resultados de los catorce partidos de futbol de la
quiniela de una jornada. La variable apuesta = '112X211X12X1XX' tiene los resultados apostados en una
determinada quiniela. Se pide: (a) Calcule en una sola expresión cuantos resultados hay acertados. (b)
Cuales son los numeros de orden de los partidos que se han acertado. (C) Cuáles son los resultados
acertados.
Desarrolle una función llamada dado() que devuelva un número aleatorio entre uno y seis, todos ellos con
la misma probabilidad de ocurrencia.
Modifique la función dado() del ejercicio anterior de manera que en caso de recibir un número n como
argumento devuelva un vector de n componentes cada una de ellas con el resultado de una tirada de
dado. Si no recibe argumentos seguirá devolviendo un único número entre 1 y 6. Si el parámetro n
recibido como argumento no es entero, se redondeará al entero más proximo.
EJERCICIOS
Reto 2 Sección 2
SECCIÓN 3
VECTORIZACIÓN
Los ciclos For pueden ser reemplazados o simplificados usando sintaxis de vectores. Los operadores * , / y ^ todos
soportan operaciones “sabias” escribiendo un punto . antes de los operadores.
i = 1:2:100; # create an array with 50-elements
x = i.^2; # each element is squared
y = x + 9; # add 9 to each element
z = y./i; # divide each element in y by the corresponding value in i
w = sin (i / 10); # take the sine of each element divided by 10
VECTORIZACIÓN
Una primera aproximación al objetivo de la vectorización es la de escribir código que evite los ciclos y use opresiones del tipo “whole-array”, un
ejemplo trivial seria:
for i = 1:n
for j = 1:m
c(i,j) = a(i,j) + b(i,j);
endfor
Endfor
Comparado con el más simple:
c=a + b
VECTORIZACIÓN
Muchas de las funciones en OCTAVE fueron escritas con argumentos de arreglos y vectores en mente, si te
encuentras escribiendo un ciclo con una operación muy simple, tal vez ya hay una función que hace lo que
necesitas. Las siguientes funciones son ejemplo:
Manipulación de Repetición Aritmética Forma de arreglos
indices vectorizada de grandes
dimensiones
find repmat sum reshape
sub2ind repelems prod resize
ind2sub cumsum permute
sort cumprod squeeze
unique sumsq deal
lookup diff
ifelse / merge dot
cummax
cummin
GRÁFICOS DE LÍNEAS (2D)
Función plot()
Esta función produce graficas en 2 dimensiones a
partir de diferentes combinaciones de argumentos:
Ejemplos:
plot (i / 10, w);
title ('w = sin (i / 10)');
xlabel ('i / 10');
ylabel ('w');
ARGUMENTOS:
linestyle
‘-’ Use solid lines (default).
‘--’ Use dashed lines.
‘:’ Use dotted lines.
‘-.’ Use dash-dotted lines.
ARGUMENTOS:
‘+’ crosshair
‘o’ circle
‘*’ star
‘.’ point
‘x’ cross
‘s’ square
‘d’ diamond
‘^’ upward-facing triangle
‘v’ downward-facing triangle
‘>’ right-facing triangle
‘<’ left-facing triangle
‘p’ pentagram
‘h’ hexagram
ARGUMENTOS
color
‘k’ blacK
‘r’ Red
‘g’ Green
‘b’ Blue
‘y’ Yellow
‘m’ Magenta
‘c’ Cyan
‘w’ White
EJEMPLO
x = 1:5; y = 1:5;
plot (x,y,"g");
title ("plot() de línea verde a 45 grados");
x = 1:5; y = 1:5;
plot (x,y,"g*");
title ("plot() de estrella verde a 45 grados");
x1 = 1:5; y1 = 1:5;
x2 = 5:9; y2 = 5:-1:1;
plot (x1,y1,"bo-", x2,y2,"rs-");
axis ("tight");
title ({"plot() of circulos azules ascendiendo y cuadrados rojos descendiendo";
“conectando el dibujo de las lineas"});
https://octave.sourceforge.io/octave/function/plot.html
PLOT 3D
PLOT 3D
EJERCICIOS PRACTICA 3
GRACIAS