Il programma
La finestra di Algebra, all’apparenza molto simile a quella della versione 4 (DfW = Derive for Windows) presenta invece molte novità: prima tra tutte la presenza costante della linea di editing e della barra dei simboli. Questo facilita notevolmente la digitazione delle espressioni. Naturalmente se l’utente preferisce non avere una parte dello schermo occupata dalla barra dei simboli e da quella dei caratteri greci, può escluderle tutte o in parte con una apposita voce del menu Window, ma la situazione di default è con tutte le barre attive.
Altre caratteristiche interessanti anche se non rivoluzionarie sono le migliorate capacità di editing e l’accapo automatico: per correggere una espressione già digitata è ora sufficiente posizionare il cursore su di essa, cliccare con il pulsante destro del mouse e effettuare le modifiche desiderate; la nuova espressione prenderà il posto della precedente senza dover effettuare noiose operazioni di spostamento e rinumerazione come nelle versioni precedenti.
Le espressioni più lunghe di una linea ora vanno accapo automaticamente, senza dover effettuare lo scrolling orizzontale a cui eravamo costretti nella precedente versione. Questa caratteristica è nella maggior parte dei casi estremamente comoda, ma sarebbe stato utile dare la possibilità di disattivarla: in certi casi, ad esempio quando l’espressione è costituita da una matrice di grandi dimensioni, trovarsi una matrice che va accapo (non riga per riga, ma l’intera matrice) è una situazione piuttosto sgradevole.
Per finire, una opzione non fondamentale ma utile che dimostra l’attenzione degli Autori di Derive per il mondo della scuola, in particolare per chi, come spesso avviene, usa questo programma con un proiettore collegato al PC per mostrare all’intera classe ciò che avviene sullo schermo: i caratteri che vengono normalmente utilizzati sono perfettamente adeguati a chi usa Derive con un Personal Computer, ma sono troppo piccoli per essere visti con chiarezza in una sala o in una grande aula. Ora è possibile con il comando Options Display Font selezionare font di grandi dimensioni (attenzione: non i font degli oggetti di testo inseriti con il comando Insert, ma proprio quelli dei fogli di calcolo).

La versione 4 di Derive, pur “girando” sotto Windows, non sfruttava pienamente le possibilità offerte da questo sistema operativo; Derive 5 invece lo fa: ora in un documento Derive insieme ai calcoli della finestra di Algebra è possibile inserire il contenuto della finestra di grafica 2D oppure 3D, un oggetto di testo creato al momento, utilizzando uno qualunque dei caratteri resi disponibili dall’ambiente Windows e anche un qualunque oggetto OLE (Object Linking and Embedding): un documento Word, immagini nei formati più diffusi e perfino suoni e animazioni.
E’ poi possibile salvare i worksheet di Derive in due differenti formati: quello tradizionale MTH (che è poi puro testo ASCII) e il nuovo formato DFW: il primo formato è assolutamente compatibile con quello delle versioni precedenti e, di conseguenza, non conserva gli oggetti “estranei” che sono stati inseriti nel documento; invece il nuovo formato DFW li conserva perdendo ovviamente la compatibilità con le vecchie versioni di Derive. Le dimensioni dei file DFW sono ovviamente molto superiori a quelle del corrispondente file MTH e ciò in relazione alle dimensioni degli oggetti OLE inseriti

Un’altra caratteristica interessante ma che purtroppo non funziona appieno è la possibilità di caricare automaticamente uno o più file di Utility: nel Menu Options Startup è possibile specificare da quale subdirectory prelevare i file di Utility; putroppo questa caratteristica sembra funzionare solo per i file forniti dal costruttore e non con i file di Utility creati dall’utente che continuano a dovere essere caricati “a mano” con il solito comando File Load. Credo che senza troppo sforzo da parte degli Autori si sarebbe potuto forzare Derive a caricare automaticamente anche altri file.
Nuove capacità grafiche
Derive ha ora una capacità grafica veramente innovativa e interessante: quella di poter tracciare il “grafico” di una disequazione: ad esempio l’insieme dei punti del piano che soddisfano la disequazione lineare ax + by + c > 0 viene rappresentato come un semipiano delimitato dalla retta avente come equazione ax + by + c = 0. Si noti che la disequazione proposta può anche essere in forma implicita (Fig. 5) e che sono accettati anche predicati formati da connettivi come AND e OR tra disequazioni (v. Fig.6).
Gli insegnanti potranno avvalersi di questa capacità per rappresentare soluzioni di disequazioni e per visualizzare sistemi di disequazioni in due variabili e modelli di ottimizzazione lineare.
Supponiamo ora di avere una funzione f(x) dipendente dalla variabile reale x. In condizioni normali Derive traccia il grafico dei soli valori reali della funzione (vedi ad es. Fig. 7).
Attivando la nuova opzione Plot Real and Imaginary Parts, accessibile nell’ambiente di grafica, vengono tracciati separatamente i grafici delle funzioni “parte reale di f(x)” e “parte immaginaria di f(x)”; quest’ultimo grafico viene tracciata con un tratto più spesso, per distinguerla dall’altro (vedi Fig. 8).
Un paio di piccole novità che faranno piacere agli utenti di Derive, soprattutto quando si opera nella grafica 3D: capita spesso di modificare i parametri di visualizzazione Plot Range, Plot Region e, nell’ambiente di grafica 3D, la posizione del punto di vista. E’ certamente successo a tutti di perdere la bussola a furia di successive modifiche dei fattori di scala. Le calcolatrici grafiche presentano l’utilissima opzione Zoom Standard che riporta automaticamente i parametri a quelli normali. Ora anche Derive ha una opzione, Set Default, che svolge la stessa funzione. Finalmente!
Derive è sempre stato piuttosto spartano, oltre che nell’interfaccia utente, anche nel modo di realizzare i grafici, in particolare quelli di funzioni in due variabili. Ammettiamolo: gli amici che mostravano a noi, incalliti utenti di Derive, bellissimi grafici 3D dai colori splendenti realizzati con altri e più potenti programmi, un po’ suscitavano la nostra invidia: non lo avremmo mai ammesso apertamente, ma le superfici a “filo di ferro” di Derive ci facevano una ben meschina figura al confronto. Ora è arrivato il momento della riscossa: è possibile tracciare superfici con colori sfumati, anche più di una superficie nella stessa finestra 3D, curve sghembe, superfici in coordinate cilindriche, sferiche o in forma parametrica; alcuni esempi in Fig. 9.
E non basta: per animare le superfici era necessario dotarsi di un programma esterno, Acrospin, che, dopo aver memorizzato le coordinate dei punti della griglia calcolati da Derive, realizzava le desiderate rotazioni. Ora non è più necessario: basta cliccare su apposite icone nella barra degli strumenti per ottenere spettacolari danze di superfici sullo schermo.
Sembra scomparsa la possibilità di visualizzare grafici 3D del “vecchio tipo”, così come quella di selezionare tra la presenza o meno delle linee nascoste. Alcune delle modifiche nel programma possono disorientare l’utente delle precedenti versioni; ad esempio sarei curioso di sapere cosa ha indotto i programmatori di Derive 5 a cambiare nome al parametro Grids per selezionare la “fittezza” delle linee con le quali viene realizzato il grafico: ora si chiama Panels e soprattutto non si trova più nel menu Set ma nel meno naturale menu Edit.
La manualistica
Come già la precedente versione per Windows, anche Derive 5 non possiede un completo manuale su carta ma solo un Help, seppure molto ricco. E’ disponibile anche la versione in Italiana sia del programma che del manuale in linea, curato dall’importatore Media Direct di Bassano del Grappa. Inoltre Derive arriva accompagnato da un libro, anch’esso tradotto in Italiano: “Introduzione a Derive 5”, di Bernhard Kutzler. Si tratta di un volume piuttosto corposo (circa 280 pagine) che mostra le caratteristiche e l’uso del programma attraverso esempi organizzati per argomenti (ad esempio Equazioni e disequazioni, Successioni e famiglie di curve….).
Nuove funzioni e capacità di calcolo
I miglioramenti di questa nuova versione di Derive non si limitano alla comodità di uso e alle nuove caratteristiche grafiche, spettacolari ma in fondo in fondo non essenziali, ma sono numerosi anche nelle capacità di calcolo, cosa questa che per un Computer Algebra System è l’aspetto più importante. Questi miglioramenti hanno a che fare con la risoluzione approssimata di equazioni e di sistemi, con nuove funzioni e un ricco insieme di nuovi predicati.
Per determinare le soluzioni approssimate di una equazione in tutte le precedenti versioni di Derive era necessario digitare i valori Upper e Lower Bounds (oppure confermare i valori di default –10 e 10), cioè si dovevano indicare gli estremi inferiore e superiore dell’intervallo all’interno del quale Derive avrebbe poi determinato una eventuale soluzione reale; appare evidente quindi che Derive usava il ben noto algoritmo di bisezione. In effetti utilizzava una sua variante che permetteva in certi casi di arrivare alla soluzione anche se la funzione assume valori concordi negli estremi dell’intervallo considerato (Rich 1994).
Derive ora non si comporta più così. L’algoritmo utilizzato è ora completamente cambiato e Derive riesce a determinate le soluzioni, anche complesse, di una equazione con la nuova funzione Nsolve senza dover specificare gli estremi dell’intervallo, a meno che lo si desideri esplicitamente con una apposita voce di menu. A dire il vero questa caratteristica sembra funzionare solo per le equazioni algebriche; nelle funzioni trascendenti il comportamento di Derive appare molto simile a quello delle versioni precedenti. Naturalmente gli autori sono piuttosto avari di informazioni su come funzionano i loro prodotti: il mercato dei CAS è molto competitivo e spesso viene mantenuto il segreto su come una certa capacità di calcolo viene implementata.
A titolo di esempio si veda in Fig. 10 una equazione di sesto grado risolta numericamente con Derive 4.
In Fig. 11 la stessa equazione viene risolta con Derive 5: si noti l’assenza dell’intervallo entro il quale determinare l’eventuale soluzione.
E’ ben noto che, avendo gli stessi autori, il software delle calcolatrici della serie TI-89 e TI-92 è tratto da Derive. Per una volta invece Derive ha usufruito di un algoritmo di calcolo simbolico creato originariamente per le calcolatrici TI-92 Plus: si tratta dell’algoritmo di Buchberger grazie al quale è ora possibile anche per Derive risolvere simbolicamente sistemi di equazioni non lineari.
In Fig. 12 appare il tentativo (fallito, come si vede) di risolvere il sistema
da parte di Derive per Windows.
In Fig. 13 invece appare il risultato fornito da Derive 5 (si noti l’accapo e il corretto uso dei connettivi logici AND e OR ).

La funzione Solutions
Ancora un frutto della fratellanza tra Derive e calcolatrici simboliche: queste ultime possiedono, oltre alla funzione Solve, anche la funzione Zeros che fornisce gli zeri di una funzione presentati sotto forma di lista.
Anche in Derive Solve viene ora affiancata dalla nuova funzione Solutions che, sfruttando evidentemente il medesimo algoritmo di calcolo, presenta le soluzioni sotto forma di vettore. Questa funzione è ancora più versatile di Zeros a cui si ispira, perché funziona anche con sistemi, lineari e non, fornendo la matrice a due colonne delle soluzioni. Questo può essere molto utile se le soluzioni dell’equazione o del sistema devono poi essere in qualche modo successivamente rielaborate.

Non mancano poi una nutrita schiera di nuove funzioni, in particolare i nuovi predicati: Integer?(n), Rational?(n), odd?(n), even?(n) ecc. che riportano true se l’argomento n è rispettivamente un numero intero, razionale, dispari, pari ecc., false in caso contrario.
Tra questi vi sono anche Integer_type?(n), real_type?(n), number_type?(n) che, a detta del manuale on line, dovrebbero fornire true se il loro argomento è un numero di tipo intero, reale ecc.; cosa utile soprattutto quando il loro argomento non è un numero direttamente indicato ma è un’espressione simbolica.
Il condizionale è d’obbligo: Derive 5, almeno nella versione in mio possesso, qui mostra un bug, già segnalato agli Autori (è possibile che questo bug sia già stato corretto): mentre ad esempio floor(5.3) fornisce correttamente 5 e Integer?(floor(5.3)) dà true, Integer_type?(n) risponde con una coppia di parentesi vuote sia con l’argomento n = 5.3 che con floor(5.3).
Nuovi operatori
Sono presenti ora alcuni nuovi operatori: un nuovo operatore di assegnazione e il “quote operator”.
Nel primo caso si tratta di operatori usati in una assegnazione ad una variabile nella quale viene usata la medesima variabile.
Ad esempio per incrementare la variabile a di una unità, invece di scrivere
a := a + 1 è ora possibile scrivere a:+1.
Analogamente esistono gli operatori : -, : *, : /.
Il vantaggio principale dell’uso di questi operatori è dato dalla loro maggiore velocità di esecuzione; ovviamente la cosa è rilevante e percepibile solo all’interno di un ciclo; ad esempio un ciclo che “conta” da 1 a 100.000 a passo di 1 con la normale assegnazione a := a+1 viene eseguito su un Pentium II 400 in 23.5 secondi, lo stesso ciclo realizzato con l’operatore a:+1 viene realizzato in 13.7 secondi.
Nel caso del quote operator si tratta del simbolo ‘ (che noi chiameremmo “apostrofo”) che inibisce il calcolo della espressione che lo segue.
Ad esempio 5 + 6 viene semplificato, ovviamente, in 11, mentre ‘(5 + 6) viene semplificato in 5 + 6.
La cosa non sembra particolarmente sconvolgente ma in realtà può essere molto utile, soprattutto quando una espressione viene passata come argomento ad una funzione: normalmente Derive semplifica subito l’espressione, prima di calcolare la funzione; con l’uso del quote operator ciò non avviene.
Vediamo un esempio; definiamo una funzione e la relativa funzione integrale:
Se ora chiediamo a Derive di valutare la funzione integrale per x = 3, otteniamo:Se invece usiamo il quote operator nella definizione della funzione integrale, otteniamo.
Naturalmente nessuno ci impedisce poi di semplificare il precedente risultato:
La programmazione in Derive 5
L’aspetto forse più ghiotto di questa versione di Derive è data dai miglioramenti nel campo della programmazione: tutti gli utenti di Derive sanno che è possibile realizzare “programmi” con Derive, ma si tratta di una programmazione di tipo funzionale anziché procedurale. Detto in modo molto semplice, ciò significa che vengono utilizzate esclusivamente combinazioni di funzioni preconfezionate; in sostanza quindi ogni “programma” in Derive è costituito da funzioni e da concatenazioni di funzioni.
In Derive 5 vengono introdotti alcuni elementi di programmazione procedurale “classica”, almeno dal punto di vista della stampa. Ci spiegheremo meglio con i prossimi esempi.
Iniziamo con vedere alcune nuove funzioni.
E’ possibile con la funzione Prog eseguire più istruzioni sequenzialmente con la sintassi:
Prog(istruz1,istruz2, …..).
Viene finalmente introdotta la possibilità di realizzare cicli (enumerativi e non) in modo molto più semplice e agile che con le funzioni Vector e Iterates (che comunque sono ancora disponibili) grazie alla nuova funzione Loop:
Loop(blocco_di_istruzioni).
Il ciclo ha termine quando si incontra l’istruzione Exit oppure Return(variabile), di solito legata al verificarsi di un IF. Questa funzione ha quindi anche il pregio di poter funzionare sia con un pre-test (come il while del Pascal) che con un post-test, come il Repeat, a seconda della posizione dell’IF nel blocco di istruzioni all’interno del ciclo.
Vediamo un primo esempio: si tratta del ben noto algoritmo della divisione euclidea per differenze successive tra due numeri interi a e b (ovviamente con b non nullo); riportiamo prima il listato in Pascal:
Program diveuc;
var a,b,k:integer;
begin
readln(a); readln(b);
k:=0;
while a >= b
do
begin
a:=a-b;
k:=k+1;
end;
writeln( k); writeln(a);
end.
Ed ecco come appare in Derive:
Si noti il blocco di più istruzioni inserite entro un PROG(…..)
Ed eccolo in azione:
Sembra proprio un programma in “quasi-Pascal”, con tanto di indentazioni, ma attenzione, non è tutto oro ciò che riluce: ecco come il programma deve essere digitato nella linea di editing:
diveuc(a, b) := PROG(k := 0, LOOP(IF(a < b, RETURN ["quoziente:", k; "resto: ", a], PROG(a := a - b, k := k + 1))))
Si noti l’uso di una funzione Prog all’interno di un’altra funzione Prog: essa serve anche per racchiudere un blocco di più istruzioni all’interno di un programma e possono essere annidate; equivale al ben noto begin ….. end del Pascal. In altre parole la presentazione del programma nel foglio di lavoro non deve trarre in inganno: mascherato sotto un aspetto procedurale si nasconde una impostazione che in realtà è ancora di tipo funzionale.
Vediamo ora un altro esempio, (tratto da Barozzi 1987): il calcolo di MCD e mcm di due interi positivi in linguaggio di progetto:
X ¬ n, Y ¬ m
U ¬ X, V ¬ Y
finché X ¹ Y ripetere:
se X < Y
allora:
Y ¬ Y – X
V ¬ V + U
altrimenti
X ¬ X – Y
U ¬ U + V
stampare (X + Y)/2, (U + V)/2
fine
Eccone la traduzione, non proprio letterale, in Derive:
mm(n, m) := PROG(x := n, y := m, u := x, v := y,
LOOP(IF(x = y, RETURN [(x + y)/2, (u + v)/2]),
IF(x < y, PROG(y := y - x, v := v + u), PROG(x := x - y, u := u + v))))
Vediamolo in esecuzione:
Un utile accessorio non “di serie”
E’ forse inutile segnalare che, anche se le possibilità di programmazione di Derive sono molto migliorate, la digitazione di un programma è quanto di più scomodo si possa immaginare: se il programma è appena appena un po’ articolato, la sua digitazione è un vero gioco di pazienza, con una tale giungla di parentesi annidate l’una dentro l’altra che è quasi impossibile far girare il programma al primo colpo senza alcun errore di sintassi.
Recentemente è uscito in “The Bulletin of the Derive + TI 92 User Group” un interessante articolo (Schiller 2000) che descrive nientemeno che…..un compilatore per Derive. Questo compilatore, di nome TOM, è scaricabile gratuitamente dalla Rete al seguente indirizzo :
http://www.acdca.ac.at/t3/dergroup/index.htm, selezionando “Download of all Files (DERIVE und TI-92) from DNL#40/December 2000”.
TOM risolve ogni problema nell’editing di un programma in Derive: l’utente può digitare il suo programma usando un normale editor di testi (il pur semplicissimo Blocco Note di Windows, ad esempio, va benissimo) usando indentazioni e ogni altro accorgimento tipografico che possa facilitare la lettura del programma, poi lo passa al compilatore che produce il programma Derive corrispondente.
Addirittura questo compilatore riconosce altre istruzioni oltre a quelle di Derive 5, come ad esempio LOOP FOREVER……BREAK, LOOP WHILE……, LOOP UNTIL….., DO…. END.
Il programma è molto spartano: per farlo girare si deve aprire una finestra DOS, digitare TOM seguito dal nome del file di testo da tradurre (compresa l’estensione) e produce un file con estensione .MTH; la gestione degli errori è praticamente inesistente e sembra di lavorare con un compilatore dei primi anni Ottanta (pre-Turbo Pascal, per intenderci). E’ sempre opportuno fare un controllo “a occhio” del file che viene prodotto, perché ogni tanto ha qualche stranezza di comportamento (in particolare la tendenza a inserire qualche assegnazione di troppo), però funziona.
Conclusioni
Per concludere Derive versione 5 si presenta sotto un certo aspetto come il solito programma di sempre: facile da usare, agile, versatile e nello stesso tempo potente, caratteristiche queste che hanno decretato il suo successo nel passato soprattutto in campo scolastico, e che faranno altrettanto anche in futuro. Nello stesso tempo però acquista tutte le caratteristiche di multimedialità e ricchezza grafica che presentano i programmi che “girano” nell’ambiente Windows.