GNU Octave es un lenguaje de programación científica 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 mayormente compatible con MATLAB . También puede utilizarse como lenguaje orientado a procesamiento por lotes . Como parte del Proyecto GNU , es software libre bajo los términos de la Licencia Pública General de GNU .
El proyecto se concibió alrededor de 1988. [6] En un principio, se pretendía que fuera un complemento a 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 publicó 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 , un ex profesor del autor principal. Levenspiel era conocido por su capacidad para realizar cálculos rápidos y aproximados . [8]
Además de utilizarse en computadoras de escritorio para computación científica personal, Octave se utiliza en el ámbito académico y en 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. [21]
La aceleración con OpenCL o CUDA también es posible mediante el uso de GPU. [22]
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 . [23] Sin embargo, no admite el paso de argumentos por referencia [24] aunque los argumentos de función se copian al escribir para evitar duplicaciones innecesarias.
Los programas Octave consisten en una lista de llamadas a funciones o un script . La sintaxis está basada en matrices y proporciona varias funciones para operaciones con matrices. Admite varias estructuras de datos y permite la programación orientada a objetos . [25]
Su sintaxis es muy similar a la de MATLAB, y una programación cuidadosa de un script permitirá que se ejecute tanto en Octave como en MATLAB. [26]
Dado que Octave está disponible bajo la Licencia Pública General de GNU , se puede modificar, copiar y utilizar libremente. [8] El programa se ejecuta en Microsoft Windows y la mayoría de los sistemas operativos Unix y similares a Unix , incluidos Linux , Android y macOS . [27] [28] [29]
Al escribir el carácter TAB en la línea de comandos, Octave intenta completar los nombres de variables, funciones y archivos (de forma similar a la función de tabulación de Bash ). Octave utiliza el texto que se encuentra antes del cursor como la parte inicial del nombre a completar. [30]
Cuando se ejecuta de forma interactiva, Octave guarda los comandos escritos en un búfer interno para que puedan recuperarse y editarse.
Octave incluye una cantidad limitada de compatibilidad para organizar datos en estructuras. En este ejemplo, vemos una estructura x con elementos a , b y c (un entero, una matriz y una cadena, respectivamente):
octava : 1 > x.a = 1 ; x.b = [ 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 = cadena octava : 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 de manera de cortocircuito (como los operadores correspondientes en el lenguaje C ), en contraste con los operadores elemento por elemento y .||
&
|
Octave incluye operadores de incremento y decremento similares a C ++
, --
tanto en su forma de prefijo como de sufijo. Octave también realiza asignaciones aumentadas , por ejemplo x += 5
:
Octave admite una forma limitada de manejo de excepciones que sigue el modelo de unwind_protect de Lisp . La forma general de un bloque unwind_protect es la siguiente:
desenrollar_proteger cuerpo desenrollar_proteger_limpiar limpieza fin_desenrollar_proteger
Como regla general, GNU Octave reconoce como terminación de un bloque block
la palabra clave end
(que es compatible con el lenguaje MATLAB) o una palabra clave más específica o, en algunos casos, . En consecuencia, un bloque puede terminarse con la palabra clave como en el ejemplo, o con la palabra clave más portable .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 de la excepción y terminar con el manejo de excepciones
Esta última forma se diferencia de un unwind_protect
bloque en dos aspectos. En primer lugar, exception_handling solo se ejecuta cuando se genera una excepción mediante body . En segundo lugar, después de la ejecución de exception_handling,rethrow( lasterror )
la excepción no se propaga fuera del bloque (a menos que se inserte una declaración explícitamente dentro del código de exception_handling ).
Octave tiene un mecanismo para manejar funciones que toman una cantidad no especificada de argumentos sin un límite superior explícito. Para especificar una lista de cero o más argumentos, use el argumento especial varargin
como el último (o único) argumento en 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 ; de lo contrario s = varargin { 1 } + plus ( varargin { 2 : nargin }); fin fin
Se puede configurar una función para que devuelva cualquier cantidad 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 de Octave directamente en un programa C++. Por ejemplo, aquí hay un fragmento de código para llamar a rand([10,1])
:
#include <octava/oct.h> ... ColumnVector NumRands ( 2 ); NumRands ( 0 ) = 10 ; NumRands ( 1 ) = 1 ; lista_valores_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 los archivos MEX compatibles con MATLAB .
Octave se ha creado teniendo en cuenta la compatibilidad con MATLAB y comparte muchas características con él:
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 compatible con Octave , las Condiciones de uso de FileExchange prohíben cualquier uso que no sea el MATLAB propietario de MathWorks . [31] [32] [33]
Hay algunas adiciones de sintaxis menores, aunque intencionadas Archivado el 26 de abril de 2012 en Wayback Machine :
Muchas de las numerosas funciones de MATLAB, pero no todas, están disponibles en GNU Octave, y algunas de ellas son 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. Archivado el 14 de marzo de 2024 en Wayback Machine .
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:
octave : 1 > guía advertencia : la función 'guía' aún no está implementada en Octave Lea < http://www.octave.org/missing.html > para saber cómo puede contribuir con la funcionalidad faltante . error : ' guide ' undefined 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 . Está disponible desde Octave 3.8, [34] y se ha convertido en la interfaz predeterminada (sobre la interfaz de línea de comandos ) con el lanzamiento de Octave 4.0. [12] Fue bien recibida por un colaborador de EDN, quien escribió "[Octave] ahora tiene una GUI muy funcional" al revisar la entonces nueva GUI en 2014. [35]
También se han desarrollado varias interfaces gráficas de terceros, como ToolboX para la enseñanza de codificación.
Con el código de 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
# crea una figura y un panel sobre ella f = figure ; # crea un botón (estilo predeterminado) b1 = uicontrol ( f , "string" , "A Button" , "position" ,[ 10 10 150 40 ]); # crea un control de edición e1 = uicontrol ( f , "style" , "edit" , "string" , "editable text" , "position" ,[ 10 60 300 40 ]); # crea una casilla de verificación c1 = uicontrol ( f , "style" , "checkbox" , "string" , "a checkbox" , "position" ,[ 10 120 150 40 ]);
Cuadro de texto
prompt = { "Ancho" , "Alto" , "Profundidad" }; valores predeterminados = { "1,10" , "2,20" , "3,30" }; rowscols = [ 1 , 10 ; 2 , 20 ; 3 , 30 ]; dims = inputdlg ( prompt , "Ingrese las dimensiones del cuadro" , rowscols , valores predeterminados );
Cuadro de lista con cuadros de mensajes.
mis_opciones = { "Un elemento" , "otro" , "otro más" }; [ sel , ok ] = listdlg ( "ListString" , mis_opciones , "SelectionMode" , "Múltiple" ); if ( ok == 1 ) msgbox ( "Seleccionaste:" ); for i = 1 : numel ( sel ) msgbox ( sprintf ( "\t%s" , mis_opciones { sel ( i )})); endfor else msgbox ( "Canceló." ); endif
Botones de radio
# crea una figura y un panel sobre ella f = figure ; # crea un grupo de botones gp = uibuttongroup ( f , "Posición" , [ 0 0.5 1 1 ]) # crea botones en el grupo b1 = uicontrol ( gp , "estilo" , "botón de opción" , "cadena" , "Opción 1" , "Posición" , [ 10 150 100 50 ]); b2 = uicontrol ( gp , "estilo" , "botón de opción" , "cadena" , "Opción 2" , "Posición" , [ 10 50 100 30 ]); # crea un botón que no está en el grupo b3 = uicontrol ( f , "style" , "radiobutton" , "string" , "No está 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 Github Octave Packages. Cualquiera también puede crear y mantener paquetes.
Las alternativas a GNU Octave bajo una licencia de código abierto , aparte del mencionado MATLAB, incluyen Scilab y FreeMat . [36] [37] [38] [39] Octave es más compatible con MATLAB que Scilab, [36] [40] [41] y FreeMat no se ha actualizado desde junio de 2013. [42]
Además, el lenguaje de programación Julia y sus capacidades de representación gráfica tienen similitudes con GNU Octave.