[inizio] [indice generale] [precedente] [successivo] [indice analitico] [contributi]


245. Applicativi utili nella didattica

Qualunque cosa che può essere insegnata è «didattica» e in questo senso lo è tutto il contenuto di questa opera. In questo capitolo vengono descritti brevemente alcuni programmi applicativi che non hanno trovato posto altrove e che potrebbero essere utilizzati nella scuola.

245.1 Geg -- GTK+ Equation Grapher

Geg è un programma applicativo per il disegno di funzioni matematiche a due dimensioni, del tipo f(x)=y, che utilizza per questo l'interfaccia grafica X. È molto semplice e non offre sostegni particolari dal punto di vista matematico, ma è facile e intuitivo da usare. La figura 245.1 mostra come si presenta la finestra di Geg, e in particolare appare la visualizzazione delle funzioni sin(x), sin(2x) e sin(2x)+sin(x).

207.jpg

Figura 245.1: Geg.

Nella parte superiore della finestra di Geg è disponibile il menu a tendina, assieme ad alcuni pulsanti grafici per la selezione rapida delle funzionalità di uso comune. Sotto, nella parte destra, appare il riquadro `f(x)', ovvero il piano cartesiano su cui vengono disegnate le funzioni. Alla sinistra appare il riquadro `Range', dove possono essere indicati in modo preciso i valori degli intervalli di visualizzazione dell'asse X e dell'asse Y; in pratica, basta modificare questi valori e premere [Invio] per modificare la scala e la zona visualizzata a destra. A sinistra in basso appare il riquadro `Log' che elenca le operazioni compiute: nella parte superiore appare l'ultimo comando eseguito e in quella inferiore il comando più vecchio. Più in basso, sempre a sinistra, appare il riquadro `Status' che mostra le coordinate cartesiane in cui si trova il puntatore del mouse, ammesso che questo sia posizionato sull'area del grafico. Infine, nella parte bassa della finestra appare la riga di comando all'interno della quale si possono inserire le funzioni da visualizzare.

245.1.1 Avvio e interazione normale

Geg viene avviato attraverso l'eseguibile `geg' per il quale non sono previste opzioni speciali, a parte quelle comuni per l'uso di programmi nel sistema grafico X (`-geometry', `-display', ecc.).

geg [<opzioni>]

Per disegnare una funzione occorre selezionare il riquadro inferiore, con un clic del mouse, in modo da fare apparire il cursore per la scrittura; quindi si scrive la funzione (utilizzando solo la variabile x) e la si disegna premendo [Invio] oppure selezionando il pulsante grafico >GO!<.

Le operazioni necessarie a ottenere il risultato mostrato nella figura 245.1 sono in pratica quelle seguenti:

f(x) = sin(x)[Invio]

f(x) = sin(2x)[Invio]

f(x) = sin(2x)+sin(x)[Invio]

ottenendo nel riquadro del riepilogo dei comandi impartiti la sequenza seguente:

sin(2x)+sin(x)
sin(2x)
sin(x)

Per modificare la scala e la zona di grafico visualizzata si può intervenire con i pulsanti >In< e >Out<; oppure attraverso il mouse, utilizzando il primo tasto per delimitare (trascinando) la zona di grafico su cui si vuole porre l'attenzione; oppure in modo ancora più preciso attraverso il riquadro `Range'. Nella figura 245.2 viene mostrato l'esempio già visto con la scala dell'asse Y espansa.

208.jpg

Figura 245.2: Modifica della scala di visualizzazione.

In particolare, i valori sull'asse X possono essere mostrati anche in radianti, ovvero in unità P-greco. Per questo basta selezionare il pulsante grafico >Radian<, mentre per tornare alla scala decimale basta selezionare il pulsante >Decimal<.

Con il terzo tasto del mouse (quello destro) è possibile indicare una zona del grafico all'interno della quale si vuole conoscere l'intersezione della curva con uno degli assi. Per esempio, indicando una zona vicina al punto -2 nell'asse X, si ottiene il risultato seguente nel riquadro del riepilogo che mostra due intersezioni riferite ad altrettante funzioni:

Axis Intercepts:-
 sin(2x)+sin(x), X=-2,0944
 sin(2x), X=-1,5708

Con il secondo tasto del mouse (quello centrale) è possibile indicare una zona del grafico all'interno della quale si vuole conoscere l'intersezione tra le curve. Per esempio, indicando una zona vicina al punto +1 nell'asse X e prima del punto +2 nell'asse Y, si ottiene il risultato seguente nel riquadro del riepilogo, che mostra due intersezioni distinte:

Function Intercepts:-
 sin(x) and sin(2x)+sin(x) at:
 X=1,5708, Y=1,0000
 sin(x) and sin(2x) at:
 X=1,0472, Y=0,8660

In pratica, le funzioni sin(x) e sin(2x)+sin(x) si incontrano nel punto X=1,5708, Y=1,0000, inoltre le funzioni sin(x) e sin(2x) si incontrano nel punto X=1,0472, Y=0,8660.

245.1.2 Sintassi delle funzioni

Le funzioni che possono essere disegnate da Geg devono rispettare una certa sintassi riepilogata nella guida interna di questo applicativo. In generale si possono usare tutti i tipi di parentesi che si impiegano normalmente in matematica (da quelle tonde a quelle graffe); si possono usare le notazioni del tipo 3x, 4x,... dove si sottintende la moltiplicazione della costante numerica per la variabile; la lettera `x' è l'unica variabile di cui si può fare uso; sono riconosciute le costanti `e' (intesa come la base del logaritmo naturale) e `PI' (intesa come P-greco). La tabella 245.1 riepiloga gli operatori e le funzioni utilizzabili.

Operatori e operandi Descrizione
<op1> + <op2> Somma i due operandi.
<op1> - <op2> Sottrae dal primo il secondo operando.
<op1> * <op2> Moltiplica i due operandi.
<costante><op> Moltiplica l'operando per il valore della costante.
<op1> / <op2> Divide il primo operando per il secondo.
<op1> ^ <op2> Elevamento a potenza del primo operando per il secondo.
sqrt(<op>) Radice quadrata.
cbrt(<op>) Radice cubica.
abs(<op>) Valore assoluto.
u(<op>) Restituisce uno se l'operando è positivo, zero se negativo.
log(<op>) Logaritmo in base 10.
ln(<op>) Logaritmo naturale.
sin(<op>) Seno.
cos(<op>) Coseno.
tan(<op>) Tangente.
asin(<op>) Arco-seno.
acos(<op>) Arco-coseno.
atan(<op>) Arco-tangente.
sinc(<op>)
sinh(<op>) Seno iperbolico.
cosh(<op>) Coseno iperbolico.
tanh(<op>) Tangente iperbolica.

Tabella 245.1: Operatori e funzioni di Geg.

245.2 Gnuplot

Gnuplot è un programma applicativo per il disegno di funzioni e di dati nello spazio a due e tre dimensioni. Il suo funzionamento avviene attraverso comandi impartiti attraverso una riga di comando, e in questo senso il suo utilizzo può risultare un po' strano all'utilizzatore occasionale.

Gnuplot è stato portato su molti sistemi operativi differenti, e per quanto riguarda GNU/Linux, si utilizza l'interfaccia grafica X. Per la precisione, si deve impegnare una finestra di terminale, attraverso la quale impartire i comandi. Questi generano eventualmente una rappresentazione grafica che viene mostrata in una finestra separata. L'esempio seguente mostra una sessione di lavoro brevissima utilizzando l'eseguibile `gnuplot' per visualizzare la funzione x^2 * sin(x), dove sia l'asse X che l'asse Y vanno da -P-greco a +P-greco.

gnuplot[Invio]

        G N U P L O T
        Linux version 3.5 (pre 3.6)
        patchlevel beta 347
        last modified Mon Jun 22 13:22:33 BST 1998

        Copyright(C) 1986 - 1993, 1998
        Thomas Williams, Colin Kelley and many others

        Send comments and requests for help to info-gnuplot@dartmouth.edu
        Send bugs, suggestions and mods to bug-gnuplot@dartmouth.edu

Terminal type set to 'x11'

gnuplot> splot [-pi:pi] [-pi:pi] x**2 * sin(y)[Invio]

La figura 245.3 mostra il risultato di questa funzione, così come appare nella finestra generata dal comando di Gnuplot che è appena stato visto.

209.jpg

Figura 245.3: Un funzione nello spazio tridimensionale disegnata con Gnuplot.

La versione per GNU/Linux di Gnuplot utilizza la libreria `readline' per il controllo della riga di comando: questo facilita la sua configurazione (attraverso il file `~/.inputrc') e il riutilizzo di comandi già inseriti, attraverso lo scorrimento dello storico. In pratica, chi utilizza già la shell Bash dovrebbe trovarsi a suo agio di fronte alla riga di comando di Gnuplot.

245.2.1 Avvio e interazione normale

Gnuplot viene avviato attraverso l'eseguibile `gnuplot', utilizzando necessariamente una finestra di terminale. Non è previsto l'uso di opzioni speciali, a parte quelle comuni per l'uso di programmi nel sistema grafico X (`-geometry', `-display', ecc.).

gnuplot [<opzioni>] [<file-script>...]

Eventualmente, come si vede dallo schema sintattico, possono essere indicati dei file da caricare ed eseguire. Si tratta di script di Gnuplot, composti semplicemente da una sequenza di comandi che potrebbero essere impartiti attraverso la riga di comando normale dello stesso.

Il disegno delle funzioni avviene attraverso i comando `plot', per il disegno di curve nello spazio a due dimensioni, e `splot', per il disegno di piani nello spazio a tre dimensioni. Il funzionamento interattivo di Gnuplot (quello normale che si ottiene quando non si indicano file da caricare) prevede in particolare il comando `help', per ottenere una guida rapida ai comandi, e il comando `exit' (o `quit') per terminarne il funzionamento.

La guida rapida ottenibile con il comando `help' permette di selezionare degli argomenti particolari che generalmente corrispondono ai nomi dei comandi utilizzabili. Il comando `help' da solo mostra un'introduzione all'uso di Gnuplot e termina elencando gli argomenti per i quali si possono richiedere informazioni specifiche.

245.2.2 Comandi comuni

I comandi di Gnuplot sono numerosi e complessi. Qui viene mostrato solo l'uso di alcuni di questi e in modo elementare, dove in particolare anche gli schemi sintattici vengono semplificati.

In generale, è possibile mettere assieme più comandi in un'unica riga separandoli con il punto e virgola (`;'); i comandi possono continuare nella riga successiva se si utilizza la barra obliqua inversa (`\') esattamente alla fine di una riga da continuare. Alcuni argomenti dei comandi sono delle stringhe, nel senso che non fanno riferimento a parole chiave previste, e in tal caso devono essere delimitate con gli apici singoli (`'') o con gli apici doppi (`"'), dove le stringhe delimitate con apici doppi espandono alcune sequenze precedute dalla barra obliqua inversa, mentre le altre no.

Una riga di comando di Gnuplot può contenere anche stringhe delimitate da apici inversi (``'). In tal caso queste stringhe vengono interpretate come comandi del sistema operativo sottostante e vengono rimpiazzate con il risultato dell'esecuzione del comando stesso.

I comandi possono contenere dei commenti che iniziano nel momento in cui appare il simbolo `#' e fanno in modo che venga ignorato tutto quello che appare di seguito fino alla fine della riga.

Quando un comando prevede l'indicazione di un intervallo di valori, questo viene indicato utilizzando la notazione `[<inizio>:<fine>]', con le parentesi quadre che fanno parte della notazione stessa. Se per qualche motivo si deve indicare un intervallo predefinito in modo esplicito, si possono usare le parentesi aperte e chiuse senza alcuno contenuto: `[]'.

Alcuni comandi

help [<voce>] | ? [<voce>]

Mostra la guida interna riferita alla voce richiesta, oppure all'introduzione di Gnuplot.

exit | quit

I comandi `exit' o `quit' concludono il funzionamento di Gnuplot.

plot [<intervalli>] <funzione> [title <stringa-titolo>]

Il comando `plot' serve per il disegno di punti su un piano (lo spazio a due dimensioni). Di solito si utilizza preferibilmente per il disegno di una funzione, come nella sintassi mostrata qui. Gli intervalli sono al massimo due: il primo si riferisce all'asse X e il secondo all'asse Y. Il titolo che può essere indicato in una stringa dopo la parola chiave `title' serve a definire una didascalia per la curva che viene disegnata.

plot [<intervalli>] <stringa-file-dati> [title <stringa-titolo>]

`plot' può essere usato per visualizzare anche una serie di punti come indicato all'interno di un file di dati che viene descritto più avanti. È importante osservare comunque che un file di dati di Gnuplot non ha lo stesso formato degli script di questo.

splot [<intervalli>] <funzione> [title <stringa-titolo>]

Il comando `splot' serve per il disegno di punti su uno spazio (a tre dimensioni). Di solito si utilizza preferibilmente per il disegno di una funzione, come nella sintassi mostrata qui. Gli intervalli sono al massimo tre: il primo si riferisce all'asse X, il secondo all'asse Y e il terzo all'asse Z. Il titolo che può essere indicato in una stringa dopo la parola chiave `title' serve a definire una didascalia per il piano che viene disegnato.

splot [<intervalli>] <stringa-file-dati> [title <stringa-titolo>]

`splot' può essere usato per visualizzare anche una serie di punti come indicato all'interno di un file di dati, esattamente come nel caso di `plot', con la differenza che le coordinate in questione sono fatte di tre elementi.

load <stringa-file-script>

`load' carica ed esegue il contenuto di uno script di Gnuplot. Al termine dell'esecuzione dello script riprende il funzionamento normale.

save <stringa-file-script>

`save' salva l'impostazione e il disegno attuale in uno script di Gnuplot. Eventualmente si può modificare manualmente il file in questione utilizzando un file per la modifica dei file di testo.

print <espressione>|<stringa>

`print' restituisce il risultato dell'espressione oppure la stringa fornita come argomento. In pratica permette di fare il calcolo di un valore o di mostrare una frase.

if (<condizione>) <comando>[; <comando>]...

`if' esegue il comando (o i comandi se ne viene indicato più di uno) solo se la condizione posta tra parentesi risulta vera.

pause <n-secondi> [<stringa>]

`pause' serve a fare una pausa della durata indicata dal primo argomento. Se si vuole che per proseguire debba essere premuto il tasto [Invio], occorre indicare il valore -1. La stringa è facoltativa e permette di mostrare un messaggio contenente la stringa stessa. `pause' è particolarmente adatto negli script di Gnuplot.

Esempi

gnuplot> help plot

Mostra la guida interna riferita al comando `plot'.

gnuplot> plot sin(x)

Disegna la funzione seno utilizzando una zona predefinita degli assi cartesiani.

gnuplot> plot sin(x) title 'seno di x'

Come nell'esempio precedente, indicando la stringa `seno di x' come didascalia riferita alla curva disegnata.

gnuplot> plot [-3:3] sin(x) title 'seno di x'

Come nell'esempio precedente, limitando l'ampiezza dell'asse X da -3 a +3.

gnuplot> plot [-pi:pi] sin(x) title 'seno di x'

Come nell'esempio precedente, limitando l'ampiezza dell'asse X da -P-greco a +P-greco.

gnuplot> plot 'mio_file.gnuplot'

Disegna nello spazio a due dimensioni i punti annotati nel file `mio_file.gnuplot' che si trova nella directory corrente.

gnuplot> splot x**2 * sin(y)

Disegna un piano nello spazio corrispondente alla funzione ottenuta dal quadrato di x moltiplicato per il seno di y.

gnuplot> splot x**2 * sin(y) title 'quadrato di x per seno di y'

Come nell'esempio precedente, indicando la stringa `quadrato di x per seno di y' come didascalia riferita al piano disegnato.

gnuplot> splot [-3:3] [-5:5] x**2 * sin(y) title 'quadrato di x per seno di y'

Come nell'esempio precedente, limitando l'ampiezza dell'asse X da -3 a +3 e quella dell'asse Y da -5 a +5.

gnuplot> plot [0:pi] [-pi:pi] x**2 * sin(y) title 'quadrato di x per seno di y'

Come nell'esempio precedente, limitando l'ampiezza dell'asse X da zero a +P-greco e quella dell'asse Y da -P-greco a +P-greco.

gnuplot> splot 'mio_file.gnuplot'

Disegna nello spazio a tre dimensioni i punti annotati nel file `mio_file.gnuplot' che si trova nella directory corrente.

gnuplot> if (1==1) print 'ovvio: 1 è uguale a 1'

Dal momento che la condizione si avvera, mostra la frase «ovvio: 1 è uguale a 1».

245.2.3 Espressioni

Le espressioni che si possono utilizzare con Gnuplot sono più o meno le stesse dei linguaggi di programmazione più comuni, e in generale, gli spazi orizzontali sono ignorati. Tra le altre cose questo giustifica il motivo per cui diversi tipi di argomenti dei comandi di Gnuplot devono essere definiti come stringhe delimitate.

L'aritmetica di Gnuplot distingue tra numeri interi e numeri a virgola mobile, per cui, utilizzando numeri interi si hanno risultati interi, mentre utilizzando valori a virgola mobile si ottengono risultati a virgola mobile. In pratica:

gnuplot> print 10/3[Invio]

3

gnuplot> print 10/3.0[Invio]

3.33333333333333

gnuplot> print 10/2[Invio]

5

gnuplot> print 10/2.0[Invio]

5.0

Le costanti numeriche possono essere indicate nei modi consueti, con o senza segno, separando la parte intera da quella decimale attraverso un punto, oppure si può usare anche una notazione esponenziale. Per esempio:

gnuplot> print 1e2[Invio]

100.0

gnuplot> print 1e-2[Invio]

0.01

Gli operatori che si possono utilizzare nelle espressioni di Gnuplot sono in pratica quelle del linguaggio C. La tabella 245.2 elenca e descrive gli operatori aritmetici e di assegnamento.

Operatore e operandi Descrizione
+<op> Non ha alcun effetto.
-<op> Inverte il segno dell'operando.
<op1> + <op2> Somma i due operandi.
<op1> - <op2> Sottrae dal primo il secondo operando.
<op1> * <op2> Moltiplica i due operandi.
<op1> / <op2> Divide il primo operando per il secondo.
<op1> % <op2> Modulo: il resto della divisione tra il primo e il secondo operando.
<var> = <valore> Assegna alla variabile il valore alla destra.
<op1> ** <op2> Eleva il primo operando alla potenza del secondo.

Tabella 245.2: Elenco degli operatori aritmetici e di quelli di assegnamento relativi a valori numerici.

Molti degli operatori matematici hanno senso solo perché Gnuplot consente di definire delle variabili al volo, semplicemente assegnandoci un valore. Per esempio,

gnuplot> a = 2*pi[Invio]

assegna alla variabile `a' il doppio del P-greco. Per visualizzarne il contenuto basta utilizzare il comando `print':

gnuplot> print a[Invio]

6.28318530717959

Gli operatori di confronto determinano la relazione tra due operandi. Il risultato dell'espressione composta da due operandi posti a confronto è di tipo booleano, rappresentabile all'interno di Gnuplot come !0, o non-zero (Vero), e zero (Falso), esattamente come accade nel linguaggio C. È importante sottolineare che qualunque valore diverso da zero equivale a Vero in un contesto logico. Gli operatori di confronto sono elencati nella tabella 245.3.

Operatore e operandi Descrizione
<op1> == <op2> Vero se gli operandi si equivalgono.
<op1> != <op2> Vero se gli operandi sono differenti.
<op1> < <op2> Vero se il primo operando è minore del secondo.
<op1> > <op2> Vero se il primo operando è maggiore del secondo.
<op1> <= <op2> Vero se il primo operando è minore o uguale al secondo.
<op1> >= <op2> Vero se il primo operando è maggiore o uguale al secondo.

Tabella 245.3: Elenco degli operatori di confronto. Le metavariabili indicate rappresentano gli operandi e la loro posizione.

Quando si vogliono combinare assieme diverse espressioni logiche, comprendendo in queste anche delle variabili che contengono un valore booleano, si utilizzano gli operatori logici (noti normalmente come: AND, OR, NOT, ecc.). Il risultato di un'espressione logica complessa è quello dell'ultima espressione elementare a essere valutata. Gli operatori logici sono elencati nella tabella 245.4.

Operatore e operandi Descrizione
! <op> Inverte il risultato logico dell'operando.
<op1> && <op2> Se il risultato del primo operando è Falso non valuta il secondo.
<op1> || <op2> Se il risultato del primo operando è Vero non valuta il secondo.

Tabella 245.4: Elenco degli operatori logici. Le metavariabili indicate rappresentano gli operandi e la loro posizione.

Gnuplot riconosce una serie di funzioni in parte elencate nella tabella 245.5, oltre alla costante `pi' (solo al minuscolo) che rappresenta il P-greco.

Operatori e operandi Descrizione
rand(<op>) Numero casuale.
int(<op>) Parte intera.
abs(<op>) Valore assoluto.
sqrt(<op>) Radice quadrata.
log10(<op>) Logaritmo in base 10.
log(<op>) Logaritmo naturale.
exp(<op>) e^x.
sin(<op>) Seno.
cos(<op>) Coseno.
tan(<op>) Tangente.
asin(<op>) Arco-seno.
acos(<op>) Arco-coseno.
atan(<op>) Arco-tangente.
sinh(<op>) Seno iperbolico.
cosh(<op>) Coseno iperbolico.
tanh(<op>) Tangente iperbolica.

Tabella 245.5: Alcune funzioni riconosciute da Gnuplot.

Infine, Gnuplot, oltre alla possibilità di creare e assegnare dei valori a delle variabili, può definire delle funzioni. Per esempio,

gnuplot> funzione(x,y) = x**2 * y[Invio]

definisce la funzione denominata `funzione' che ha due variabile, `x' e `y', che si traduce nell'espressione `x**2 * y'. In seguito, si può utilizzare la funzione appena creata per farci dei calcoli,

gnuplot> print funzione(2,3)[Invio]

12

oppure per disegnarne il grafico:

gnuplot> splot funzione(x,y)[Invio]

Naturalmente la stessa cosa vale per le funzioni con una sola variabile.

245.2.4 Script e file di dati

I file che possono essere indicati alla fine degli argomenti della riga di comando dell'eseguibile `gnuplot', e quelli che possono essere caricati attraverso il comando `load', sono degli script di Gnuplot. La sintassi di questi file è molto semplice: si tratta solo di un elenco di comandi di Gnuplot.

In particolare, se esiste il file `~/.gnuplot', questo viene trattato come uno script da eseguire all'avvio di Gnuplot.

A titolo di esempio viene mostrato uno script del genere il cui scopo è quello di mostrare una serie di funzioni come in una sequenza di diapositive.

#
# Sequenza di funzioni con Gnuplot.
#
plot [-1:1]  2*x title 'f(x) = 2x'
pause -1 'premere <Invio> per continuare'

plot [-2:2]  x**2 title 'f(x) = x^2'
pause -1 'premere <Invio> per continuare'

plot [-2:100] log(x) title 'log(x)'
pause -1 'premere <Invio> per continuare'

plot [-pi:pi]  sin(x) title 'seno'
pause -1 'premere <Invio> per continuare'

plot [-pi:pi] tan(x) title 'tangente'
pause -1 'premere <Invio> per continuare'

splot [-5:5] [-5:5]  2*x+y title 'f(x,y) = 2x+y'
pause -1 'premere <Invio> per continuare'

splot [-5:5] [-5:5] x**2*y title 'f(x,y) = x^2 * y'
pause -1 'premere <Invio> per continuare'

splot [-pi/4:pi/4] [-pi/2:pi/2] sin(x)*cos(y) title 'f(x,y) = sin(x)*cos(y)'
pause -1 'fine della rappresentazione'

# Fine

Gnuplot è in grado di gestire anche i file di dati, ovvero dei file contenenti solo delle coordinate corrispondenti a punti da rappresentare. Si tratta sempre di file di testo, in cui vengono ignorati i commenti preceduti dal simbolo `#' oltre alle righe bianche e a quelle vuote, mentre le altre righe contengono coordinate nella forma:

<x> <y> [<z>]

Per esempio, la riga

1 2

rappresenta il punto di coordinata X=1 e Y=2, mentre la riga

1 2 3

rappresenta il punto di coordinata X=1, Y=2 e Z=3.

Eccezionalmente, i comandi `plot' e `splot' possono essere utilizzati direttamente per visualizzare una serie di punti senza doverli caricare da un file esterno. Per ottenere questo si utilizzano nel modo seguente:

plot|splot '-'
<coordinata>
    ...
e

Per esempio,

plot '-'
0 0
1 1
2 2
3 3
4 4
e

mostra cinque punti appartenenti alla retta f(x)=x.

In questo stesso modo si possono rappresentare più gruppi di punti, aumentando conseguentemente i trattini che fungono da argomento di `plot' o di `splot'. Per esempio,

plot '-', '-'
0 0
1 1
2 2
3 3
4 4
e
0 1
1 2
2 3
3 4
4 5
e

mostra cinque punti appartenenti alla retta f(x)=x e altri cinque punti (colorati in modo diverso) appartenenti alla retta f(x)=x+1.

245.2.5 Controllare l'uscita grafica

I disegni realizzati con Gnuplot sono diretti normalmente in una finestra di X. Gnuplot controlla il formato delle immagini che crea attraverso il comando `set terminal'. *1*

set terminal <tipo-di-uscita-grafica> [<altri-argomenti>]

Per esempio, nel caso specifico della rappresentazione normale in una finestra di X, la sintassi diventa:

set terminal x11 [reset] [<n-finestra>]

Per la precisione, si possono visualizzare più finestre contemporaneamente, numerate a partire da zero. Utilizzando però la parola chiave `reset', si eliminano tutte le finestre.

Alternativamente si può fare in modo di generare un'immagine che non viene visualizzata, ma salvata in un file. La sintassi seguente riguarda la possibilità di generare immagini in formato PNG.

set terminal png [small|medium|large] [monochrome|gray|color]

Nello schema sintattico, le parole chiave `small', `medium' e `large', si riferiscono alla dimensione dei caratteri utilizzati nelle scale e nelle didascalie. Le parole chiave `monochrome', `gray' e `color', si riferiscono alla colorazione o meno che devono avere le immagini.

Il comando appena descritto non permette di stabilire la destinazione del file generato, pertanto questa è semplicemente lo standard output. Questo fatto rende praticamente impossibile la gestione di immagini PNG attraverso l'uso di Gnuplot in modo interattivo. In pratica, si deve realizzare uno script, in modo da poter avviare Gnuplot ridirigendo lo standard output verso il file desiderato. L'esempio seguente è un esempio banale di un tale script.

# parabola.gnuplot
set terminal png medium color
plot x**2

Per generare il file `parabola.png', basta il comando seguente:

gnuplot parabola.gnuplot > parabola.png

Eventualmente si può generare anche un'immagine GIF.

set terminal gif [transparent] [interlace] [small|medium|large] [size <pixel-o>,<pixel-v>] [<colore-sfondo> <colore-assi> [<colore-disegno>...] ]

La schema sintattico è più complesso e di conseguenza offre maggiori possibilità. Le dimensioni dei caratteri usati per le scale, i titoli e le didascalie, sono controllate dalle stesse parole chiave viste per il formato PNG. La parla chiave `transparent' controlla la realizzazione di un disegno con un fondale trasparente; `interlace' fa in modo di generare un file GIF interlacciato. La dimensione dell'immagine può essere definita attraverso l'opzione `size', seguita dalla quantità di pixel orizzontali e verticali (come si vede dallo schema).

In particolare possono essere controllati i colori, indicati attraverso degli argomenti che vengono posti nella parte finale del comando. Il primo di questi colori si riferisce al fondale, il secondo è quello degli assi X, Y ed eventualmente Z. I colori successivi si riferiscono agli elementi visualizzati (le curve o i piani nello spazio). Gli argomenti che esprimono i colori hanno il formato seguente:

x<rosso><verde><blu>

I tre colori fondamentali sono espressi da coppie di cifre esadecimali. Per esempio: `xffffff' è il bianco, `x000000' è il nero, `xff0000' è il rosso, `x00ff00' è il verde, e `x0000ff' è il blu.

set terminal gif xffffff x0000ff x00ff00
splot (x**2)*y

L'esempio mostra uno script con il quale si vuole generare un file GIF (di dimensioni normali) contenente il grafico della funzione f(z)=(x**2)*y, utilizzando dei colori particolari: bianco per lo sfondo, blu per gli assi e verde per il reticolo che rappresenta il piano nello spazio.

245.3 Octave

Octave è un linguaggio di programmazione ad alto livello per il calcolo matematico, usato fondamentalmente in modo interattivo. Viene usato attraverso un terminale a caratteri, come una console virtuale di GNU/Linux, ma per ottenere dei grafici si avvale di Gnuplot che così è opportuno sia installato assieme a Octave. L'interazione tra Gnuplot e Octave è trasparente, se quest'ultimo viene utilizzato in una finestra di terminale all'interno del sistema grafico X.

In queste sezioni si mostra solo qualche piccolo assaggio di Octave che dispone di ampia documentazione per conto suo: octave.info.

Anche Octave utilizza la libreria `readline' per il controllo della riga di comando, con tutti i vantaggi che ciò comporta per l'utilizzatore.

245.3.1 Avvio e interazione normale

Octave viene avviato attraverso l'eseguibile `octave'. Bisogna ricordare che se si vogliono disegnare dei grafici deve essere avviato da una finestra di terminale all'interno di X, diversamente basta una console virtuale di GNU/Linux. `octave' riconosce una serie di opzioni che qui non vengono descritte (eventualmente basta utilizzare il comando `octave --help' per ottenerne la descrizione), e può eseguire il contenuto di un file se viene indicato come ultimo argomento della riga di comando.

octave [<opzioni>] [<file-di-comandi>]

Il file di comandi è uno script contenente semplicemente comandi di Octave, dove in particolare il simbolo `#' serve a indicare l'inizio di un commento che si conclude alla fine della riga, e inoltre le righe vuote e quelle bianche vengono semplicemente ignorate.

Eventualmente, uno script di Octave può essere reso eseguibile, purché all'inizio del file venga aggiunta la solita indicazione dell'interprete da utilizzare:

#!/usr/bin/octave

Se Octave viene avviato in modo normale (senza argomenti particolari e senza l'indicazione di uno script da eseguire), si ottiene il funzionamento interattivo normale:

octave[Invio]

Octave, version 2.0.13 (i386-redhat-linux-gnu).
Copyright (C) 1996, 1997, 1998 John W. Eaton.
This is free software with ABSOLUTELY NO WARRANTY.
For details, type `warranty'.

octave:1> _

L' invito di Octave (il prompt) è un po' particolare: mano a mano che si introducono dei comandi si incrementa il numero che appare. Di seguito sono elencati alcuni comandi elementari di Octave; in altre sezioni ne vengono mostrati degli altri.

Alcuni comandi

help [-i] [<argomento>]

Il comando `help' permette di ottenere alcune indicazioni sul funzionamento di Octave. In particolare, se non si utilizza l'opzione `-i' si ottiene una guida stringata, mentre con `-i' viene attivata la consultazione del documento octave.info riferito al contesto definito dalla parola chiave che indica l'argomento.

exit | quit

Conclude il funzionamento di Octave.

pause [(<n-secondi>)]

Il comando `pause' serve a fare una pausa della durata indicata dall'argomento (che deve essere racchiuso tra parentesi tonde). Se non viene indicato l'argomento, la pausa può essere interrotta solo attraverso la pressione del tasto [Invio]. Questo comando è utile negli script di Octave.

Esempi

octave:x> help help[Invio]

Mostra la guida per utilizzare il comando `help'.

octave:x> help -i help[Invio]

Mostra la descrizione del comando `help' consultando il documento octave.info.

245.3.2 Variabili di Octave e calcoli elementari

Octave gestisce variabili scalari di tipo numerico e di tipo stringa (delimitate da apici singoli o doppi), come avviene comunemente nei linguaggi evoluti più comuni; inoltre permette la definizione di strutture, e in particolare i vettori e le matrici (nel senso matematico dei termini) in modo trasparente. La dichiarazione di una variabile si ottiene semplicemente assegnandoci un valore. Per esempio,

octave:1> a = 123[Invio]

crea, o sovrascrive la variabile `a' assegnandole il valore 123. Assegnando un valore a una variabile si ottiene anche l'eco del risultato, e questo può essere utile se l'assegnamento avviene in corrispondenza di un'espressione di qualche tipo.

octave:2> b = a / 2[Invio]

In questo caso, viene assegnato alla variabile `b' il valore pari alla metà di `a', e si ottiene opportunamente l'informazione

b = 61.500

che così precisa quale valore è stato assegnato a `b'. Le espressioni possono essere calcolate anche senza bisogno di assegnarne il risultato a qualche variabile; per esempio:

octave:3> a / b[Invio]

ans 2

In questo caso, `ans' sta per answer (risposta).

Con la stessa logica per la quale un'espressione che non viene assegnata a una variabile genera un risultato che viene visualizzato comunque, per conoscere il contenuto di una variabile basta indicarla sulla riga di comando:

octave:4> a[Invio]

a = 123

octave:5> b[Invio]

b = 61.500

245.3.3 Vettori e matrici

Al posto degli array dei linguaggi di programmazione normali, Octave tratta direttamente con vettori e matrici (per la precisione: matrici a una e a due dimensioni). Una costante letterale che rappresenta un vettore ha la forma seguente:

[ <elemento-1>, <elemento-2>, ... <elemento-n> ]

In particolare, le parentesi quadre fanno parte della dichiarazione e delimitano in pratica gli elementi del vettore. Una costante letterale che rappresenta una matrice a due dimensioni ha una forma simile a quella del vettore, con la differenza che gli elementi di una riga rispetto a quelli di un'altra sono separati da un punto e virgola:

[ <r1c1>, <r1c2>, ...; <r2c1>, <r2c2>, ...; <rnc1>, <rnc2>, ... ]

Si osservino gli esempi seguenti.

octave:1> a = [ 1, 2, 3 ][Invio]

a =

   1  2  3 

octave:2> b = [ 4, 5, 6 ][Invio]

b =

   4  5  6 

octave:3> c = [ 1, 2, 3; 4, 5, 6 ][Invio]

c =

   1  2  3 
   4  5  6 

Eventualmente si possono anche fare delle combinazioni:

octave:4> d = [ a, b ][Invio]

d =

   1  2  3  4  5  6 

octave:5> e = [ a; b ][Invio]

e =

   1  2  3 
   4  5  6 

Con i vettori e le matrici si possono fare anche dei calcoli nei modi in cui si è abituati in matematica. In particolare, la notazione `x'' restituisce la matrice trasposta di x.

octave:6> c'[Invio]

ans =

   1  4 
   2  5 
   3  6

L'esempio seguente mostra il prodotto tra due matrici; precisamente il prodotto tra la matrice `c' e la sua trasposta.

octave:7> c * c'[Invio]

ans =

  14  32
  32  77 

È possibile anche moltiplicare una costante scalare per tutti gli elementi di una matrice:

octave:8> 2 * c[Invio]

ans =

   2   4   6 
   8  10  12 

Pur senza approfondire il funzionamento di Octave, è il caso di mostrare l'uso della funzione interna `rand()', il cui scopo è quello di restituire una matrice (a due dimensioni) contenente valori casuali:

octave:9> f = rand( 2, 3)[Invio]

In questo caso, crea la matrice `f' contenente due righe e tre colonne, con valori casuali compresi tra zero e uno.

245.3.4 Disegno

Si è già accennato al fatto che Octave dipende da Gnuplot per le rappresentazioni grafiche. Ciò avviene in modo trasparente, purché si utilizzi Octave da una finestra di terminale all'interno del sistema grafico X.

L'approccio alla grafica di Octave è più complesso di Gnuplot, perché il suo scopo è differente. In generale tutto viene visto in forma di vettori e matrici. Di solito, la prima cosa da fare è prendere confidenza con la funzione `linspace()' il cui scopo è quello di generare un vettore con una serie di valori equidistanti (lineari):

linspace ( <inizio>, <fine>, <quantità>)

Il primo argomento della funzione definisce il valore del primo elemento del vettore; il secondo definisce quello dell'ultimo; il terzo argomento definisce la quantità di elementi complessivi, e la funzione determina i valori rimanenti in modo lineare. Per esempio, il comando seguente serve a creare un vettore di 11 elementi con valori progressivi da 0 a 10:

octave:1> x = linspace( 0, 10, 11)[Invio]

x =

   0   1   2   3   4   5   6   7   8   9  10

Un'altra cosa da osservare è il fatto che le funzioni matematiche che possono funzionare utilizzando un argomento numerico, possono essere applicate anche a vettori e matrici. Si osservi l'esempio seguente in cui si genera il vettore `y' calcolando il seno di ogni valore del vettore `x'.

octave:2> y = sin(x)[Invio]

y =

 Columns 1 through 8:

   0.00000   0.84147   0.90930   0.14112  -0.75680  -0.95892  -0.27942   0.65699
 Columns 9 through 11:

   0.98936   0.41212  -0.54402

Per disegnare il seno calcolato in questo modo, si utilizza la funzione interna `plot()' che ha bisogno di almeno due argomenti: il vettore dei valori per l'asse X e il vettore corrispondente dei valori da rappresentare nell'asse Y. Si intuisce che il numero di elementi di questi due vettori deve essere uguale.

plot ( <vettore-x>, <vettore-y> )

Tornando all'esempio, il comando si limita a questo:

octave:3> plot (x, y)[Invio]

Se il secondo argomento della funzione `plot()' è una matrice, si ottiene la visualizzazione di tante curve quante sono le colonne o le righe della matrice (la scelta viene fatta in base alla corrispondenza con gli elementi del vettore utilizzato come primo argomento).

octave:4> y = [ sin(x); 2 * sin(x)][Invio]

Il comando appena mostrato genera la matrice `y' con due righe corrispondenti a due vettori: il seno dei valori del vettore `x' e due volte il seno dei valori del vettore `x'.

octave:5> plot (x, y)[Invio]

Disegnando il grafico della matrice `y' si ottengono due curve corrispondenti ai valori delle due righe della stessa.

245.3.5 Script di Octave

Si è accennato alla possibilità di realizzare degli script con le istruzioni di Octave. In questo caso non c'è nulla di speciale rispetto a quanto è stato visto fino a questo punto. A titolo di esempio viene mostrato uno script con il quale si arriva a disegnare il grafico del seno di x nell'intervallo di valori da -P-greco a +P-greco.

#!/usr/bin/octave
x = linspace( -pi, +pi, 200)
y = sin(x)
plot (x,y)
pause

Lo script può essere reso eseguibile e avviato autonomamente (purché l'eseguibile `octave' si trovi effettivamente nella directory `/usr/bin/').

245.3.6 File di dati

Diversa è invece la possibilità di salvare le variabili. Per questo si utilizzano i comandi `save' e `load':

save [<opzioni>] <file> <variabile>...

load [<opzioni>] <file> <variabile>...

Attraverso le opzioni si specifica normalmente il formato in cui deve essere realizzato il file delle variabili che vengono salvate; se non viene specificato dovrebbe trattarsi di quello più semplice: un file di testo puro e semplice.

Le variabili da salvare o da ricaricare vanno annotate dopo il nome del file. Per facilitare la cosa possono essere usati dei caratteri jolly, con significato equivalente a quello delle shell normali.

Alcune opzioni

-ascii

Salva o carica utilizzando il formato ASCII di Octave.

-binary

Salva o carica utilizzando il formato binario di Octave.

-mat-binary

Salva o carica utilizzando il formato binario di Matlab.

-force

Quando vengono caricate le variabili, forza la sovrascrittura di quelle esistenti.

Esempi

octave:x> save prova a b c[Invio]

Salva le variabili `a', `b', e `c', nel file `prova' (nella directory corrente) utilizzando il formato predefinito.

octave:x> save -ascii prova a b c[Invio]

Come nell'esempio precedente, specificando esplicitamente che si vuole usare il formato ASCII di Octave.

octave:x> save -ascii prova a*[Invio]

Salva tutte le variabili che iniziano per `a' nel file `prova' utilizzando il formato ASCII di Octave.

octave:x> load -ascii -force prova[Invio]

Carica tutte le variabili dal file `prova', che dovrebbe essere in formato ASCII di Octave, sovrascrivendo le variabili eventualmente già esistenti.

---------------------------

Appunti Linux 2000.04.12 --- Copyright © 1997-2000 Daniele Giacomini --  daniele @ pluto.linux.it


1.) I vari formati grafici in cui possono essere resi i disegni di Gnuplot dipendono dal modo in cui questo è stato compilato. In pratica, la disponibilità o meno di un certo formato dipende da delle librerie incluse o meno in fase di compilazione.


[inizio] [indice generale] [precedente] [successivo] [indice analitico] [contributi]