Octave: software libre equivalente a Matlab

En entradas anteriores os he dejado algunos consejos para utilizar Matlab.

Este software es muy potente para nuestros usos en ingeniería y dentro de nuestro grupo de investigación. Sin embargo, a veces me encuentro con algunos estudiantes o profesionales que me preguntan por alguna alternativa que pudiese servir con software libre.

Afortunadamente, Octave es una alternativa con un aspecto y unos comandos de uso iguales y que no presenta problemas de instalación. Se trata de un lenguaje interpretado de alto nivel. Lo puedes descargar desde su página oficial completamente gratis. Aquí tienes el enlace de descarga.

Pero además, puedes utilizar una versión en línea desde tu móvil en el caso de que no tengas a mano tu ordenador. Esta versión la tienes aquí: Octave online.

Os paso el siguiente vídeo de Marcelo Pardo que describe, de forma sencilla, cómo instalar Octave más el plugin de symbolic, que es muy útil.

También os dejo un enlace a su página web donde describe Octave, deja vídeos tutoriales y explica alguna de las aplicaciones, especialmente en el ámbito del hormigón armado y el análisis matricial: https://marcelopardo.com/octave/

Además, la Universidad Politécnica de Madrid ha elaborado un curso gratuito MOOC sobre “Matlab y Octave para ingenieros y científicos” que os puede ser de muchísima utilidad: https://www.youtube.com/watch?v=VF97VH8QIAo&list=PL8bSwVy8_IcNTBBRzsKyE8PojViLIJ4RA

Os dejo a continuación la presentación del curso:

Instrucciones básicas de Matlab para tratamiento estadístico de datos

Dejo a continuación una serie de instrucciones básicas que podéis utilizar en Matlab para realizar cálculos estadísticos básicos. Este post está dedicado a mis estudiantes de Modelos Predictivos y de Optimización de Estructuras de Hormigón, pero puede ser de interés, por lo que lo dejo en abierto.

Importar datos de un fichero Excel

>> datos=xlsread(‘Ejercicio 4’)

Número de filas y columnas

>> size(datos)

Dimensión más grande de una matriz

>> length(datos)

Ordena los elementos de forma ascendente

>> sort(datos)

Ordena los elementos de forma descendente

>> sort(datos,’descend’)

Suma de los datos

>> sum(datos)

Producto de los datos

>> prod(datos)

Vector de sumas acumuladas

>> cumsum(datos)

Vector de productos acumulados

>> cumprod(datos)

Calcular la media aritmética

>> mean(datos)

Calcular la mediana

>> median(datos)

Calcular la moda de la muestra

>> mode(datos)

Calcular la media aritmética omitiendo el 5% de datos de cada lado

>> trimmean(datos,10)

Calcular la media geométrica de una muestra

>> geomean(datos)

Calcular la media armónica de una muestra

>> harmmean(datos)

Calcular el sesgo de la muestra

>> skewness(datos)

Calcular la curtosis de los datos

>> kurtosis(datos)

Varianza muestral

>> var(datos)

Desviación estándar muestral

>> std(datos)

 

Rango de los datos

>> range(datos)

El menor valor

>> min(datos)

El mayor valor

>> max(datos)

Desviación absoluta respecto a la media

>> mad(datos)

Momento central de orden 3 respecto a la media

>> moment(datos,3)

Rango intercuartílico

>> iqr(datos)

Primer cuartil (percentil 25)

>> prctile(datos, 25)

Percentil del 5%

>> prctile(datos,5)

Dibujar un diagrama de caja

>> boxplot(datos)

Dibujar el histograma de datos

>> hist(datos)

Dibujar la distribución de frecuencia acumulada

>> cdfplot(datos)

Visualización de funciones de probabilidad

>> disttool

Ajuste de modelos de distribución a conjunto de datos

>> dfittool

Matriz 3×3 de números aleatorios entre 0 y 1

>> rand(3)

Matriz 3×2 de números aleatorios entre 0 y 1

>> rand(3,2)

Matriz 3×3 de números aleatorios normales de media 0 y varianza 1

>> randn(3)

Matriz 3×2 de números aleatorios normales de media 0 y varianza 1

>> randn(3,2)

Secuencia de 5 valores aleatorios normales de desviación estándar de 2,5 y media 3

>> rand(1,5)*2.5+3

 

Programación lineal con Matlab

Los problemas de programación lineal consisten en optimizar una ecuación lineal que está sujeta a una serie de restricciones conformadas por desigualdades lineales. Para resolverlos el toolbox de Matlab posee la función linprog, la cual posee tres algoritmos para su solución, el método de larga escala, el método simplex y el de Active Set.

La sintaxis para llamar esta función es la siguiente:

x = linprog (f ,A, b, Aeq, beq, lb, ub, x0, options)

Donde:

f: es el vector de coeficientes de la función objetivo, organizado según las variables (Matlab intentará minimizar siempre, por tanto multiplicaremos por -1 si queremos maximizar)

A, b: corresponden a las restricciones de desigualdad, siendo el primero la matriz y el segundo el vector del lado derecho del sistema de inecuaciones Ax<=b.

Aeq, beq: tienen el mismo tratamiento que A y b, respectivamente, teniendo en cuenta que los nuevos corresponden a un sistema de ecuaciones, en tanto que los antiguos constituían uno de inecuaciones.

lb, ub: son, respectivamente, los límites inferior y superior de la región donde se espera que se encuentre el punto óptimo.

x0: es el punto inicial para la iteración. Según el algoritmo usado, es posible, o no, omitir este último.

Ejercicio 1:

Un taller confecciona cuatro productos: F, B, V y A para los que utiliza 2 horas, 3 horas y media, 4 horas y media y 5 horas de máquina y 1, 2, 1 y 10 horas de mano de operario para cada producto, respectivamente. Si se dispone de 3000 horas de máquina y 2000 horas de operario, y sabiendo que los beneficios obtenidos por unidad son de 6, 10, 13 y 30 u.m,  respectivamente, calcular el número de productos de cada tipo que deben producirse para obtener el máximo beneficio.

El planteamiento para el primer problema es:

Maximizar: 6×1 + 10×2 + 13×3 + 30×4
Sujeto a: 2×1 + 3,5×2 + 4,5×3 + 5×4 = 3000
x1 + 2×2 + x3 + 10×4 = 2000
x1, x2, x3, x4 ≥ 0

Para definir todas las variables del primer problema, en Matlab, se debe escribir:
>> f = [-6 -10 -13 -30];
>> A = -eye(4); % matriz identidad de tamaño 4×4
>> b = [0 0 0 0];
>> Aeq = [2 3.5 4.5 5 ; 1 2 1 10];
>> beq = [3000 2000];

Finalmente, se usa la sintaxis respectiva con las variables del primer problema, cargadas previamente, para obtener lo siguiente:

>> [x,fval] = linprog(f,A,b,Aeq,beq,lb,ub,x0)
Optimization Terminated.

x =
0.0000
0.0000
500.0000
150.0000
fval =
-1.1000e+004

Ejercicio 2:

Una empresa que se dedica a la producción de frascos de perfume, de agua de colonia y de champú utiliza tres factores productivos F1, F2 y F3 disponiendo de 240, 460 y 430 unidades, respectivamente. Las cantidades de dichos factores utilizados en la producción de un frasco por cada producto se detallan en la siguiente tabla:

Cuadro
La formulación el segundo problema es:Sabiendo que el precio unitario de venta del perfume es de 5 unidades monetarias, el del agua de colonia de 2 y el del champú de 3, y que se vende todo lo que se produce, calcular el beneficio máximo y el número de frascos de cada tipo que debe producir la empresa para obtenerlo.

Maximizar: 5×1 + 2×2 + 3×3
Sujeto a: F1 ≤ 240
F2 ≤ 460
F3 ≤ 430

La asignación de los valores de las variables, correspondientes al segundo problema, se realiza de la siguiente manera:

>> f = [-5 -2 -3];
>> A = [1 2 1 ; 2 0 3 ; 0 4 1];
>> b = [240 460 430];
>> x0 = [0 0 0];

>> [x,fval] = linprog(f,A,b,[],[],[0 0 0])
Optimization Terminated.
x =
230.0000
5.0000
0.0000
fval =
-1.1600e+003

Os dejo a continuación algunos problemas que, seguro, podréis abordar con Matlab:

Descargar (PDF, 164KB)

Referencia:

Cabezas, I.; Páez, J.D. (2010). Matlab. Toolbox de optimización. Aplicaciones en ciencias económicas. Unidad de Informática y Comunicaciones. Facultad de Ciencias Económicas. Universidad Nacional de Colombia, Bogotá D.C. (enlace).

Trucos para representar gráficas de superficie en MATLAB

Las gráficas de superficie resultan de interés, por ejemplo, para representar la Superficie de Respuesta en un Diseño de Experimentos, o bien cuando estamos representando la predicción de un fenómeno a través de unas redes neuronales. Sea cual sea el motivo, dejo a continuación algunas pautas para que esta tarea sea sencilla.

Sea, por ejemplo, la parametrización de un algoritmo de Simulated Annealing donde hemos realizado experimentos con distintas longitudes de cadenas de Markov (columnas) y distintos coeficientes de enfriamiento (filas). En la tabla se encuentran los resultados medios en coste encontrados tras realizar 9 ensayos en cada caso.

20000 30000 40000 50000
0,95 2652 2645 2637 2634
0,96 2650 2644 2637 2635
0,97 2648 2644 2637 2636
0,98 2647 2642 2637 2636
0,99 2647 2641 2637 2637

 

Para poder representar dichos puntos, necesitamos definir dos vectores fila: x será, por ejemplo, el vector fila de los coeficientes de enfriamiento, e y será el vector fila de las longitudes de cadena de Markov.

>> x=[0.95 0.96 0.97 0.98 0.99]

x =

0.9500 0.9600 0.9700 0.9800 0.9900

>> y=[20000 30000 40000 50000]

y =

20000 30000 40000 50000

>> z=[2652 2645 2637 2634

2650 2644 2637 2635
2648 2644 2637 2636
2647 2642 2637 2636
2647 2641 2637 2637]

z =

2652 2645 2637 2634
2650 2644 2637 2635
2648 2644 2637 2636
2647 2642 2637 2636
2647 2641 2637 2637

 Sin embargo, la matriz z tiene que trasponerse, de forma que en filas vengan los datos de y:

>> z=z’

z =

2652 2650 2648 2647 2647
2645 2644 2644 2642 2641
2637 2637 2637 2637 2637
2634 2635 2636 2636 2637

Ahora  ya podemos dibujar la superficie, con varias opciones:

>> mesh (x,y,z)

Superficie mesh

 >> surf(x,y,z)

 

Superficie surf

>> contour (x,y,z)

Superficie contour

 >> surfc (x,y,z)

Superficie surfc

 >> pcolor (x,y,z)

Superficie pcolor