Octave

Octave è un linguaggio di alto livello, principalmente ideato per il calcolo numerico, liberamente distribuibile e modificabile secondo i termini della GNU General Public License.
Come ambiente di calcolo, è quello che risulta dichiaratamente più simile al noto programma commerciale Matlab, anche se la sintassi non è proprio la stessa.
Octave presenta vari tools per risolvere problemi numerici di algebra lineare, trovando le radici di equazioni non lineari, integrando funzioni ordinarie, manipolando polinomi e integrando equazioni ordinarie differenziali e algebrico differenziali. È semplicemente estendibile e caratterizzabile con funzioni definite dall'utente stesso, scritte nel linguaggio di Octave o usando moduli scritti in C++, C, Fortran o altri linguaggi.
Questo è parte di quanto si può leggere direttamente dal sito, da cui è possibile scaricarlo e reperire un'esauriente documentazione.

...Ma vediamolo più da vicino.

Apriamo una shell e digitiamo da riga di comando

octave

in modo da ottenere il prompt di Octave stesso.
La sintassi

help COMANDO

permette di richiamare un aiuto su qualunque comando.

NOME_VARIABILE=VALORE

permette di assegnare un valore ad una variabile, sia esso reale o complesso.
Octave è un programma matematico di matrici numeriche, quindi è importante saper operare con le matrici. Vediamo dei semplici esempi:

A=[1 2; 3 4]

permette di ottenere l'output

A =
    1  2
    3  4
A'

fa la trasposta della matrice appena inserita, ottenendo quindi

ans =
      1  3
      2  4
A(1,2)

visualizza il numero situato alle coordinate (riga 1, colonna 2):

ans =
      2
A(1,:)

mostra la prima riga, cioè

ans =
      1  2
A(:,2)

produce

ans =
      2
      4

Se si hanno due matrici, A e B, è possibile fare il prodotto tra le due con la scrittura

A*B

o fare il prodotto elemento per elemento con

A.*B

e così via.

Sostanzialmente la sintassi è la medesima utilizzata da Matlab, tranne, per esempio, per la trasposta di una matrice, per cui non esiste la possibilità di utilizzare

transpose(A)

In effetti, le differenze tra Octave e Matlab vengono classificate in tre categorie:

  • irrilevanti;
  • differenze conosciute, ma trattabili;
  • differenze sconosciute;

quindi approcciarsi all'uno o all'altro non comporta grandi complicazioni.

Per definire le funzioni, Octave utilizza la dichiarazione:

function [VARIABILI DI OUTPUT] = NOME_FUNZIONE(VARIABILI DI INPUT)
         SEQUENZA DI COMANDI

che differisce, per esempio, da Matlab, per la presenza delle parentesi quadre, non richieste da quest'ultimo. Tuttavia, se anche vengono omesse, Octave funziona ugualmente.
Le funzioni devono essere salvate in un file NOME_FUNZIONE.m in una directory accessibile da Octave e devono essere richiamate tramite

[VARIABILI DI OUTPUT]=NOME_FUNZIONE(VARIABILI DI INPUT)

Gli script, invece, sono delle funzioni che non ritornano niente, che vengono definite dalla sintassi

function NOME_SCRIPT
         SEQUENZA DI COMANDI

memorizzate nel file NOME_SCRIPT.m e richiamate con

NOME_SCRIPT

Questo concetto di script, tuttavia, differisce da quello espresso dalla guida di Matlab, per il quale gli script sono semplicemente dei file con estensione .m che non presentano argomenti di input né di output. Quelli che in Octave esistono, ma non hanno un nome specifico.

La directory accessibile dal programma è quella in cui si sta lavorando oppure quella specificata tramite la definizione di un percorso a cui il programma farà riferimento per attingere funzioni e script. La sintassi

LOADPATH=[:"PERCORSO"];

può essere impostata direttamente nel file del programma che si sta eseguendo oppure può essere memorizzata nel file /usr/share/octave/site/m/startup/octaverc, in modo da specificare una directory di default.
Nel caso in cui si stia lavorando con file provenienti da Matlab, si può lasciare la sintassi usata da quest'ultimo, ovvero

path(path,'PERCORSO);

il che risulterà di sicuro molto comodo.

Octave permette di attingere i dati da un file creato apposta o di stampare i risultati, anziché a video, in un file di testo.
Per aprire un file in modalità scrittura o lettura si usa il comando

fopen("NOME_FILE","MODO","ARCH")

Se la differenza con Matlab in relazione alle virgolette è irrilevante (" o ' sono utilizzabili, in molti casi, indifferentemente senza produrre errori in Octave, al contrario di Matlab che usa la seconda scrittura), in Octave è necessario affiancare al "MODO", una

"t"

per aprire il file in modalità testuale o da una

"b"

per aprirlo in modalità binaria (che è, tra l'altro, impostata di default). Quindi avremo, ad esempio:

"wt"

per la scrittura in modalità testuale,

"rb"

per la lettura in modalità binaria.
Se si vuole richiedere il nome del file da cui prelevare i dati da tastiera, è necessario farsi dare il nome attribuendolo ad una variabile stringa e, tramite il comando

eval(VARIABILE)

farla eseguire come se fosse un programma:

VARIABILE=input('Nome file dati (senza estensione)=','s');
eval(VARIABILE);

Come Matlab, anche Octave permette di realizzare dei grafici, tuttavia non ha librerie grafiche. Esso si appoggia, infatti, su GNUplot, un programma per la realizzazione di grafici 2D e 3D, e presenta la possibilità di importare anche le librerie di Matlab.

plot(X,Y,FMT...)

è il comando più completo per tracciare un grafico: un solo argomento è obbligatorio e servirà per definire i valori corrispondenti all'asse y, mentre gli indici di tali valori verranno assunti come coordinate dell'asse x.
X e Y possono essere sia singoli valori, sia vettori che matrici. FMT rappresenta lo stile e il colore della linea del grafico, che può essere settato a proprio piacimento. Dall'help in linea si possono ottenere spiegazioni più specifiche, anche per le altre opzioni possibili.
Vediamo, ora, alcuni semplici esempi.
Andiamo a definire l'intervallo t per cui si vuole tracciare la funzione coseno: possiamo specificare sia X sia Y

t=0:0.1:6.3;
plot(t,cos(t));

oppure lasciare che la Y venga presa in automatico

t=0:0.1:6.3;
plot(cos(t));

Possiampo definire due vettori e impostare che i dati vengano tracciati con una linea blu a cerchietti:

x=[1 2 3 4]
y=[1 2 3 4]
plot(x,y,"4")

oppure dire che vengano tracciate due funzioni differenti e specificare i nomi con cui verrà compilata la legenda:

t=0:0.1:6.3;
plot(t,cos(t),"-;cos(t);",t,sin(t),"+3;sin(t);");

La sintassi

";TITOLO;"

permette, cioè, di caratterizzare la didascalia della legenda che, altrimenti, verrà costruita con i titoli di default, essendo essa sempre visualizzata, salvo differenti indicazioni.
La sintassi

";TITOLO;"

può essere anche contenuta in una variabile di tipo stringa: questo può rendersi necessario, quando, per esempio, su un grafico sono presenti una serie di curve e i loro nomi sono stati memorizzati in una matrice per comodità.
Se, per esempio, ho un certo numero di andamenti che corrispondono a parametri differenti, potrei voler una didascalia che, per ogni curva, riporti la scrittura

NOME_PARAMETRO=TOT

dove TOT è il valore del parametro corrispondente all'andamento della linea del grafico. Se esso risulta memorizzato, per esempio, in un vettore PARAMETRO, mi basterà creare la variabile DIDASCALIA che verrà richiamata dal comando

plot(X,Y,DIDASCALIA)

Per creare DIDASCALIA potrei utilizzare un ciclo del tipo

for k=1:size(PARAMETRO,2)
    DIDASCALIA(k,:)=sprintf('NOME_PARAMETRO =%1.2f ',PARAMETRO(k));
end

ma questo andrebbe bene solo con Matlab, perché sarebbe stato sufficiente il comando

legend(DIDASCALIA)

per fare in modo che la legenda prendesse le etichette NOME_PARAMETRO=TOT_1, NOME_PARAMETRO=TOT_2 ecc per ciascuna curva del grafico. Tuttavia per Octave ho bisogno di

";TITOLO;"

quindi il ciclo diventa

for k=1:size(PARAMETRO,2)
    DIDASCALIA(k,:)=sprintf(';NOME_PARAMETRO =%1.2f ;',PARAMETRO(k));
end

in modo tale che la sintassi sia quella corretta (grazie al fatto che " e ' sono equivalenti).

In sostanza, la legenda costituisce una notevole differenza tra Octave e Matlab, seppur nella sua semplicità.
Essa viene mostrata di default in Octave, ma si può comunque rendere evidente la sua introduzione con il comando

gset key

mentre è possibile toglierla con

gset nokey

In Matlab, invece, è il contrario: il comando

legend(ARGOMENTI)

la inserisce, mentre se non lo si specifica essa non compare nel grafico. Tra gli argomenti di questo comando, è possibile anche specificare la didascalia che si vuole utilizzare, cosa che in Octave spetta, come prima visto, al comando plot.

L'utilizzo di

gset

genererà, tuttavia, un warning come questo:


warning: in gset near line 15, column 1:
warning: gset is decodecated and will be removed from a future
warning: version of Octave.
warning: You should use the higher-level plot functions
warning: ("plot", "mesh", "semilogx", etc.) instead
warning: of the low-level plotting commands.
warning: If you absolutely must use this function, use the
warning: internal version __gnuplot_set__ instead

ll comando

__gnuplot_set__ AZIONE

permette, infatti, di eseguire le stesse operazioni di

gset

e, quindi, si può scrivere

__gnuplot_set__ key

e

__gnuplot_set__ nokey

per ovviare al warning.

Oltre alla legenda si può caratterizzare il grafico utilizzando, ad esempio, il comando

grid

che permette di inserire una griglia nel grafico; il comando

title("TITOLO")

che definisce un titolo al grafico; il comando

xlabel("NOME ASSE X")

che permette di specificare un nome per l'asse delle x; il comando

ylabel("NOME ASSE Y")

che permette di specificare un nome per l'asse delle y; il comando

zlabel("NOME ASSE Z")

che permette di specificare un nome per l'asse delle z (in caso di grafici 3D).

Questi e molti altri comandi si possono travare sia nella documentazione di Octave, sia di GNUplot. Tuttavia, essendo il secondo un programma specifico per produrre grafici 2D/3D, esso dispone di una propria sintassi, differente da quella utilizzata in Octave per richiamare le sue funzioni.
Infatti tutti i comandi di GNUplot sono caratterizzati dalla keyword

set

che precede i comandi veri e propri (se così li vogliamo chiamare) e che in Octave deve essere tolto.

In alternativa a

plot

è possibile utilizzare

gplot

che è un comando di basso livello. In effetti non permette l'utilizzo di coppie di vettori o coppie vettore-matrice, quindi, se si volesse utilizzare questo comando in questi casi, bisognerebbe riformulare il problema (memorizzando, per esempio, i dati in un'unica matrice per cui specificare, di volta in volta, la colonna delle coordinate x e quella per le y tramite l'opzione

using

oppure

u

in forma abbreviata:

x=[1 2 3 4];
y=[ 2 4 6 8; 4 8 12 16; 6 10 14 18];
plot(x,y)
a=[x'  (y (1,:))' (y (2,:))' (y (3,:))'];
gplot a using 1:2 title "uno", a u 1:3 t "due", a 1:4 t "tre"

).

In conclusione, Octave è una valida alternativa a Matlab: versatile, facile da usare, con un'ampia documentazione semplice da reperire e soprattutto Open Source. Al contrario Matlab deve essere acquistato e non tutti se lo possono permettere. Esiste una versione per studenti, restrittiva, ma più economica. Ciononostante la pirateria di questi software è all'ordine del giorno, soprattutto perché cho lo utilizza, magari, lo fa per poche volte.
Octave è una soluzione a questo problema, perché, senza spese, ci si trova di fronte ad un programma del tutto comparabile con Matlab.
Non conoscendo così approfonditamente né l'uno né l'altro, forse, chi è abituato a lavorare con Matlab potrebbe affermare che Octave non può ancora essere il suo degno sostituto (perché, per esempio, mancano molte funzioni...). Tuttavia, credo che per molte delle applicazioni per cui si fa riferimento a Matlab, usare Octave garantirebbe gli stessi risultati.
Per esempio, Octave permetterebbe un grosso risparmio alle scuole che lo utilizzerebbero come software didattico. Inoltre gli studenti potrebbero averlo senza alcun problema anche a casa.
Insomma, si ritorna sempre alla solita questione ovvero che la mancanza d'informazione, della conoscenza senza pregiudizi sull'esistenza di sistemi Open Source, validi quanto quelli a pagamento (se non di più, a volte).
Per fortuna, la grande semplicità con cui è possibile utilizzare programmi scritti nel linguaggio di Matlab anche con Octave, è un grosso vantaggio per chi volesse installare il secondo sul proprio pc di casa, ma avesse comunque l'esigenza di presentare lavori in Matlab. Oltretutto Octave è più leggero e occupa meno spazio.

Octave è disponibile per sistemi GNU/Linux, Mac OS X, Windows e OS/2 o eComStation, con tre versioni: una stabile (stable), sicura ma vecchiotta; una test (testing), con pacchetti più nuovi e ragionevolmente stabili; una in sviluppo (development), sempre con gli ultimi aggiornamenti e per questo non priva di rischi.
Io ho adottato la versione test e non mi ha dato nessun problema fin'ora.
Esiste anche un front-end grafico per Octave (KOctave), ma, sinceramente, non mi sono trovata molto bene (ogni tanto bisogna riavviarlo, altrimenti ricorda i comandi prima eseguiti, per esempio, e continua a dare errori), quindi suggerisco la più comoda shell, associata ad un editor di testo.

Devo dire di aver trovato un'unica pecca, se così vogliamo chiamarla, ovvero il fatto che in Octave non viene utilizzata la stessa sintassi di GNUplot, giustificato dal fatto che si sta cercando di conciliarlo il più possibile a Matlab.
GNUplot, essendo un programma a sé stante, andrebbe usato separatamente da Octave. Risulta conveniente, per esempio, in taluni casi, salvare i risultati di un programma scritto con Octave in un file di testo ed elabolarli in un secondo tempo tramite GNUplot. In effetti GNUplot permette, preso da solo, una migliore flessibilità nel costruire grafici e quindi risulta uno strumento completo nel suo ambito. Tuttavia, qui bisognerebbe aprire un capitolo a proposito di GNUplot, che, per ora, non faccio.

N.B. Questo articolo vuole essere semplicemente una panoramica su alcune cose che si possono fare con Octave e che io mi sono ritrovata a fare inizialmente con Matlab (perché questo è, "purtroppo" il software installato nella facoltà che frequento). Quindi mi scuso se, leggendo, qualcuno troverà degli errori in quanto da me scritto: non sono né un'esperta di Matlab né di Octave.

Per fortuna che è una breve introduzione. Comunque ottimo lavoro :-)

Proponi l'articolo per la Wikipedia...

Effettivamente c'è solo un breve articolo su GNUplot... è un peccato, cmq non è che Matlab se la passi meglio... :P

Anch'io mi sto avvicinando ad octave, ma è possibile creare delle dll per poi lanciarle da un altro ambiente di sviluppo?

Dovresti guardare qui: http://sourceforge.net/projects/octave/files/ per scaricare Octave compilato per win32, avrà sicuramente le proprie librerie che tu potrai richiamare dalla tua applicazione. Puoi anche cercare informazioni a riguardo dalla documentazione di Octave. Nel wiki forse c'è qualcosa di utile: http://wiki.octave.org/wiki.pl?CategoryExternal

Grazie all'autore di questo articolo! Ottimo lavoro!

:) dany

Grazie a te. :)

Si può integrare con Java?

Cercando su google ho trovato questo: http://jopas.sourceforge.net.

Buongiorno,
potreste aiutarmi con la funzione "quadc" del pacchetto integration?
Definisco una qualsivoglia funzione, tipo:
function y=y(x)
y=x.^2.-log(x)
endfunction

Poi voglio calcolare l'integrale tra due generici estremi d'integrazione. Seguo la sintassi suggeritami dall'help in linea e scrivo:

int=quadc('y',3,5)

Non appena do invia mi da il seguente msg:

error: product: nonconformant arguments (op1 is 0x0, op2 is 0x1)
error: evaluating argument list element number 1
error: evaluating argument list element number 1
error: called from:
error: /home/fabio/octave/integration-1.0.7/quadc.m at line 75, column 3

Sapreste indicarmi dov'è che sbaglio?
Grazie per l'aiuto.

Sembrerebbe un errore nella funzione quadc. Nel pacchetto ci sono dei test e quando viene chiamata la funzione quadc danno lo stesso errore.

La funzione quad non va bene per calcolare l'integrale? È quella fornita da octave e funziona correttamente.