GNU Octave es un lenguaje de programación científico para computación científica y computación numérica . Octave ayuda a resolver numéricamente problemas lineales y no lineales, y a realizar otros experimentos numéricos utilizando un lenguaje que es mayoritariamente compatible con MATLAB . También se puede utilizar como lenguaje orientado a lotes . Como parte del Proyecto GNU , es software libre bajo los términos de la Licencia Pública General GNU .
El proyecto se concibió alrededor de 1988. [6] Al principio se pretendía que fuera un complemento de un curso de diseño de reactores químicos. John W. Eaton inició el desarrollo completo en 1992. La primera versión alfa se remonta al 4 de enero de 1993 y el 17 de febrero de 1994 se lanzó la versión 1.0. La versión 8.4.0 se publicó el 5 de noviembre de 2023. [7]
El programa lleva el nombre de Octave Levenspiel , ex profesor del autor principal. Levenspiel era conocido por su capacidad para realizar cálculos rápidos y sencillos . [8]
Además de su uso en computadoras de escritorio para computación científica personal, Octave se usa en el mundo académico y la industria. Por ejemplo, Octave se utilizó en una enorme computadora paralela en el Centro de Supercomputación de Pittsburgh para encontrar vulnerabilidades relacionadas con la adivinación de números de seguridad social. [41]
La aceleración con OpenCL o CUDA también es posible mediante el uso de GPU. [42]
El lenguaje Octave es un lenguaje de programación interpretado. Es un lenguaje de programación estructurado (similar a C ) y admite muchas funciones comunes de la biblioteca estándar de C , y también ciertas llamadas y funciones del sistema UNIX . [43] Sin embargo, no admite el paso de argumentos por referencia [44] aunque los argumentos de la función se copian en escritura para evitar duplicaciones innecesarias.
Los programas de octava constan de una lista de llamadas a funciones o un script . La sintaxis está basada en matrices y proporciona varias funciones para operaciones matriciales. Soporta diversas estructuras de datos y permite la programación orientada a objetos . [45]
Su sintaxis es muy similar a MATLAB y una programación cuidadosa de un script le permitirá ejecutarse tanto en Octave como en MATLAB. [46]
Debido a que Octave está disponible bajo la Licencia Pública General GNU , se puede cambiar, copiar y utilizar libremente. [8] El programa se ejecuta en Microsoft Windows y en la mayoría de los sistemas operativos Unix y similares , incluidos Linux , Android y macOS . [47] [48] [49]
Escribir un carácter TAB en la línea de comando hace que Octave intente completar nombres de variables, funciones y archivos (similar a la finalización de tabulación de Bash ). Octave usa el texto antes del cursor como la parte inicial del nombre para completar. [50]
Cuando se ejecuta de forma interactiva, Octave guarda los comandos escritos en un búfer interno para poder recuperarlos y editarlos.
Octave incluye una cantidad limitada de soporte para organizar datos en estructuras. En este ejemplo, vemos una estructura x con elementos a , b y c (un número entero, una matriz y una cadena, respectivamente):
octava : 1 > x . un = 1 ; X . segundo = [ 1 , 2 ; 3 , 4 ]; X . c = "cadena" ; octava : 2 > x . a ans = 1 octava : 3 > x . b ans = 1 2 3 4octava : 4 > x . c ans = octava de cuerda : 5 > x x = estructura escalar que contiene los campos : a = 1 b = 1 2 3 4 c = cadena
Los operadores lógicos &&
y de octava se evalúan en forma de cortocircuito (como los operadores correspondientes en el lenguaje C ), a diferencia de los operadores elemento por elemento y .||
&
|
Octave incluye operadores de incremento y decremento tipo C ++
y --
en sus formas de prefijo y postfijo. Octave también realiza asignaciones aumentadas , por ejemplo x += 5
.
Octave admite una forma limitada de manejo de excepciones modelada a partir de unwind_protect de Lisp . La forma general de un bloque unwind_protect se ve así:
unwind_protect cuerpo unwind_protect_cleanup limpieza end_unwind_protect
Como regla general, GNU Octave reconoce como terminación de una determinada block
palabra clave end
(que es compatible con el lenguaje MATLAB) o una palabra clave más específica o, en algunos casos, . Como consecuencia, un bloque se puede terminar con la palabra clave como en el ejemplo o con la palabra clave más portátil .endblock
end_block
unwind_protect
end_unwind_protect
end
La parte de limpieza del bloque siempre se ejecuta. En caso de que la parte del cuerpo genere una excepción , la limpieza se ejecuta inmediatamente antes de propagar la excepción fuera del bloque unwind_protect
.
GNU Octave también admite otra forma de manejo de excepciones (compatible con el lenguaje MATLAB):
intente capturar el cuerpo excepción_manejo final
Esta última forma se diferencia de un unwind_protect
bloque en dos aspectos. En primer lugar, el manejo de excepciones solo se ejecuta cuando body genera una excepción . En segundo lugar, después de la ejecución deException_handling , la excepción no se propaga fuera del bloque (a menos que rethrow( lasterror )
se inserte explícitamente una declaración dentro del código deException_handling ).
Octave tiene un mecanismo para manejar funciones que toman un número no especificado de argumentos sin un límite superior explícito. Para especificar una lista de cero o más argumentos, utilice el argumento especial varargin
como último (o único) argumento de la lista. varargin
es una matriz de celdas que contiene todos los argumentos de entrada.
función s = plus ( varargin ) si ( nargin == 0 ) s = 0 ; else s = varargin { 1 } + más ( varargin { 2 : nargin }); fin fin
Se puede configurar una función para devolver cualquier número de valores utilizando el valor de retorno especial varargout
. Por ejemplo:
función varargout = multiassign ( datos ) para k = 1 : nargout varargout { k } = datos (:, k ); fin fin
También es posible ejecutar código Octave directamente en un programa C++. Por ejemplo, aquí hay un fragmento de código para llamar rand([10,1])
:
#include <octava/oct.h> ... NumRands de Vector de columna ( 2 ); NumRands ( 0 ) = 10 ; NúmRands ( 1 ) = 1 ; lista_valor_octava f_arg , f_ret ; f_arg ( 0 ) = valor_octava ( NumRands ); f_ret = feval ( "rand" , f_arg , 1 ); Matriz unis ( f_ret ( 0 ). valor_matriz ());
El código C y C++ se puede integrar en GNU Octave creando archivos oct o utilizando archivos MEX compatibles con MATLAB .
Octave se creó teniendo en cuenta la compatibilidad con MATLAB y comparte muchas características con MATLAB:
Octave trata la incompatibilidad con MATLAB como un error ; por lo tanto, podría considerarse un clon de software , que no infringe los derechos de autor del software según el caso judicial Lotus v. Borland .
Los scripts de MATLAB del repositorio FileExchange de MathWorks son, en principio, compatibles con Octave. Sin embargo, si bien los usuarios suelen proporcionarlos y cargarlos bajo una licencia BSD de código abierto adecuada y compatible con Octave , los Términos de uso de FileExchange prohíben cualquier uso además de MATLAB, propiedad de MathWorks. [51] [52] [53]
Hay algunas adiciones de sintaxis útiles, aunque menores:
Muchas, pero no todas, las numerosas funciones de MATLAB están disponibles en GNU Octave, algunas de ellas accesibles a través de paquetes en Octave Forge. Las funciones disponibles como parte de los paquetes principales de Octave o Forge se enumeran en línea.
Se incluye una lista de funciones no disponibles en la función Octave __unimplemented.m__. Las funciones no implementadas también se enumeran en muchos paquetes de Octave Forge en Octave Wiki.
Cuando se llama a una función no implementada, se muestra el siguiente mensaje de error:
octava : 1 > advertencia de guía : la función 'guía' aún no está implementada en Octave Por favor lea < http : // www . octava . org / falta . html > para aprender cómo puedes contribuir con la funcionalidad que falta . error : 'guía' indefinida cerca de la línea 1 columna 1
Octave viene con una interfaz gráfica de usuario (GUI) oficial y un entorno de desarrollo integrado (IDE) basado en Qt . Ha estado disponible desde Octave 3.8, [17] y se ha convertido en la interfaz predeterminada (a través de la interfaz de línea de comandos ) con el lanzamiento de Octave 4.0. [20] Fue bien recibido por un colaborador de EDN, quien escribió "[Octave] ahora tiene una GUI muy funcional" al revisar la entonces nueva GUI en 2014. [54]
También se han desarrollado varias interfaces gráficas de terceros, como ToolboX para la educación en codificación.
Con el código Octave, el usuario puede crear aplicaciones GUI. Consulte Desarrollo de GUI (GNU Octave (versión 7.1.0)). A continuación se muestran algunos ejemplos:
Botón, control de edición, casilla de verificación
# crear figura y panel en ella f = figura ; # crear un botón (estilo predeterminado) b1 = uicontrol ( f , "string" , "A Button" , "position" ,[ 10 10 150 40 ]); # crear un control de edición e1 = uicontrol ( f , "estilo" , "editar" , "cadena" , "texto editable" , "posición" , [ 10 60 300 40 ]); # crear una casilla de verificación c1 = uicontrol ( f , "estilo" , "casilla de verificación" , "cadena" , "una casilla de verificación" , "posición" , [ 10 120 150 40 ]);
Caja de texto
indicador = { "Ancho" , "Alto" , "Profundidad" }; valores predeterminados = { "1.10" , "2.20" , "3.30" }; filascols = [ 1 , 10 ; 2 , 20 ; 3 , 30 ]; dims = inputdlg ( mensaje , "Ingresar dimensiones del cuadro" , filas , valores predeterminados );
Cuadro de lista con cuadros de mensajes.
my_options = { "Un elemento" , "otro" , "otro más" }; [ sel , ok ] = listdlg ( "ListString" , mis_opciones , "SelectionMode" , "Múltiple" ); if ( ok == 1 ) msgbox ( "Seleccionaste:" ); para i = 1 : numel ( sel ) msgbox ( sprintf ( "\t%s" , mis_opciones { sel ( i )})); endfor else msgbox ( "Usted canceló." ); terminara si
Botones de radio
# crear figura y panel en ella f = figura ; # crear un grupo de botones gp = uibuttongroup ( f , "Position" , [ 0 0.5 1 1 ]) # crear un botón en el grupo b1 = uicontrol ( gp , "style" , "radiobutton" , "string" , "Choice 1 " , "Posición" , [ 10 150 100 50 ]); b2 = uicontrol ( gp , "estilo" , "botón de radio" , "cadena" , "Elección 2" , "Posición" , [ 10 50 100 30 ]); # crear un botón que no esté en el grupo b3 = uicontrol ( f , "estilo" , "botón de radio" , "cadena" , "No en el grupo" , "Posición" , [ 10 50 100 50 ]);
Octave también tiene muchos paquetes disponibles. Esos paquetes se encuentran en Octave-Forge Octave Forge - Paquetes o Paquetes Github Octave. También es posible que cualquiera cree y mantenga paquetes.
Otras alternativas gratuitas a MATLAB incluyen Scilab y FreeMat . [55] [56] [57] [58] Octave es más compatible con MATLAB que Scilab, [55] [59] [60] y FreeMat no se ha actualizado desde junio de 2013. [61]