Familiarizzare con Mathematica - Dario...

90
Il contenuto di queste pagine è protetto dalle leggi sul copyright e dalle disposizione dei trattati internazionali. Il titolo ed il copyright relativi alle pagine sono di proprietà dell'autore. Le pagine possono essere riprodotte ed utilizzate liberamente dagli studenti, dagli istituti di ricerca, scolastici ed universitari afferenti al Ministero dell'Istruzione, dell'Università e della Ricerca per scopi istituzionali, non a fine di lucro. Ogni altro utilizzo o riproduzione (ivi incluse, ma non limitatamente a, le riproduzioni a mezzo stampa, su supporti magnetici o su reti di calcolatori) in toto o in parte è vietata, se non esplicitamente autorizzata per iscritto, a priori, da parte dell'autore. L'informazione contenuta in queste pagine è ritenuta essere accurata alla data della pubblicazione. Essa è fornita per scopi meramente didattici e non per essere utilizzata in progetti di impianti, prodotti, ecc. L'informazione contenuta in queste pagine è soggetta a cambiamenti senza preavviso. L'autore non si assume alcuna responsabilità per il contenuto di queste pagine (ivi incluse, ma non limitatamente a, la correttezza, completezza, applicabilità ed aggiornamento dell'informazione). In ogni caso non può essere dichiarata conformità all'informazione contenuta in queste pagine. In ogni caso questa nota di copyright non deve mai essere rimossa e deve essere riportata anche in utilizzi parziali. Familiarizzare con Mathematica 1.1. Input e output di Mathematica Una volta eseguito Mathematica , l'utente si trova di fronte a una finestra inizialmente vuota. Questa finestra è associata ad un notebook, che è la componente di Mathematica deputata a interagire con l'utente. Come indicato dal nome, un notebook implementa la metafora di un quaderno su cui scrivere, in forma più o meno elegante. Nonostante siano stati pensati per un utilizzo fortemente orientato a contenuti di carattere matematico, i notebook di Mathematica si prestano anche a lavorare con informazione di tipo più eterogeneo. Ad esempio, quello che state leggendo è stato scritto utilizzando un notebook e non un impaginatore di testi. l notebook è il programma tramite cui un utente dialoga con il sistema, inserendo richieste e ottenendo risposte. Un'altra parte del sistema, chiamata kernel, si occupa invece di eseguire tutte le computazioni necessarie per portare a termine queste richieste, generando (eventualmente) le relative risposte. Seguendo la terminologia informatica, d'ora in avanti parleremo di input e di output piuttosto che di richieste e risposte. Più precisamente, ogni notebook è diviso in tante celle, ognuna tipicamente marcata da una parentesi quadra chiusa posta alla sua destra, che ne delimita il contenuto (e infatti ci si riferisce a questi componenti di Mathematica come a dei delimitatori di cella) e che permette di selezionare l'intera cella (cliccando sulla sua parte verticale), ad esempio per copiarla o cancellarla da un notebook. Un altro aspetto pratico dei delimitatori di cella è rappresentato dal fatto che le piccole barre orizzontali poste alle loro estremità permettono di individuare il punto in cui due celle si separano. Ciò è particolarmente utile quando si vuole inserire una nuova cella in mezzo a due celle esistenti: posizionando il cursore in un qualunque punto di un notebook compreso tra due delimitatori successivi, questo cambierà infatti la sua forma (assumendo quella di una linea orizzontale delimitata da due piccoli segmenti, in pratica l'equivalente ruotato del simbolo, detto caret o i-bean, che lo stesso cursore assume quando viene posizionato all'interno di un'area di testo in una qualunque interfaccia grafica), proprio a evidenziare il fatto che cliccando in questa posizione è possibile inserire una nuova

Transcript of Familiarizzare con Mathematica - Dario...

Il contenuto di queste pagine è protetto dalle leggi sul copyright e dalle disposizione dei trattati internazionali. Il titolo

ed il copyright relativi alle pagine sono di proprietà dell'autore. Le pagine possono essere riprodotte ed utilizzate

liberamente dagli studenti, dagli istituti di ricerca, scolastici ed universitari afferenti al Ministero dell'Istruzione,

dell'Università e della Ricerca per scopi istituzionali, non a fine di lucro. Ogni altro utilizzo o riproduzione (ivi incluse,

ma non limitatamente a, le riproduzioni a mezzo stampa, su supporti magnetici o su reti di calcolatori) in toto o in

parte è vietata, se non esplicitamente autorizzata per iscritto, a priori, da parte dell'autore.

L'informazione contenuta in queste pagine è ritenuta essere accurata alla data della pubblicazione. Essa è fornita per

scopi meramente didattici e non per essere utilizzata in progetti di impianti, prodotti, ecc.

L'informazione contenuta in queste pagine è soggetta a cambiamenti senza preavviso. L'autore non si assume alcuna

responsabilità per il contenuto di queste pagine (ivi incluse, ma non limitatamente a, la correttezza, completezza,

applicabilità ed aggiornamento dell'informazione). In ogni caso non può essere dichiarata conformità all'informazione

contenuta in queste pagine. In ogni caso questa nota di copyright non deve mai essere rimossa e deve essere

riportata anche in utilizzi parziali.

Familiarizzare con Mathematica1.1. Input e output di Mathematica

Una volta eseguito Mathematica, l'utente si trova di fronte a una finestra inizialmente vuota. Questafinestra è associata ad un notebook, che è la componente di Mathematica deputata a interagire conl'utente. Come indicato dal nome, un notebook implementa la metafora di un quaderno su cui scrivere,in forma più o meno elegante. Nonostante siano stati pensati per un utilizzo fortemente orientato acontenuti di carattere matematico, i notebook di Mathematica si prestano anche a lavorare coninformazione di tipo più eterogeneo. Ad esempio, quello che state leggendo è stato scritto utilizzandoun notebook e non un impaginatore di testi.

l notebook è il programma tramite cui un utente dialoga con il sistema, inserendo richieste e ottenendorisposte. Un'altra parte del sistema, chiamata kernel, si occupa invece di eseguire tutte lecomputazioni necessarie per portare a termine queste richieste, generando (eventualmente) le relativerisposte. Seguendo la terminologia informatica, d'ora in avanti parleremo di input e di output piuttostoche di richieste e risposte.

Più precisamente, ogni notebook è diviso in tante celle, ognuna tipicamente marcata da una parentesiquadra chiusa posta alla sua destra, che ne delimita il contenuto (e infatti ci si riferisce a questicomponenti di Mathematica come a dei delimitatori di cella) e che permette di selezionare l'interacella (cliccando sulla sua parte verticale), ad esempio per copiarla o cancellarla da un notebook. Unaltro aspetto pratico dei delimitatori di cella è rappresentato dal fatto che le piccole barre orizzontaliposte alle loro estremità permettono di individuare il punto in cui due celle si separano. Ciò èparticolarmente utile quando si vuole inserire una nuova cella in mezzo a due celle esistenti:posizionando il cursore in un qualunque punto di un notebook compreso tra due delimitatorisuccessivi, questo cambierà infatti la sua forma (assumendo quella di una linea orizzontale delimitatada due piccoli segmenti, in pratica l'equivalente ruotato del simbolo, detto caret o i-bean, che lo stessocursore assume quando viene posizionato all'interno di un'area di testo in una qualunque interfacciagrafica), proprio a evidenziare il fatto che cliccando in questa posizione è possibile inserire una nuovacella.

Quando si scrive qualcosa nella finestra di un notebook, viene automaticamente creata in esso unacella di input, cioé una cella in cui è possibile inserire dell'input da comunicare al kernel. Le celle diinput sono riconoscibili perché la parte superiore del delimitatore di cella corrispondente è marcata conun piccolo triangolo. Ogni notebook può poi implementare delle proprie regole di stile per formattarein modo opportuno celle di tipologia differente. Ad esempio le celle di input in questo notebook sonocaratterizzate da un fondo arancione chiaro e da un font della famiglia Courier, che dovrebbe ricordarela forma con cui tipicamente gli elaboratori scrivono il codice.

Più precisamente, ogni notebook è diviso in tante celle, ognuna tipicamente marcata da una parentesiquadra chiusa posta alla sua destra, che ne delimita il contenuto (e infatti ci si riferisce a questicomponenti di Mathematica come a dei delimitatori di cella) e che permette di selezionare l'interacella (cliccando sulla sua parte verticale), ad esempio per copiarla o cancellarla da un notebook. Unaltro aspetto pratico dei delimitatori di cella è rappresentato dal fatto che le piccole barre orizzontaliposte alle loro estremità permettono di individuare il punto in cui due celle si separano. Ciò èparticolarmente utile quando si vuole inserire una nuova cella in mezzo a due celle esistenti:posizionando il cursore in un qualunque punto di un notebook compreso tra due delimitatorisuccessivi, questo cambierà infatti la sua forma (assumendo quella di una linea orizzontale delimitatada due piccoli segmenti, in pratica l'equivalente ruotato del simbolo, detto caret o i-bean, che lo stessocursore assume quando viene posizionato all'interno di un'area di testo in una qualunque interfacciagrafica), proprio a evidenziare il fatto che cliccando in questa posizione è possibile inserire una nuovacella.

Quando si scrive qualcosa nella finestra di un notebook, viene automaticamente creata in esso unacella di input, cioé una cella in cui è possibile inserire dell'input da comunicare al kernel. Le celle diinput sono riconoscibili perché la parte superiore del delimitatore di cella corrispondente è marcata conun piccolo triangolo. Ogni notebook può poi implementare delle proprie regole di stile per formattarein modo opportuno celle di tipologia differente. Ad esempio le celle di input in questo notebook sonocaratterizzate da un fondo arancione chiaro e da un font della famiglia Courier, che dovrebbe ricordarela forma con cui tipicamente gli elaboratori scrivono il codice.

Questa è una cella di input

Tramite le regole di stile è possibile modificare vari aspetti di una cella. In particolare è possibile disabilitare la visualizzazione dei

delimitatori di cella.

L'utente può scrivere in un notebook una generica espressione matematica e richiedere al kernel divalutarla. La valutazione avviene dopo che si è utilizzata una particolare combinazione di tasti (Ûnella versione per Mac OS, ˜+Á nelle versioni per Linux o MS Windows) o la voce di menùKernel/Evaluation/Evaluate cells.

Il kernel riceve l'espressione, la valuta, e infine ritorna l'output relativo al notebook. Quest'ultimo sioccupa di presentarlo in modo opportuno all'utente. Ad esempio

In[208]:= 1 + 1

Out[208]= 2

Attenzione: se è la prima volta che valutate una cella, il processo di valutazione potra' richiedere qualche secondo. Questo è

dovuto al fatto che deve essere caricato ed eseguito un Kernel.

L'output fornito da Mathematica appare in una cella il cui stile è molto simile a quello della cella che laprecede, con l'unica differenza che lo sfondo ora è arancione scuro e il delimitatore ha un ulteriorelinea orizzontale al di sotto del triangolo nella sua parte superiore. Questo sta a rimarcare il fatto cheessa è appunto una cella di output. Nonostante sia possibile inserire in un notebook celle di altri tipi(ad esempio quello che state leggendo in questo istante è il contenuto di una cella di testo), per ilmomento noi ci occuperemo principalmente di celle contenenti input e output. Il lettore interessato puòtrovare in appendice alcuni approfondimenti relativi ad altri tipi di cella implementati.

E' da notare come un gruppo di celle che siano in qualche modo correlate sia evidenziato da unulteriore delimitatore, posto a destra rispetto a quelli delle singole celle, che delimita l'intero gruppo.Ciò succede ad esempio se andiamo ad esaminare una cella di input e la corrispondente (o lecorrispondenti) celle di output. Gruppi di celle di questo tipo, oltre che creati automaticamente daMathematica in opportune occasioni, possono essere creati dall'utente selezionando

Tipicamente, la fase di immissione dei dati viene segnalata dalla pressione del tasto Á. InMathematica invece tale tasto serve semplicemente per andare a capo in una cella. Un altro aspettonon standard è costituito dall'interpretazione degli spazi bianchi (caratteri di spazio, tabulazione eritorno a capo). Questi in genere vengono ignorati e il loro uso permette di migliorare la leggibilità diquanto viene scritto. Mathematica invece li tratta nel modo seguente:

2 cap0.nb

Tipicamente, la fase di immissione dei dati viene segnalata dalla pressione del tasto Á. InMathematica invece tale tasto serve semplicemente per andare a capo in una cella. Un altro aspettonon standard è costituito dall'interpretazione degli spazi bianchi (caratteri di spazio, tabulazione eritorno a capo). Questi in genere vengono ignorati e il loro uso permette di migliorare la leggibilità diquanto viene scritto. Mathematica invece li tratta nel modo seguente:

gli spazi bianchi vengono ignorati;

In[149]:= 1 + 1

Out[149]= 2

le tabulazioni non vengono accettate: provate a inserire una o più tabulazioni in una cella di input evedrete che questa operazione non ha alcun effetto su quello che viene effettivamente scrittonella cella. Solitamente le tabulazioni vengono usate per indentare il codice scritto, unapeculiarità che vedremo essere implementata automaticamente;

i caratteri di "a capo" iniziano una nuova linea all'interno di una cella (senza segnalare, come dettoprima, il termine dell'immissione dei dati). Va rimarcato il fatto che qualora una cella contengapiù linee, queste verranno valutate separatamente e in sequenza dal kernel

In[150]:= 1 + 11 + 21 + 3

Out[150]= 2

Out[151]= 3

Out[152]= 4

quindi questi caratteri non possono essere utilizzati per spezzare una riga troppo lunga: siconsideri ad esempio la cella seguente

In[153]:= 1+1

Out[153]= 1

Out[154]= 1

Mathematica ha interpretato il primo "1" come una riga a sé stante, mentre ha accorpato le duerighe seguenti nell'espressione "+1", per poi valutare le due espressioni separatamente. Il fattoche le ultime due righe siano considerate come un'unica espressione è evidenziato dal fatto chela seconda tra queste è indentata rispetto alla prima.

Mathematica spezza in modo generalmente automatico le linee troppo lunghe, tranne quando nonriesce a trovare un punto adeguato in cui dividere il contenuto della cella. In questi casi in ognilinea viene scritto quanto più possibile, e la separazione è marcata a fine linea dal caratterespeciale di separazione (Ö):

cap0.nb 3

Mathematica ha interpretato il primo "1" come una riga a sé stante, mentre ha accorpato le duerighe seguenti nell'espressione "+1", per poi valutare le due espressioni separatamente. Il fattoche le ultime due righe siano considerate come un'unica espressione è evidenziato dal fatto chela seconda tra queste è indentata rispetto alla prima.

Mathematica spezza in modo generalmente automatico le linee troppo lunghe, tranne quando nonriesce a trovare un punto adeguato in cui dividere il contenuto della cella. In questi casi in ognilinea viene scritto quanto più possibile, e la separazione è marcata a fine linea dal caratterespeciale di separazione (Ö):

In[158]:= 1111111111111111111111111111111111111111111111111111111111111111111111111Ö111111111111111111111111111111111111111111111111111111

Il processo di valutazione è composto delle seguenti fasi:

La cella in cui si trova il cursore viene etichettata (alla sua sinistra) dalla voce In[n], dove n è unnumero che parte da 1 (quando viene eseguito il kernel) e aumenta progressivamente ogni voltache viene valutata una cella.

Il contenuto di questa cella viene analizzato per verificare l'eventuale presenza di errori. In casonon ne vengano trovati, la cella viene valutata e l'eventuale risultato viene stampato in unanuova cella, automaticamente etichettata dalla voce Out[n], dove n è un numero progressivocalcolato nello stesso modo di In[n].

In caso vengano trovati degli errori, vengono stampati uno o più messaggi opportuni: se adesempio scriviamo un'espressione matematica che non ha senso, come la seguente, otteniamo

In[215]:= 3 - * 2

Syntax::sntxf : "3 -" cannot be followed by "*2".

3 - *2

Kernel e notebook sono due programmi separati che comunicano tra loro e che possono anche essereeseguiti separatamente.Ad esempio è possibile eseguire più notebook che facciano riferimento a unostesso kernel,oppure eseguire un notebook su un computer e il relativo kernel su un altro,sfruttandouna connessione di rete.Ancora,è possibile scindere una computazione complessa proveniente da unnotebook in varie sotto-computazioni da fare eseguire in modo concorrente da altrettanti kernel inesecuzione su macchine differenti.

1.1.1. Modalità di inserimento per l'input

Mathematica accetta come input una serie di oggetti dal significato differente, come ad esempionumeri interi, numeri irrazionali, testo, espressioni matematiche con un preciso stile (come ad esempiol'esecuzione di un'esponenziazione) e così via. Siccome non tutti questi oggetti trovano uncorrispondente sulla tastiera di un computer (come la costante p), si rende necessario poterli inserireutilizzando delle modalità alternative di immissione dell'input.

4 cap0.nb

Mathematica mette a disposizione le seguenti modalità di immissione:

tramite tastiera, utilizzando una descrizione di tipo testuale. Questa rappresenta la scelta naturaleper molti possibili input (i numeri interi, le quattro operazioni aritmetiche fondamentali, ...) i cuisimboli corrispondenti trovano tipocamente posto nelle tastiere di un computer, mentre richiedeil ricorso a una codifica opportuna per altre informazioni (ad esempio la costante "Pi greco" cheviene indicata tramite la codifica Pi); va notato come questa codifica rimanga visualizzata sulnotebook nella sua forma testuale;

tramite tastiera, inserendo input di tipo complesso tramite un'opportuna codifica che vieneimmediatamente trasformata sul notebook in forma grafica; ad esempio è possibile visualizzarela costante "Pi greco" tramite l'usuale simbolo p premendo il tasto  (azione che vieneconfermata dalla comparsa sul notebook del carattere speciale Ç), inserendo la parola "pi" epremendo nuovamente il tasto Â: il notebook verrà aggiornato sostituendo i caratteri da Ç inavanti con il simbolo p. Per utilizzare questo tipo di modalità di immissione sono disponibili variecodifiche (denominate più precisamente alias), tra cui una parzialmente mutuata dal sistemaLaTeX (un sistema di word processing in cui la descrizione dei documenti è fatta in modopuramente testuale, inserendo appunto dei comandi in un'opportuna codifica per indicare gli stilida applicare di volta in volta);

tramite il puntatore del mouse e un sistema di palette, cioé di tabelle che contengono vari simboliche Mathematica inserisce nel notebook quando vengono selezionati. Per visualizzare (onascondere) una palette, è sufficiente selezionare la voce di menù File/Palettes. In molti casi,quando il puntatore del mouse viene posizionato sopra un simbolo all'interno di una palette,nella parte inferiore di quest'ultima vengono visualizzate le codifiche per inserire il simbolocorrispondente tramite tastiera.

1.2. Espressioni aritmetiche

La specificazione di espressioni aritmetiche segue più le convenzioni utilizzate più dai matematici chenon dagli informatici. La differenza principale tra i due approcci sta nel fatto che non è necessariospecificare alcun simbolo per indicare la moltiplicazione: basta inserire uno spazio tra i fattori

In[227]:= 4 2

Out[227]= 8

In ogni caso è possibile specificare esplicitamente l'operazione di moltiplicazione utilizzando il simbolo*. Questo è utile quando l'uso dello spazio può diminuire la leggibilità del codice Mathematica prodotto:

In[228]:= 4* 2

Out[228]= 8

cap0.nb 5

Le rimanenti operazioni aritmetiche vengono specificate utilizzando gli usuali simboli per indicare glioperatori di addizione (+) e sottrazione (-), a cui si aggiungono quelli relativi a divisione (/),elevamento a potenza (^) e calcolo del fattoriale (!).

In[229]:= 4 + 2

Out[229]= 6

In[230]:= 4 - 2

Out[230]= 2

In[232]:= 4ê 2Out[232]= 2

In[231]:= 4^2

Out[231]= 16

In[163]:= 4!

Out[163]= 24

Ovviamente è possibile utilizzare le parentesi tonde per variare l'ordine di valutazione predefinito delleoperazioni aritmetiche:

In[63]:= 3 H4 + 5LOut[63]= 27

Il bello di utilizzare Mathematica sta nella possibilità di effettuare velocemente operazioni cherichiederebbero troppo tempo se eseguite a mano, come ad esempio

In[64]:= 2^100

Out[64]= 1267650600228229401496703205376

6 cap0.nb

In[166]:= 30!

Out[166]= 265252859812191058636308480000000

1.3. Numeri interi ed approssimati

Se proviamo a dividere 8 per 6 otteniamo come risultato

In[237]:= 8ê 6Out[237]=

4ÅÅÅÅ3

Mathematica ha quindi espresso il risultato della divisione come una frazione, che ha poi semplificato.In questo modo non viene introdotta alcuna approssimazione nel valore espresso. Analogamente si ha

In[238]:= 5ê 2Out[238]=

5ÅÅÅÅ2

Il risultato in questo caso è sempre espresso tramite una frazione, nonostante anche l'espressionedecimale 2.5 fosse corretta. Mathematica è stato progettato per indicare i numeri in forma esatta, cioésenza introdurre approssimazioni, a meno che non gli venga esplicitamente richiesto di fare ilcontrario. Per i numeri decimali, la forma esatta viene indicata tramite la corrispondente frazioneridotta ai minimi termini: è per questo che il risultato della prima divisione è stato espresso come 4/3.Ogni volta che viene indicato un numero contentente un punto decimale (non necessariamenteseguito da cifre), questo è inteso come espresso in forma approssimata, in cui tipicamente solo alcunedelle potenzialmente infinite cifre significative vengono elencate. Anche questo è il motivo per cui ilrisultato della divisione precedente è stato espresso come 5/2 e non come 2.5. Quest'ultimo numero,infatti, potrebbe essere ad esempio confuso con l'espressione approssimata di 2.500000000000001.

Ogni volta che un'espressione aritmetica contiene un numero decimale (eventualmente senza alcunacifra dopo di esso), l'intera espressione viene valutata in modo approssimato

In[242]:= 5ê 2 + 1.5

Out[242]= 4.

E' da notare come il risultato di questa somma sia stato espresso con un punto decimale, proprio adindicare che esso è approssimato, essendo approssimato uno degli addendi. Pertanto il risultato delleseguenti operazioni è differente:

cap0.nb 7

In[243]:= 5ê 2 - 5ê2Out[243]= 0

In[244]:= 5ê 2 - 2.5

Out[244]= 0.

Il primo risultato è la differenza tra due numeri uguali, entrambi espressi in forma esatta, che pertantoè uguale a zero (in forma esatta). Il secondo è la differenza tra due numeri uguali, dei quali uno èespresso in forma approssiamata, che sarà quindi uguale a zero in forma approssimata, come indicatodal punto decimale.

Mathematica elabora in modo molto diverso i numeri espressi in forma esatta e quelli espressi in forma approssimata. In particolare, la

valutazione di espressioni complesse contenenti numeri in forma approssimata richiede un tempo tipicamente inferiore rispetto ai

numeri in forma esatta. Tenere a mente questa differenza può portare pertanto a realizzare modelli con tempi di esecuzione ottimizzati.

1.4. Costanti

Una costante rappresenta un valore che non varia nel tempo. Si trovano vari esempi di costanti infisica (la velocità della luce, la costante di graviazione universale, ...) e in matematica (il pi greco, maanche un qualsiasi numero). Mathematica implementa, tra le altre, le seguenti costanti matematiche:

il pi greco (la lunghezza di una circonferenza di diametro unitario):

In[3]:= Pi

Out[3]= p

la costante di Nepero (il valore della somma ‚n=0

+¶ 1ÅÅÅÅÅÅn!

):

In[4]:= E

Out[4]= ‰

L'unità immaginaria (la radice quadrata di -1):

In[5]:= I

Out[5]= Â

8 cap0.nb

In realtà sono implementate anche molte altre costanti di tipo matematico e fisico, ma non leprenderemo in considerazione.

1.5. Funzioni

Le funzioni vengono specificate indicando il loro nome seguito da una coppia di parentesi quadre chene racchiudono gli argomenti. In un certo senso le costanti possono essere pensate come dellefunzioni che non hanno argomenti (anche se vedremo che ricorrendo alla generazione di numeripseudo-casuali è possibile utilizzare Mathematica per costruire delle funzioni senza argomenti che nonrealizzano delle costanti). Nel seguito vedremo un breve elenco che illustra come Mathematica possacalcolare alcune tra le funzioni matematiche più semplici. In realtà il sistema implementa un numerodecisamente più elevato di funzioni, di complessità anche elevata, che noi non tratteremo. Il lettoreinteressato ad approfondire questo argomento può consultare The Mathematica Book di StevenWolfram.

1.5.1. Funzioni logaritmiche ed esponenziali

La funzione Log[x] indica il logaritmo naturale di x:

In[7]:= Log@E^4DOut[7]= 4

Se la funzione Log viene chiamata usando due argomenti, allora il primo rappresenta la base dellogaritmo e il secondo il suo argomento:

In[9]:= Log@2, 8DOut[9]= 3

In[93]:= Log@10, 1000000DOut[93]= 6

E' anche disponibile la funzione esponenziale Exp[x], nonostante in fase di valutazione vengadirettamente convertita in ‰^x:

In[94]:= Exp@2DOut[94]= ‰2

cap0.nb 9

1.5.2. Radicali

La funzione Sqrt determina le radici di un numero. In particolare, se usata con un solo argomento necalcola la radice quadrata

In[95]:= Sqrt@16DOut[95]= 4

Il calcolo di radici di altro tipo viene effettuato tenuto conto del fatto che è!!!!

xb

=x1êb . Ad esempio èpossibile calcolare la radice cubica di 8 come

In[98]:= 8^H1 ê 3LOut[98]= 2

Mathematica mette a disposizione un simbolo grafico per indicare in forma tradizionale le radici.Quando un'espressione che lo contiene viene valutata, il simbolo viene convertito nelle espressionisopra indicate, come possiamo verificare utilizzando la funzione InputForm (di cui vedremo tra breve ilsignificato):

In[99]:= InputFormAè!!!x EOut[99]//InputForm=

Sqrt[x]

In[100]:= InputFormAè!!!xb EOut[100]//InputForm=

x^b^(-1)

Attenzione! Non fatevi ingannare da quest'ultima espressione, che va letta come x^(b^(-1)) a causa delle regole di

precedenza nella valutazione degli operatori. Per convincervene, provate per esercizio a valutare separatamente, ad esempio, le

espressioni 8^(1/3), 8^3^(-1) e (8^3)^(-1).

1.5.3. Funzioni trigonometriche

Le funzioni Sin, Cos e calcolano rispettivamente il seno, il coseno e la tangente del loro argomento

10 cap0.nb

In[104]:= Sin@Pi ê4DOut[104]=

1ÅÅÅÅÅÅÅÅÅè!!!2

In[105]:= Cos@Pi ê3DOut[105]=

1ÅÅÅÅ2

Mathematica implementa direttamente anche altre funzioni trigonometriche esprimibili in termini diseno e coseno; ad esempio la funzione Tan calcola la tangente dell'argomento che le viene passato:

In[108]:= Tan@Pi ê3DOut[108]=

è!!!3Mathematica semplifica ove possibile le espressioni trigonometriche:

In[112]:= Sin@xD êCos@xDOut[112]= Tan@xDInoltre sono implementate le funzioni trigonometriche inverse ed esponenziali:

ArcSin e ArcCos calcolano rispettivamente l'inverso delle funzioni seno e coseno

In[118]:= ArcSin@1DOut[118]=

pÅÅÅÅ2

In[123]:= ArcCos@Sqrt@2D ê2DOut[123]=

pÅÅÅÅ4

Sinh e Cosh calcolano rispettivamente il seno e coseno iperbolici, mentre ArcSinh e ArcCoshindicano le corrispondenti funzioni inverse:

cap0.nb 11

In[136]:= Sinh@0DOut[136]= 0

In[138]:= Cosh@0DOut[138]= 1

1.5.4. Altre funzioni

Le funzioni Abs e Sign ritornano rispettivamente il valore assoluto e il segno di un numero (cioé -1o 1 a seconda che il rispettivo argomento sia o meno negativo)

In[14]:= Abs@4DOut[14]= 4

In[15]:= Abs@-4DOut[15]= 4

In[16]:= Sign@4DOut[16]= 1

In[17]:= Sign@-4DOut[17]= -1

Attenzione! Le funzioni Abs e Sign assumono un significato differente quando i loro argomenti sono numeri complessi. In

questo caso Abs[z] corrisponde al modulo di z e Sign[z] è uguale a z/Abs[z].

In[13]:= Sign@3 - IDOut[13]=

3 - ÂÅÅÅÅÅÅÅÅÅÅÅÅè!!!!!!10

12 cap0.nb

La funzione Round arrotonda il suo argomento all'intero più vicino

In[18]:= [email protected][18]= 3

In[19]:= [email protected][19]= 4

Le funzioni IntegerPart e FractionalPart ritornano rispettivamente le parti intera e frazionariadi un numero reale

In[26]:= [email protected][26]= 4

In[27]:= [email protected][27]= 0.2

In[28]:= [email protected][28]= -4

In[29]:= [email protected][29]= -0.2

Attenzione! Se l'argomento di FractionalPart è un numero irrazionale espresso in forma esatta, il risultato sarà anch'esso

espresso in questa forma.

In[30]:= FractionalPart@PiDOut[30]= -3 + p

La funzione Floor ritorna il più grande intero minore o uguale dell'argomento specificato;analogamente, la funzione Ceiling ritorna il più piccolo intero maggiore o ugualedell'argomento specificato

cap0.nb 13

In[31]:= Floor@PiDOut[31]= 3

In[32]:= Ceiling@PiDOut[32]= 4

In[33]:= Floor@-PiDOut[33]= -4

In[34]:= Ceiling@-PiDOut[34]= -3

Le funzioni Quotient e Mod ritornano rispettivamente il quoziente e il resto della divisione intera trail primo e il secondo argomento specificato

In[35]:= Quotient@10, 4DOut[35]= 2

In[36]:= Mod@10, 4DOut[36]= 2

1.6. Notazioni di presentazione degli argomenti

La notazione tipicamente utilizzata per calcolare una funzione viene indicata in una notazione prefissain cui il nome della funzione precede gli argomenti, delimitati in modo opportuno (da parentesi tondenell'usuale notazione matematica, da parentesi quadre nella sintassi di Mathematica in forma input ostandard). In realtà è possibile fare riferimento ad altre modalità:

una notazione postfissa, utilizzabile con funzioni che hanno un solo argomento. In questo casoviene specificato prima l'argomento, poi due caratteri di barra capovolta o backslash (\\) einfine il nome della funzione

14 cap0.nb

In[224]:= x êê Log

Out[224]= Log@xDquesto tipo di notazione risulta indicata per scrivere velocemente un'espressione, quando non si

vuole appesantire un'espressione già complessa con un'ulteriore coppia di parentesi quadre, oquando si vuole modificare una cella di input usandone il contenuto come unico argomento diqualche funzione. In quest'ultimo caso è sufficiente aggiungere in coda all'espressione il doppiobackslash e il nome della funzione;

una notazione infissa, utilizzabile con funzioni che hanno due argomenti. In questo caso vienespecificato innanzitutto il primo argomento, seguito da un carattere di tilde (~), dal nome dellafunzione, da un ulteriore carattere di tilde e dal secondo argomento

In[228]:= 10 ~ Log ~ 1000

Out[228]= 3

una forma alternativa della notazione prefissa per funzioni con un solo argomento, in cui siindicano semplicemente il nome della funzione e l'argomento separandoli tramite un carattere di"at" (@)

In[231]:= Logüx

Out[231]= Log@xDquesto tipo di forma permette di scrivere velocemente un'espressione, eliminando il bisogno delle

parentesi quadre.

In generale queste notazioni e le relative abbreviazioni sono state introdotte per rendere più agevolel'inserimento di espressioni in una cella. In realtà è necessario, di volta in volta, decidere se utilizzarleo meno anche tenendo conto della misura in cui il loro utilizzo possa andare a migliorare o peggiorarela leggibilità delle stesse espressioni.

1.7. Forme di visualizzazione dei dati

Consideriamo l'espressione I^Cos[x], indicante cioé il numero complesso ottenuto elevando l'unitàimmaginaria al coseno di x. Tale espressione è espressa utilizzando le regole sintattiche diMathematica (quelle che stiamo gradualmente imparando), le quali si basano su due caratteristicheimportanti:

permettono di descrivere una qualunque espressione matematica in modo non ambiguo;

possono essere descritte utilizzando esclusivamente una descrizione puramente testuale (nelsenso che il contenuto che esse esprimono è espresso dai caratteri utilizzati e non dal loro stile).

cap0.nb 15

Le espressioni indicate utilizzando questa sintassi vengono dette espressioni in Input Form (o formadi input); Mathematica implementa la funzione InputForm per convertire espressioni in questa forma:

In[198]:= I^Cos@xD êê InputForm

Out[198]//InputForm=

I^Cos[x]

Nonostante la forma di input rappresenti un'interfaccia tramite cui inserire velocemente espressionimatematiche all'interno di un notebook, la sua lettura può risultare difficile soprattutto quando non sene conosce bene la sintassi. Mathematica è però in grado di esprimere i dati utilizzando altre forme,tant'è che se proviamo a valutare I+Log[x] otteniamo

In[199]:= I^Cos@xDOut[199]= ÂCos@xDe quindi una cella di output in cui la seconda delle caratteristiche sopra indicate non è più soddisfatta:in questo caso infatti

l'unità immaginaria è indicata non più tramite la lettera I (che in particolare, essendo una "I"maiuscola rappresenta un carattere ben preciso), bensì tramite il simbolo  ottenuto applicandouno stile ben preciso (quello che Mathematica indica come il font di tipo Double Struck) alcarattere i;

l'operazione di elevamento a potenza viene indicata non più dal carattere ^ ma scrivendol'esponente come apice della alla base.

Attenzione! Non fatevi ingannare dal fatto che fino ad ora abbiamo indicato l'unità immaginaria utilizzando in ogni caso uno stile

differente (e cioé applicando alla lettera maiuscola "I" il font di tipo Courier): questo è dovuto al fatto che tutti i caratteri di

un'espressione in forma di input sono indicati con questo stile, in modo che queste espressioni risultino visualmente differenziate dal

testo.

Mathematica utilizza quindi una seconda forma di presentazione dei dati (tipicamente per le celle dioutput), detta Standard Form o forma standard, in cui mantiene l'univocità della descrizione ma, permigliorare la leggibilità, utilizza in alcuni casi la formattazione del testo per indicare un significatoparticolare: ad esempio per indicare alcune costanti (come I ed E, che vengono rispettivamentetrasformate in  ed ‰) o alcune operazioni (come l'estrazione di radice o l'elevamento a potenza) chevengono indicate nell'usuale modo tipografico.

La funzione StandardForm permette di convertire un'espressione in forma standard

16 cap0.nb

In[200]:= I^Cos@xD êê StandardForm

Out[200]//StandardForm=

ÂCos@xDSiccome la forma standard mantiene il requisito di descrivere un'espressione in modo univoco, èpossibile utilizzarla per inserire input in una cella

In[197]:= !2 !3

Out[197]= !5

Mathematica implementa un'ulteriore forma, detta Traditional Form o forma tradizionale, in cui i dativengono presentati in modo molto simile all'usuale notazione matematica: ad esempio le funzionivengono indicate utlizzando caratteri minuscoli, le variabili utilizzando lo stile corsivo e gli argomenti diuna funzione sono delimitati da parentesi tonde e non quadre. La funzione TraditionalForm permettedi esprimere un'espressione in forma tradizionale, evidenziata anche da una linea verticale a zig-zagnel corrispondente delimitatore di cella:

In[201]:= I^Cos@xD êê TraditionalForm

Out[201]//TraditionalForm=

ÂcosHxLVa notato come la notazione in forma tradizionale possa risultare ambigua da interpretare. Adesempio l'espressione a(x+1) può indicare sia il valore che la funzione a assume in corrispondenzadell'argomento x+1 che il prodotto tra i fattori a e x+1.

In[212]:= a@x + 1D êê TraditionalForm

Out[212]//TraditionalForm=

aHx + 1LIn[213]:= a Hx + 1L êê TraditionalForm

Out[213]//TraditionalForm=

a Hx + 1LAttenzione! E' possibile modificare la forma di presentazione di una cella anche selezionandone il corrispondente delimitatore e

scegliendo una delle voci del menù Cell/ConvertTo.

cap0.nb 17

Tenuto conto di questo, Mathematica implementa input e standard form in modo da risultare il piùpossibile consistente. Il lettore interessato ad approfondire questo concetto può fare riferimento aiprimi capitoli del libro Exploring Mathematics with Mathematica, di John Glynn e Theodore Gray.

Mathematica implementa in realtà anche altre forme di rappresentazione dei dati: alcune, comeMatrixForm o Short, verranno introdotte nel seguito quando si renderanno necessarie; altre, comeTeXForm, non verranno introdotte. Il lettore interessato ad approfondire questo argomento puòconsultare il manuale in linea.

1.8. Approssimazione di numeri

Quando si prova a calcolare il logaritmo naturale di 8 si ottiene

In[10]:= Log@8DOut[10]= Log@8Dl'output è esattamente uguale all'input, perché il logaritmo naturale di 8 non è né un numero relativo néun numero razionale, ma un numero reale non esprimibile in forma esatta se non come il logaritmonaturale di 8. Per visualizzare questo numero in forma approssimata possiamo

indicare il suo argomento in forma approssimata, aggiungendovi il punto decimale:

In[38]:= [email protected][38]= 2.07944

inserirlo in un'espressione matematica in cui compaia almeno un numero in forma approssimata:

In[40]:= Log@8D + 0.0

Out[40]= 2.07944

Utilizzare la funzione N che, avuto come argomento un numero, calcola il suo valore approssimato:

In[36]:= N@Log@8DDOut[36]= 2.07944

Utilizzando la funzione N è possibile calcolare approssimazioni molto precise: infatti è possibile fornireun secondo argomento che permette di specificare il numero di cifre significative da indicarenell'approssimazione

18 cap0.nb

In[89]:= N@Log@8D, 100DOut[89]= 2.07944154167983592825169636437452970422650040308076576236204002848018086Ö

5909084146817589980989256063

In questo modo è ad esempio possibile scrivere approssimazioni molto accurate di p, ad esempio finoalla centesima cifra:

In[90]:= N@p, 100DOut[90]= 3.14159265358979323846264338327950288419716939937510582097494459230781640Ö

6286208998628034825342117068

o alla millesima

In[91]:= N@p, 1000DOut[91]= 3.14159265358979323846264338327950288419716939937510582097494459230781640Ö

628620899862803482534211706798214808651328230664709384460955058223172535Ö940812848111745028410270193852110555964462294895493038196442881097566593Ö344612847564823378678316527120190914564856692346034861045432664821339360Ö726024914127372458700660631558817488152092096282925409171536436789259036Ö001133053054882046652138414695194151160943305727036575959195309218611738Ö193261179310511854807446237996274956735188575272489122793818301194912983Ö367336244065664308602139494639522473719070217986094370277053921717629317Ö675238467481846766940513200056812714526356082778577134275778960917363717Ö872146844090122495343014654958537105079227968925892354201995611212902196Ö086403441815981362977477130996051870721134999999837297804995105973173281Ö609631859502445945534690830264252230825334468503526193118817101000313783Ö875288658753320838142061717766914730359825349042875546873115956286388235Ö3787593751957781857780532171226806613001927876611195909216420199

Attenzione! Nel caso vi facciate prendere la mano, può capitare che chiediate a Mathematica di effettuare delle computazioni che

richiedono un tempo troppo elevato per essere portate a termine. In casi come queste potete terminare in anticipo la computazione

utilizzando la voce di menù Kernel/Abort Evaluation, o la combinazione di tasti CTRL-.

Le funzioni possono venire specificate, oltre che nella modalità seguita finora (detta forma prefissa, inquanto il nome della funzione viene specificato prima dei suoi argomenti), anche in altre forme. Inparticolare è disponibile una forma postfissa per le funzioni che hanno un solo argomento, checonsiste nello specificare prima l'argomento stesso, seguito da un doppio slash (//) e dal nome dellafunzione. In altre parole

cap0.nb 19

In[92]:= p êê N

Out[92]= 3.14159

ha lo stesso effetto di N[p].

Questa forma risulta spesso utile per migliorare la leggibilità di formule molto lunghe in quanto evita didover specificare un ulteriore coppia di parentesi quadre.

1.9. Espressioni

Un'espressione di Mathematica è definita nel seguente modo:

una costante (compreso un numero, in forma esatta o approssimata) è un'espressione;

se f è una funzione con un argomento e x è un'espressione che rappresenta un argomento validoper f, allora f[x] è un'espressione. Analogamente, se g è una funzione con n argomenti e x1,..., xn sono n espressioni che rappresentano argomenti validi per g (nel senso che x1 èun'espressione che può rappresentare il primo argomento di g, x2 è un'espressione che puòrappresentare il suo secondo argomento e così via), allora g[x1,...,xn] è un'espressione.

L'ultimo dei due punti precedenti si estende facilmente al caso di operatori cioé funzioni, come lasomma, che vengono tipicamente utilizzati tramite una notazione prefissa o infissa, in cui il simboloche descrive l'operatore viene inserito in una posizione particolare e gli argomenti non vengonodelimitati tramite parentesi. Limitandosi agli operatori unari e binari (aventi cioé uno o due argomenti):

se U è un operatore unario e x è un'espressione che può essere considerata un argomento validoper U, allora Ux è un'espressione: ad esempio -x è un'espressione valida, dove x è un numero e- indica l'operatore unario di negazione;

se B è un operatore binario e x ed y sono due espressioni che possono essere considerateargomenti validi per B, allora xBy è un'espressione; ad esempio se x ed y sono due numeri e +indica la somma, allora x+y è un'espressione valida.

Merita maggiore attenzione il concetto di argomento valido: normalmente a ogni dato è associato untipo che ne riassume la natura e le caratteristiche (sono ad esempio tipi diversi i numeri in formaesatta, quelli in forma approssimata, le parole). Ogni funzione è progettata per accettare argomenti diun tipo ben definito, o di un definito insieme di tipi. Ad esempio la funzione Log accetta comeargomenti numeri, in forma esatta o approssimata, ma non avrebbe alcun senso pensare di calcolare illogaritmo della parola "ciao" o della data odierna (e più avanti vedremo come Mathematica possatrattare anche questi tipi di dati).

Attenzione! In realtà Mathematica implementa gli operatori esattamente come se fossero delle funzioni: ad esempio l'espressione

x+y viene convertita in Plus[x,y] prima di venire inviata al kernel, e la stessa conversione viene fatta in senso opposto per i

risultati che il kernel fornisce al notebook.

20 cap0.nb

Quando un'espressione contiene più funzioni innestate (ovvero funzioni in cui almeno un argomento èrappresentato dal valore assunto da un'altra funzione), queste vengono valutate nell'unico modopossibile, cioé partendo da quella più interna a quella più esterna: ad esempio nell'espressione

f@x, g@h@y, zDDDle funzioni verranno valutate nel seguente ordine:

prima verrà valutata h quando y e z sono rispettivamente il suo primo e secondo argomento;

poi verrà valutata g utilizzando questo valore come argomento;

infine verrà valutata f utilizzando questo valore come secondo argomento e x come primoargomento.

Quando invece in un'espressione compaiono più operatori, come ad esempio in x+y/z non è chiaro sedebba prima essere valutato l'operatore di divisione o quello di addizione. Per questo motivo sirendono necessarie delle regole di precedenza che indicano quale debba essere l'ordine divalutazione in casi come questo. Nell'ordine di valutazione implementato da Mathematica le operazioniche abbiamo visto finora sono valutate secondo le usuali regole di precedenza:

fattorialeelevamento a potenzaprodotto e quozientesomma e sottrazione

E' possibile forzare un diverso ordine di valutazione degli operatori utilizzando le parentesi tonde:

In[258]:= x + yê zOut[258]= x +

yÅÅÅÅz

In[259]:= Hx + yL êzOut[259]=

x + yÅÅÅÅÅÅÅÅÅÅÅÅz

1.10. Sostituzioni

Codice la cui forma generale è8prima Ø dopo<indica una sostituzione. L'operatore /. permette di applicare una sostituzione a una qualunqueespressione

cap0.nb 21

In[190]:= a + b^2 + b c ê. 8b Ø 1ê Pi<Out[190]= a +

1ÅÅÅÅÅÅÅp2 +

cÅÅÅÅp

Le sostituzioni sono tipicamente legate al modo in cui Mathematica presenta i risultati di equazioni.

1.11. Variabili

Nella costruzione di modelli matematici complessi risulta utile spezzare una computazione compelssain calcoli relativamente semplici.

aumentare la leggibilità del codice;

generare un risultato una sola volta per riutilizzarlo in molte occasioni;

generare un modello matematico in modo incrementale.

Per potere però utilizzare i risultati di queste computazioni è necessario che questi vengano salvatiuna volta prodotti. Mathematica implementa questa funzionalità ricorrendo al concetto di variabile.Tipicamente le variabili vengono viste come controparte dinamica delle costanti: infatti, mentre unacostante rappresenta un oggetto tramite cui utilizzando un nome simbolico ci si può riferire a un valoreche non varia nel tempo, utilizzando una variabile si utilizza sempre un nome simbolico, ma per riferirsia un valore che può variare nel tempo.

Quindi una variabile è accessibile tramite un nome, scelto dall'utente che la crea. Un nome valido ècostituito da una successione di caratteri di arbitraria lunghezza che non inizi con un numero, tenendoconto che il linguiaggio di Mathematica è case sensitive: un carattere minuscolo e il corrispettivomaiuscolo sono considerati diversi; quindi sono ad esempio nomi validi di variabili variabile,Variabile, VARIABILE, vArIAbiLe, variabile1, unaVariabile e unAltraVariabile. In realtà ,nonostante tutti questi nomi possano essere utilizzati, nella pratica si tiene conte delle cosiddetteregole di stile, in base a cui:

i nomi di una variabile composti da una sola parola sono scritti utilizzando esclusivamente lettereminuscole. Nomi che iniziano con una lettera maiuscola sono riservati per costanti e funzioni giàimplementate in Mathematica;

i nomi di una variabile composti da più parole sono scritti accorpando le varie parole, scritte concaratteri minuscoli ma utilizzando i caratteri maiuscoli per le iniziali di ogni parola. Unicaeccezione è costituita dalla prima parola, che è composta esclusivamente da caratteri minusoli.

Quindi solo il primo e gli ultimi tre tra i nomi sopra elencati rappresentano nomi validi per una variabile.

Il carattere di uguale (=) viene utilizzato per indicare l'operatore di assegnamento che associa unvalore a una variabile. La sua sintassi è la seguente

nomeVariabile = < espressione >

22 cap0.nb

dove nomeVariabile è un nome valido per una variabile e <espressione> è un'espressione valida.Durante l'esecuzione di questa oerazione, l'espressione viene valutata ed il suo risultato vieneassegnato alla variabile. Ad esempio l'assegnamento

In[261]:= a = 4 + 2

Out[261]= 6

ha come esito l'assegnamento di 6 (il risultato di 4+2) alla variabile a. Si noti che il valore assegnato èanche l'output corrispondente dell'operazione. Per verificare che l'assegnamento abbia effettivamenteavuto l'esito voluto possiamo valutare il valore di a:

In[264]:= a

Out[264]= 6

infatti ogni nome di variabile, al pari delle costanti, rappresenta un'espressione valida.

Siccome tipicamente quando un valore viene memorizzato in una variabile non è necessariovisualizzarlo, è possibile inserire un carattere di punto e virgola (;) in coda all'operazione:

In[273]:= a = 4 + 2;

In questo modo l'assegnamento viene eseguito senza generare alcun output. Mathematica può inrealtà generare due tipi diversi di output:

quello che va a comparire nelle celle di output, viene emesso quando valutando una cella questaproduce uno o più risultati. Questo tipo di output viene generato dalla maggior parte delleistruzioni implementate da Mathematica, ovviamente a meno che la relativa visualizzazione nonsia disabilitata tramite l'uso del carattere di punto e virgola; E' importante tenere a mente comequesto tipo di output faccia riferimento a delle informazioni che possono essere memorizzatee/o rielaborate in altre parti del codice.

quello il cui scopo è semplicemente il mostrare nel notebook un messaggio di qualche tipo, chenon viene poi utilizzato per ulteriori computazioni; in altre parole, il concetto di outputtipicamente usato dai programmatori per notificare delle informazioni a un utente. L'outupt diquesto tipo viene generato dall'istruzione Print, il cui argomento è un'espressione che vienevalutata e stampata.

In[93]:= Print@Pi^3Dp3

cap0.nb 23

Vale la pena di notare come l'output di un'istruzione Print, seppur contenuto in una cella di output,non abbia dato origine all'emissione di un'etichetta Out, proprio perché non vi è stata alcunamemorizzazione dell'output stesso.

Per evitare confusione, utilizzeremo la parola output per indicare la prima modalità e la parolamessaggio per indicare la seconda.

Attenzione! Rimarchiamo un'interessante coincidenza: come abbiamo già detto, la maggior parte delle istruzioni di Mathematica

danno origine a un output. Questo significa che alcune istruzioni vengono eseguite senza generare un output. Un esempio di queste

istruzioni è rappresentato appunto da Print, che non produce alcun output ma genera un messaggio. Un altro esempio si può

trovare nella funzione Clear, che vedremo tra poco: questa funzione non produce né output né messaggi.

Una volta assegnato un valore ad una variabile, questa è utilizzabile per eseguire altre computazioni:hanno senso ad esempio le seguenti espressioni

In[279]:= a + 1

Out[279]= 6

In[281]:= Log@aD êê N

Out[281]= 1.60944

In linea con i moderni linguaggi di programmazione, Mathematica mette a disposizione una serie dioperatori che permettono di abbreviare delle operazioni matematiche di uso comune:

l'operatore di autoincremento, indicato da un doppio segno di addizione (++), che applicato a unavariabile ne incrementa il valore di un'unità. Questo operatore può essere utilizzato sia innotazione prefissa che in notazione postfissa. Pertanto sia ++a che a++ equivalgonoall'assegnamento a=a+1, ma avranno un comportamento differente qualora queste istruzionisiano contenute in un'espressione. In particolare, qualora un'espressione contenga un'istruzionedi autoincremento prefisso, questa viene eseguita prima di valutare l'espressione: ad esempio

In[19]:= a = 5;++aê2

Out[20]= 3

In questo caso, la variabile a viene inizializzata al valore 5 e poi viene valutata l'espressione ++a/2.Siccome questa espressione contiene un'autoincremento prefisso, prima il contenuto di a vieneincrementato di un'unità (assumento pertanto il valore 6), e poi viene valutata l'espressione a/2,che appunto vale 3. Per conferma, possiamo verificare quale sia il valore contenuto in a:

24 cap0.nb

In[21]:= a

Out[21]= 6

Quando invece l'espressione contiene un'istruzione di autoincremento postfisso, quest'ultima vieneeseguita solo dopo che l'espressione è stata valutata:

In[22]:= a = 5;a++ ê2

Out[23]=5ÅÅÅÅ2

infatti, dopo l'inizializzazione a 5, viene prima valutata l'espressione a/2 (che appunto vale 5/2) epoi il valore di a viene incrementato, come è facilmente verificabile anche in questo caso:

In[24]:= a

Out[24]= 6

l'operatore di autodecremento, indicato da un doppio segno di differenza (--), utilizzabile nellestesse modalità dell'operatore di autoincremento, che ha come effetto quello di diminuire ilcontenuto di una variabile di un'unità:

In[27]:= a = 5;--a

Out[28]= 4

gli operatori di incremento e decremento (una generalizzazione degli operatori di autoincremento eautodecremento), denotati rispettivamente con += e -=, che permettono di aggiungere osottrarre una data quantità al contenuto di una variabile. In altre parole, a+=x equivale ad a=a+xe a-=x equivale ad a=a-x.

In[1]:= a = 1;a += 2;Print@aD;

3

Infine, è possibile "cancellare" una variabile, come se non le avessimo mai assegnato alcun valore,utilizzando la funzione Clear:

cap0.nb 25

In[29]:= a = 5;Clear@aD

In[31]:= a

Out[31]= a

Attenzione! E' importante ricordare che Mathematica gestisce le variabili dando loro una visibilità globale, nel senso che, una

volta definita, una variabile può essere letta e modificata in qualunque altra parte del notebook, o anche in altri notebook. Nel caso

capiti che in parti diverse del codice scritto compaiano due variabili con scopi differenti ma stesso nome, la modifica del valore di una di

queste si rifletterà anche sull'altra, con potenziali danni sul corretto funzionamento del codice. E' quindi importante sforzarsi di dare

nomi differenti a variabili differenti, tipicamente attribuendo dei nomi che ricordino il significato per cui ogni variabile è utilizzata. In realtà

è possibile, in alcuni casi, fare anche riferimento a variabili di tipo locale, la cui visibilità è ristretta a una ben precisa porzione di

codice su cui avranno anche effetto le modifiche apportate ai suoi contenuti.

1.12. Costruire nuove funzioni

Un'importante funzionalità di Mathematica consiste nella possibilità di estendere il suo linguaggioaggiungendo delle funzioni definite dall'utente. Tale possibilità si basa sull'operatore di valutazioneposticipata :=, la cui sintassi nome:=espressione viene interpretata nel modo seguente: ogni qualvolta nel codice seguente si farà riferimento a nome, verrà valutata espressione. Ad esempio, il codice

In[12]:= multiploPi := n Pi;

definisce multiploPi come valore l'espressione pari a n volte p, dove n è una variabile il cui valore verràvalutato ogni volta che si farà riferimento a multiploPi:

In[12]:= n = 1;multiploPi

Out[13]= p

In[14]:= n = 3;multiploPi

Out[15]= 3 p

In realtà l'utilizzo della variabile n in questo caso è potenzialmente scorretto, in quanto potremmo nonessere sicuri che altre parti di codice non facciano riferimento ad essa, modificando implicitamente ladefinizione di multiploPi. Per evitare inconvenienti di questo tipo e simultaneamente implementarepiù correttamente una funzione come una corrispondenza tra argomenti e valori, Mathematica utilizzala seguente sintassi

26 cap0.nb

funzione@argomento_D := espressione

dove

funzione è il nome scelto per la funzione;

:= rappresenta l'operatore di valutazione posticipata;

espressione rappresenta l'espressione che verrà valutata per produrre il valore della funzione;

argomento è il nome per l'argomento della funzione. Il carattere di underscore (_) sta appunto adindicare che, quando si farà riferimento a questa nuova funzione specificando un argomento, ilvalore di quest'ultimo verrà valutato e inserito all'interno di espressione in corrispondenza diogni occorrenza dell'insieme di caratteri argomento. Solo dopo questa operazione il sistemaprovvederà a valutare espressione e a ritornare un valore.

Quindi la funzione multiploPi può venire implementata più correttamente nel seguente modo:

In[133]:= multiploPi@n_D := n p

e valutata indicando i valori attuali del suo argomento tra parentesi quadre:

In[134]:= multiploPi@1DOut[134]= p

In[135]:= multiploPi@7DOut[135]= 7 p

Attenzione! Se state eseguendo questo notebook, il sistema potrebbe emettere un errore quando valuta la definizione di

multiploPi, se avevate anche valutato le cella a inizio di questa sezione. Infatti in questo caso ilnome multiploPi è già stato associato a un altro valore. Per poter valutare queste ultime cellesarà quindi necessario eliminare l'associazione tramite il comando Clear.

Nel caso una funzione abbia più di un argomento, la sintassi della definizione non cambia, a patto diindicare tutti gli argomenti all'interno delle parentesi quadre separandoli tramite il carattere di virgola:

In[137]:= logAllaEnne@x_, n_D := Log@xD^n

cap0.nb 27

1.13. Vincoli sugli argomenti di una funzione

1.13.1. Argomenti opzionali

E' possibile definire un argomento di una funzione come opzionale, facendo seguire il relativocarattere di underscore dal carattere di due punti (:) e dal valore predefinito da assegnareall'argomento qualora questo non venga specificato:

In[156]:= cosAllaEnne@x_, n_: 2D := Cos@xD^nIn[157]:= cosAllaEnne@x, 3D

Out[157]= Cos@xD3

In[158]:= cosAllaEnne@xDOut[158]= Cos@xD2

1.13.2. Argomenti tipizzati

E' possibile specificare il tipo di un argomento facendo seguire il relativo carattere di underscore daInteger, Real, o Complex, per indicare rispettivamente che l'argomento deve essere di tipo intero,reale o complesso.

Ad esempio possiamo definire la funzione fattoriale solo per argomenti interi:

In[159]:= fattoriale@n_IntegerD := n!

in questo modo la funzione si comporta nel modo usuale quando chiamata con un argomento intero:

In[160]:= fattoriale@3DOut[160]= 6

se invece si utilizza un qualunque numero reale come argomento la funzione rimane non computata,non essendone stato definito il comportamento in questi casi:

28 cap0.nb

In[161]:= fattoriale@PiDOut[161]= fattoriale@pDVa notato come il seguente comportamento della funzione

In[162]:= [email protected][162]= [email protected] in realtà perfettamente consistente, dal momento che 3. è considerato un numero reale.

1.13.3. Argomenti vincolati

E' possibile specificare per gli argomenti di una funzione dei vincoli più complessi di quelli introdottinelle sezioni precedenti, facendo seguire il relativo carattere di underscore dalla sequenza di caratteri/; e da una condizione. Ad esempio la definizione della funzione fattoriale vista nella precedentesezione risulta mal definita se l'argomento, seppure intero, è negativo.

In[172]:= fattoriale@-4DOut[172]= ComplexInfinity

Utilizzando /; è possibile fare in modo che la definizione venga applicata solo in caso di argomentipositivi:

In[168]:= fattoriale2@n_ ê; n > 0D := n!

In[173]:= fattoriale2@4DOut[173]= 24

Nel caso l'argomento fornito sia negativo, la funzione non verrà valutata

In[171]:= fattoriale2@-4DOut[171]= fattoriale2@-4D

cap0.nb 29

Alternativamente l'operatore /; può essere inserito dopo quello di valutazione posticipata, a indicareche l'applicazione di quest'ultimo è condizionata al soddisfacimento di una condizione. Ad esempio lafunzione fattoriale può essere definita come

In[174]:= fattoriale3@n_D := n! ê; n > 0

Naturalmente i vari tipi di vincoli sugli argomenti di una funzione possono essere combinati:

In[177]:= fattoriale4@n_Integer ê; n > 0D := n!

Mathematica mette a disposizione una serie di funzioni booleane (i.e. funzioni che assumono solo ivalori True o False) che possono essere utilizzate per verificare svariate condizioni:

Less Ñ

Greater Ñ

LessEqual Ñ

GreaterEqual Ñ

NumberQ Ñ

NumericQ Ñ

IntegerQ Ñ

EvenQ Ñ

OddQ Ñ

PrimeQ Ñ

Positive Ñ

Negative Ñ

TrueQ Ñ

FreeQ Ñ

AtomQ Ñ

MatchQ Ñ

ValueQ Ñ

Qualora per una funzione siano fatte più definizioni di tipo condizionale, nel momento in cui vienespecificato un argomento, le condizioni sono considerate in ordine cronologico di definizione fino aquando non se ne trova una che risulta verificata dall'argomento, e viene utilizzata la definizionecorrispondente:

In[197]:= f@x_D := 1 ê; x > 0;f@x_D := 2 ê; EvenQ@xD;

In[202]:= f@3DOut[202]= 1

30 cap0.nb

In[203]:= f@2DOut[203]= 1

In[204]:= f@-2DOut[204]= 2

In[205]:= f@-3DOut[205]= f@-3D

1.13.4. Funzioni con un numero variabile di argomenti

E' possibile specificare il comportamento di funzioni che hanno un numero variabile di argomenti,indicando con un doppio carattere di underscore una sequenza di uno o più argomenti e con un triplocarattere di underscore una sequenza di zero o più argomenti: ad esempio la definizione

In[246]:= g@x___, a_, y___, a_, z___D := ag@a___D := 0

implica che la funzione g, calcolata su un qualunque numero di argomenti, ritorna 0 a meno che dueargomenti abbiano lo stesso valore, che in questo caso coincide con il valore ritornato dalla funzione:

In[250]:= g@1, 2, 3, 4, 5, 6DOut[250]= 0

In[251]:= g@1, 2, 3, 4, 6, 6DOut[251]= 6

cap0.nb 31

1.13.5. Pattern

In Mathematica la definizione degli argomenti di una funzione rappresenta il caso particolare delladefinizione di un pattern, cioé del denotatore di un insieme di espressioni. Il carattere di underscoreviene utilizzato per indicare una qualunque espressione, a cui è possibile assegare un nume diriferimento, da far precedere al carattere stesso. Ciò permette di riutilizzare lo stesso pattern

_ una qualunque espressione

_ + _ la somma di due espressioni

_^_ un' espressione elevata a qualunque potenza

x_^n_ un' espressione elevata a qualunque potenza

x^n_ il simbolo x elevato a qualunque potenza

f@n_, n_D la funzione f calcolata su due argomenti identici

1.13.6. Funzioni pure

Consideriamo la seguente definizione di una semplice funzione:

In[39]:= f@x_D := xê2 + 1

La parte essenziale della definizione consiste nel descrivere come l'argomento viene modificato, e ciòè indipendente dal nome che si è scelto per la funzione (avremmo potuto chiamarla g, h odimezzaEAggiungiUno, e il suo comportamento non sarebbe variato) e ancora di più dal nome che siè deciso di dare al suo argomento (x sta infatti ad indicare un valore formale, che verrà di volta in voltarimpiazzato dal valore effettivamente inserito come parametro). Mathematica permette di definire unafunzione specificando solamente questo tipo di informazione essenziale: ad esempio la precedentedefinizione della funzione f è equivalente a

In[42]:= #ê 2 + 1 &

in cui viene definita una funzione pura, in cui cioé non sono specificati nomi per la funzione stessa oper il suo argomento: questo viene indicato dal carattere di cancelletto (#), e la definizione è terminatadal carattere di ampersand (&).

Una funzione pura, una volta definita, può essere usata all'interno di un'espressione: ad esempio

f = # ê2 + 1 &

In questo caso l'assegnamento riguarda l'intera funzione, e quindi permette di salvare la funzionestessa per poterla riutilizzare in futuro. Oppure è possibile valutare la funzione

32 cap0.nb

In[44]:= #ê 2 + 1 &@1DOut[44]=

3ÅÅÅÅ2

In realtà le funzioni pure vengono tipicamente utilizzate come funzioni "usa e getta" da specificarecome argomenti di altre funzioni (cfr. ad esempio con la descrizione di Select o di Sort).

Nel caso si volesse definire una funzione pura con più di un argomento sarà sufficiente indicare ilprimo argomento con #1, il secondo con #2, il terzo con #3 e così via:

In[43]:= #1 ê#2 &@3, 7DOut[43]=

3ÅÅÅÅ7

Attenzione! E' sempre necessario terminare la definizione di una funzione pura utlizzando il carattere di ampersand, che serve

appunto a Mathematica per capire cosa all'interno di un'espressione deve essere interpretato come la descrizione di una funzione e

cosa no. Molti degli errori nel codice che utilizza funzioni pure sono legati all'omissione del carattere di ampersand.

1.14. Opzioni

Nelle precedenti sezioni abbiamo visto come utilizzare degli argomenti opzionali specificando deivalori predefiniti. La soluzione adottata manteneva il carattere di posizionalità degli argomenti: adesempio, nella seguente funzione con quattro argomenti di cui gli ultimi due sono opzionali

In[253]:= f@arg1_, arg2_, arg3_: 1, arg4_: 2D := 8arg1, arg2, arg3, arg4<non è possibile specificare un valore esplicito per il quarto argomento utilizzando nel contempo ilvalore predefinito per il terzo.

Un'altra possibilità di definire argomenti opzionali prescindendo dalla posizionalità degli stessi consistenel fare riferimento ad opzioni aventi un nome prefissato. Tale nome deve essere specificato permodificare l'opzione corrispondente, in modo da permettere di modificare un qualunque sottoinsiemedelle opzioni possibili, indipendentemente dall'ordine in cui vengono indicate.

Per modificare un'opzione è necessario indicare il relativo nome, seguito dal carattere di freccia (Ø) oin alternativa dalla sequenza -> e infine dal valore a cui settare l'opzione. Consideriamo ad esempio lafunzione PrimeQ, che ritorna True se l'argomento passato è un numero primo e False altrimenti.

In[266]:= PrimeQ@5DOut[266]= True

cap0.nb 33

In[276]:= PrimeQ@6DOut[276]= False

Per visualizzare tutte le opzioni di una funzione, unitamente ai corrispondenti valori predefiniti, èpossibile utilizzare la funzione Options:

In[277]:= Options@PrimeQDOut[277]= 8GaussianIntegers Ø False<L'opzione GaussianIntegers permette di verificare la primalità nel modo usuale quando è settata aFalse e rispetto alla scomposizione in fattori complessi aventi parti reale e immaginaria intere quandosettata a True.

In[267]:= PrimeQ@5, GaussianIntegers Ø TrueDOut[267]= False

1.15. Dare un nome alle cose

Come abbiamo visto nelle sezioni precedenti, Mathematica può essere esteso definendo dei nuovioggetti, che assumono la forma di variabili e di funzioni definite dall'utente. In entrambi i casi ènecessario specificare per questi oggetti un nome univoco, che va scelto rispettando l'unica regolaformale di non andare a utilizzare un nome già esistente. L'esito di questa operazione porterebbeinfatti a cancellare l'associazione tra il nome e il significato già esistente in favore di quello nuovo. Inrealtà Mathematica implementa un meccanismo di protezione per i nomi che ne impedisce laridefinizione: se infatti proviamo ad esempio a ridefinire la funzione Tan otteniamo il seguente errore

In[125]:= Tan@x_D := Sin@xD êCos@xD;SetDelayed::write : Tag Tan in Tan@x_D is Protected. More…

che ci avvisa di come il nome Tan sia protetto, e cioé non ridefinibile.

Attenzione! Il meccanismo di protezione è applicato automaticamente a tutti i comandi definiti da Mathematica ma è necessario

invocarlo esplicitamente per applicarlo a nomi di oggetti definiti dall'utente. Per maggiori informazioni fare riferimento alle funzioni

Protect e Unprotect.

Nella pratica si seguono però altre convenzioni nell'attribuzione dei nomi agli oggetti definiti dall'utenteche, nonostante la loro violazione non venga intercettata e segnalata da Mathematica come un errore,contribuiscono a migliorare la leggibilià del codice prodotto. In particolare:

E' opportuno assegnare a una variabile o a una funzione l'esatto nome che avrebbe nel linguaggiomatematico. Questa convenzione, utilizzata per tutte le funzioni implementate in Mathematica,ha il duplice vantaggio di: i) evitare di generare codice ambiguo da interpretare (in alcuni sistemiInt sta a rappresentare la parte intera di un numero, in altri l'operatore di integrazione;Mathematica usa rispettivamente IntegerPart e Integrate), e ii) permettere a un utente chenon conosce il nome esatto di una funzione di reperirlo facilmente conoscendo l'operazionematematiche che essa implementa.

34 cap0.nb

E' opportuno assegnare a una variabile o a una funzione l'esatto nome che avrebbe nel linguaggiomatematico. Questa convenzione, utilizzata per tutte le funzioni implementate in Mathematica,ha il duplice vantaggio di: i) evitare di generare codice ambiguo da interpretare (in alcuni sistemiInt sta a rappresentare la parte intera di un numero, in altri l'operatore di integrazione;Mathematica usa rispettivamente IntegerPart e Integrate), e ii) permettere a un utente chenon conosce il nome esatto di una funzione di reperirlo facilmente conoscendo l'operazionematematiche che essa implementa.

Mathematica è case sensitive, nel senso che riconosce come differenti le versioni in minuscolo e inmaiuscolo di un carattere. In altre parole la parola log è riconosciuta e interpretata in mododiverso dalla parola Log. Per convenzione, tutti i nomi definiti in Mathematica sono compostiaccostando una serie di parole scritte in caratteri minuscoli, a eccezione delle inziali di ognisingola parola (sono nomi definiti in Mathematica ad esempio Pi, E, I, Sqrt, InputForm eFractionalPart). Per rimarcare la differenza tra gli oggetti predefiniti in Mathematica e quelliaggiunti dall'utente, i nomi di questi ultimi seguono le stesse regole, con l'eccezione che inizianosempre con una lettera minuscola (come ad esempio la funzione multiploPi che abbiamodefinito nella sezione precedente).

L'utilizzo di queste regole ha lo svantaggio di generare spesso nomi composti da un elevato numero dicaratteri, che quindi risultano più complessi da immettere tramite la tastiera. Questo inconveniente puòessere evitato usando la funzione di completamento automatico dell'input: scrivendo parzialmente uncomando di Mathematica o il nome di un oggetto definito dall'utente e selezionando la voce di menùInput/Complete Selection (o le combinazioni di tasti Ì-K su Macintosh, ‚-K su Windows e ‡-Ksu Linux), il nome viene completato automaticamente qualora vi sia un solo oggetto che iniziaesattamente nel modo scritto; qualora esistano più alternative, queste vengono visualizzate in una listada cui è possibile scegliere il comando da scrivere. Se infine i caratteri immessi non corrispondono adalcun oggetto correntemente definito in Mathematica, il sistema tenta di interpretare l'input immesso evisualizza un elenco di comandi simili a quanto inserito.

Qualora non si conosca esattamente quale sia il nome di una funzione o di una costante predefinite inMathematica, o quando non si ricordino esattamente quanti e quali argomenti ha una funzione, èpossibile utilizzare il sistema di help on-line per reperire le informazioni mancanti. Utilizzando la vocedi menù Help/Help browser è possibile visualizzare una finestra in cui:

ricercare informazioni relativamente a un oggetto di cui si conosce il nome, scrivendolo inun'apposita area di testo: man mano che il testo viene scritto, automaticamente vienevisualizzata, all'interno di un elenco strutturato, la scelta più simile a quanto digitato. Laselezione di una voce in questo elenco permette di ottenere una descrizione dell'oggettocorrispondente, dei rimandi sia a comandi simili che alla documentazione cartacea e una seriedi esempi di utilizzo;

percorrere l'elenco strutturato alla ricerca di informazioni di un oggetto di cui non si conosce ilnome esatto. La struttura presente permette di consultare, tra le altre cose: degli elenchialfabetici e gerarchici degli oggetti implementati che la digitalizzazione della documentazionecartacea.

cap0.nb 35

Tale strumento di consultazione è anche disponibile su internet collegandosi tramite web browser alsito http://documents.wolfram.com.

E' infine possibile selezionare una serie di caratteri in un notebook e consultare direttamente ladocumentazione utilizzando la voce di menù Help/Find Selected Function (o le combinazioni ditasti Ì-˜-F su Macintosh, ‚-˜-F su Windows e ‡-˜-F su Linux).

1.16. Stringhe

Una stringa è un insieme di caratteri. In Mathematica le stringhe vengono indicate racchiudendole tradoppi apici:

In[11]:= "questa è una stringa"

Out[11]= questa è una stringa

Qualora fosse necessario inserire in una stringa il carattere di doppio apice, è sufficiente farloprecedere dal carattere di backslash (\):

In[14]:= "questa è una stringa contenente il carattere doppio apice H\"L"Out[14]= questa è una stringa contenente il carattere doppio apice H"LQualora fosse invece necessario inserire in una stringa il carattere di backslash, è sufficiente farloprecedere da un altro carattere di backslash (\):

In[13]:= "questa è una stringa contenente il carattere di backslash H\\L"Out[13]= questa è una stringa contenente il carattere di backslash H\LE' essenziale inserire le stringhe entro doppi apici. In caso contrario il contenuto del messaggio verràintrepretato in modo differente. Se ad esempio la stringa precedente venisse inserita senza utilizzare idoppi apici, otterremmo

In[145]:= questa è una stringa

Out[145]= è questa stringa una

in cui le singole parole sono state interpretate come simboli particolari (cfr. la sezione seguente sullevariabili) che sono poi stati visualizzati in ordine alfabetico.

Mathematica implementa, tra le altre, le seguenti funzioni che agiscono su stringhe:

StringLength ritorna la lunghezza di una stringa, cioé il numero di caratteri in essa contenuti

36 cap0.nb

In[280]:= StringLength@"Stringa"DOut[280]= 7

In[281]:= StringLength@""DOut[281]= 0

StringJoin ritorna la stringa ottenuta giustapponendo le stringhe passategli come argomenti (inun numero variabile):

In[283]:= StringJoin@"Questa ", "è ", "una", " stringa"DOut[283]= Questa è una stringa

E' possibile utilizzare la sequenza <> come abbreviazione per StringJoin:

In[284]:= "Una " <> "stringa"

Out[284]= Una stringa

StringTake estrae una parte della stringa passata come primo argomento; il secondo argomentodetermina quale parte estrarre

Formato Esito

StringTake@"stringa", nD Estrae i primi n caratteri

StringTake@"stringa", -nD Estrae gli ultimi n caratteri

StringTake@"stringa", 8n<D Estrae il carattere in posizione n

StringTake@"stringa", 8n, m<D Estrae i caratteri nelle posizioni dalla n alla m

In[290]:= StringTake@"Una stringa", 3DOut[290]= Una

In[291]:= StringTake@"Una stringa", -3DOut[291]= nga

cap0.nb 37

In[293]:= StringTake@"Una stringa", 83, 6<DOut[293]= a st

StringDrop si comporta in modo duale rispetto a StringTake, di cui ha il medesimo formato: isuoi due argomenti rappresentano rispettivamente una stringa e una serie di caratteri daeliminare dalla stringa stessa per determinare il valore da ritornare:

In[294]:= StringDrop@"Una stringa", 3DOut[294]= stringa

In[295]:= StringDrop@"Una stringa", 83, 6<DOut[295]= Unringa

StringReplace effettua delle sostituzioni all'interno di una stringa, passata come primo argomento,sulla base di una o più regole passate come secondo argomento. Una regola ha la formastringaoriginale Ø stringamodificata. Nel caso si vogliano specificare più regole è sufficientesepararle tramite virgole e racchiudere l'intero gruppo in una coppia di parentesi graffe(vedremo in seguito come questa operazione, a cui ci riferiremo come alla creazione di unalista, sia altamente usata in tutti gli aspetti di Mathematica).

In[296]:= StringReplace@"Una stringa", "st" Ø "a"DOut[296]= Una aringa

In[297]:= StringReplace@"abcde", 8"a" Ø "b", "b" Ø "c", "c" Ø "d", "d" Ø "e", "e" Ø "f"<DOut[297]= bcdef

ToUpperCase e ToLowerCase ritornano la versione, rispettivamente formate da soli caratterimaiuscoli e minuscoli, della stringa passata come argomento:

In[10]:= ToUpperCase@"Stringa"DToLowerCase@"Stringa"D

Out[10]= STRINGA

Out[11]= stringa

38 cap0.nb

ToString accetta come argomento un'espressione di cui determina il valore che provvede poi atrasformare in una stringa:

In[17]:= ToString@N@PiDD <> "b"

Out[17]= 3.14159b

1.17. Liste

Una lista rappresenta un insieme di valori. Per fare riferimento a una lista in Mathematica è necessarioindicare i relativi valori separandoli tramite dei caratteri di virgola (,) e delimitando il tutto tramite unacoppia di parentesi graffe:

In[17]:= 86, 5, 4, 3, 2, 1<Out[17]= 86, 5, 4, 3, 2, 1<I valori contenuti in una lista possono avere natura eterogenea

In[18]:= 81.4, Pi, "ciao"<Out[18]= 81.4, p, ciao<Per accedere l'elemento di posto i una lista è sufficiente posporre alla lista stessa il numero i entro unacoppia di doppie parentesi quadre:

In[19]:= 86, 5, 4, 3, 2, 1<@@4DDOut[19]= 3

Sono posizioni valide tutti i numeri interi che vanno da 1 al numero di elementi contenuti nella lista.Qualora si specifichi come posizione un numero maggiore del numero di elementi nella lista, o unnumero non intero, Mathematica emetterà un errore:

In[24]:= 86, 5, 4, 3, 2, 1<@@10DDPart::partw : Part 10 of 86, 5, 4, 3, 2, 1< does not exist. More…

Out[24]= 86, 5, 4, 3, 2, 1<P10T

cap0.nb 39

In[21]:= 86, 5, 4, 3, 2, 1<@@4.2DDPart::pspec : Part specification 4.2` is neither an integer nor a list of integers. More…

Out[21]= 86, 5, 4, 3, 2, 1<P4.2TE' possibile specificare come posizione un numero negativo: in questo caso il conteggio delle posizioniavverrà partendo dall'ultimo elemento e procedendo a ritroso: -1 indica l'ultimo elemento della lista, -2il penultimo e così via:

In[25]:= 86, 5, 4, 3, 2, 1<@@-3DDOut[25]= 3

E' infine possibile specificare 0 come posizione all'interno di una lista. Il risultato sarà Listindipendentemente dalla lista utilizzata:

In[26]:= 86, 5, 4, 3, 2, 1<@@0DDOut[26]= List

In[27]:= 81.4, Pi, "ciao"<@@0DDOut[27]= List

Il motivo di questo comportamento risiede nel modo in cui Mathematica memorizza l'input che gli vienepassato (cfr sezioni successive).

Fino ad ora abbiamo costruito liste in modo estensivo, elencando cioé in modo esplicito tutti glielementi che vi appertenevano. Molto spesso è possibile (e anche più succinto) definire una lista inmodo intensivo, indicando una proprietà che viene soddisfatta da tutti e soli gli elementi della listastessa. Mathematica permette di definire liste utilizzando una variante di questa modalità, tramite lafunzione Table, la cui sintassi è

Table@ < espressione >, < iteratore >Ddove

<iteratore> è una lista di tre elementi di cui il primo rappresenta il nome di una variabile e irimanenti sono espressioni valide; quindi {i,1,10}, {e,2^x,a} e {q,-a,E^4} sono iteratorivalidi, mentre ad esempio {1,2,3} non lo è;

40 cap0.nb

<espressione> è un'espressione valida che tipicamente dipende dalla variabile che comparenell'iteratore.

Gli elementi della lista costruita dalla funzione Table si ottengono nel seguente modo:

la variabile specificata nell'iteratore viene inizializzata al valore di partenza specificato in secondaposizione nell'iteratore stesso;

se il valore della variabile non è superiore al valore finale specificato in terza posizionenell'iteratore, viene valutata l'espressione passata come primo argomento a Table, e il risultatoviene aggiunto alla lista;

il valore della variabile viene incrementato di un'unità e il punto precedente viene nuovamenteeseguito.

Ad esempio

In[139]:= Table@i, 8i, 1, 5<DOut[139]= 81, 2, 3, 4, 5<

In[140]:= Table@2 i, 8i, 1, 5<DOut[140]= 82, 4, 6, 8, 10<

In[141]:= Table@2^i, 8i, 1, 5<DOut[141]= 82, 4, 8, 16, 32<

1.17.1. Forme alternative per gli iteratori

E' possibile fare riferimento alle seguenti forme alternative per definire un iteratore:

Nella forma a quattro elementi, è possibile indicare di quanto incrementare di volta in volta lavariabile. In altre parole la forma {variabile, inizio, fine} inizialmente introdotta equivale a{variabile, inizio, fine, 1}. Ciò permette ad esempio di inserire i numeri pari in una lista in modopiù intuitivo

In[142]:= Table@i, 8i, 2, 10, 2<DOut[142]= 82, 4, 6, 8, 10<o di effettuare conteggi al contrario

cap0.nb 41

In[143]:= Table@i ê2, 8i, 10, 1, -1<DOut[143]= 95, 9

ÅÅÅÅ2 , 4, 7ÅÅÅÅ2 , 3, 5

ÅÅÅÅ2 , 2, 3ÅÅÅÅ2 , 1, 1

ÅÅÅÅ2 =Nella forma a due elementi vengono specificati solamente il nome della variabile e il valore finale. Il

valore iniziale e l'incremento vengono implicitamente settati al valore predefinito 1. Pertantol'iteratore {variabile, fine} equivale a {variabile, 1, fine}, o equivalentemente a {variabile, 1, fine,1}.

In[9]:= Table@i, 8i, 10<DOut[9]= 81, 2, 3, 4, 5, 6, 7, 8, 9, 10<

Nella forma a un elemento si specifica esclusivamente il valore finale. Anche in questo caso ilvalore iniziale e l'incremento sono settati a 1, ma non viene esplicitamente fatto riferimento adalcuna variabile. Tale tipologia di iteratore è utile nella definizione di liste costanti:

In[10]:= Table@1, 810<DOut[10]= 81, 1, 1, 1, 1, 1, 1, 1, 1, 1<

1.17.2. Funzioni per le liste

Length ritorna il numero di elementi della lista passatagli come argomento:

In[26]:= Length@85, 4, 3, 2, 1<DOut[26]= 5

Part è l'equivalente delle doppie parentesi quadre: ritorna parte del contenuto di una lista che gliviene passata come primo argomento. Quando il secondo argomento è un numero, vieneritornato l'elemento nella posizione corrispondente; quando è una lista, vengono ritornati glielementi nelle posizioni specificatevi, a loro volta racchiuse in una lista:

In[18]:= Part@85, 4, 3, 2, 1<, 2DOut[18]= 4

42 cap0.nb

In[21]:= Part@85, 4, 3, 2, 1<, 82, 4<DOut[21]= 84, 2<

come per le doppie parentesi quadre, se una posizione negativa indica che il conteggio va fatto aritroso a partire dall'ultimo elemento della lista.

First e Last ritornano rispettivamente il primo e l'ultimo elemento di una lista

In[19]:= First@85, 4, 3, 2, 1<DLast@85, 4, 3, 2, 1<D

Out[19]= 5

Out[20]= 1

Rest ritorna la lista passata come argomento dopo avervi rimosso il primo elemento:

In[28]:= Rest@85, 4, 3, 2, 1<DOut[28]= 84, 3, 2, 1<Take ritorna i valori di una lista (passata come primo argomento) che occupano posizioni

successive: in particolare, se il secondo argomento è un intero n, verranno ritornati i primi o gliultimi n elementi, a seconda che n sia positivo o negativo:

In[22]:= Take@85, 4, 3, 2, 1<, 2DOut[22]= 85, 4<

se invece il secondo argomento è {n, m}, con n minore o uguale a m, verranno ritornati tutti glielementi dalla m-esima alla n-esima posizione (estremi inclusi)

In[31]:= Take@85, 4, 3, 2, 1<, 82, 4<DOut[31]= 84, 3, 2<Drop elimina da una lista (passata come primo argomento) una o più posizioni (specificate dal

secondo argomento, secondo la stessa codifica usata per Part) e ritorna la lista risultante

cap0.nb 43

In[24]:= Drop@85, 4, 3, 2, 1<, 2DOut[24]= 83, 2, 1<

In[25]:= Drop@85, 4, 3, 2, 1<, 82, 4<DOut[25]= 85, 1<Select determina quali elementi di una lista (passata come primo argomento) verificano un

criterio, specificato come secondo argomento nella forma di una funzione che ritorna True oFalse. Tale funzione può essere una delle funzioni predefinite di Mathematica

In[45]:= Select@81, 2, 3, 4, 5<, EvenQDOut[45]= 82, 4<

In realtà molto spesso è necessario ricorrere dei criteri più sofisticati, che possono essere introdottiesternamente tramite la definizione di una funzione apposita

In[48]:= criterio@x_D := x > 2 && x § 4;Select@81, 2, 3, 4, 5<, criterioD

Out[49]= 83, 4<in alternativa è possibile introdurre i criteri direttamente all'interno di Select, tramite la definizione

di una funzione pura

In[47]:= Select@81, 2, 3, 4, 5<, # > 2 && # § 4 &DOut[47]= 83, 4<Cases funziona in modo analogo a Select, con la differenza che il criterio viene rappresentato

tramite un pattern piuttosto che tramite una funzione booleana:

In[7]:= Cases@82^2, E^4, 1 êx, a, x^Pi, Log@xD, 1 + x^7<, _^_DOut[7]= 9‰4, 1

ÅÅÅÅx , xp =

44 cap0.nb

In[8]:= Cases@82^2, E^4, 1 êx, a, x^Pi, Log@xD, 1 + x^7<, x^_DOut[8]= 9 1

ÅÅÅÅx , xp =Attenzione! Il simbolo 2^2 non fa parte dell'output di Cases, in quanto viene semplificato in 4 prima dell'esecuzione.

Il comportamento di Cases è simile a quello di altre due funzioni: Count e Position, che ritornanorispettivamente il numero e la posizione degli elementi di una lista che combaciano con un datopattern:

In[9]:= Count@82^2, E^4, 1 êx, a, x^Pi, Log@xD, 1 + x^7<, _^_DOut[9]= 3

In[10]:= Position@82^2, E^4, 1êx, a, x^Pi, Log@xD, 1 + x^7<, _^_DOut[10]= 882<, 83<, 85<, 87, 2<<Prepend e Append inseriscono un elemento in testa e in coda ad una lista, rispettivamente

In[13]:= Prepend@81, 2, 3<, 0DOut[13]= 80, 1, 2, 3<

In[14]:= Append@81, 2, 3<, 4DOut[14]= 81, 2, 3, 4<Insert aggiunge un elemento in una lista, specificando la posizione che questo andrà ad

assumere. Delete rimuove da una lista l'elemento in una data posizione. ReplacePart modifical'elemento di una lista in una specifica posizione:

In[15]:= Insert@81, 2, 3, 4<, 2.5, 3DOut[15]= 81, 2, 2.5, 3, 4<

cap0.nb 45

In[16]:= Delete@81, 2, 3, 4<, 3DOut[16]= 81, 2, 4<

In[17]:= ReplacePart@81, 2, 3, 4<, 2.5, 3DOut[17]= 81, 2, 2.5, 4<Join unisce due o più liste:

In[20]:= Join@8a, b, c<, 8d, e, f<DOut[20]= 8a, b, c, d, e, f<Union, Intersection e Complement implementano rispettivamente l'unione, l'intersezione e il

complemento di liste interpretate come se fossero degli insiemi

In[23]:= Union@8a, b, c, d<, 8c, d, e, f<DOut[23]= 8a, b, c, d, e, f<

In[21]:= Intersection@8a, b, c, d<, 8c, d, e, f<DOut[21]= 8c, d<

In[22]:= Complement@81, 2, 3, 4, 5<, 82, 4<DOut[22]= 81, 3, 5<Sort ordina gli elementi di una lista. Nella sua versione standard, i dati vengono arrangiati in

ordine non decrescente

In[24]:= Sort@81, 5, 7, 4, 3, 6<DOut[24]= 81, 3, 4, 5, 6, 7<

è possibile indicare un secondo argomento che specifica un criterio su cui basare l'ordinamento,consistente una funzione di due argomenti che ritorna True se il primo argomento devecomparire prima del secondo.

46 cap0.nb

In[26]:= Sort@81, 5, 7, 4, 3, 6<, #2 < #1 &DOut[26]= 87, 6, 5, 4, 3, 1<1.18. Visualizzazione di liste

Consideriamo la seguente lista

In[456]:= lista = 81, 5, 3, 9, 4, 8<;e analizziamo i possibili modi di elencarne gli elementi. In generale il contenuto di una lista può esserevisualizzato:

in forma estensiva, elencando i suoi elementi tramite l'usuale notazione

In[457]:= lista

Out[457]= 81, 5, 3, 9, 4, 8<in forma tabulare, scrivendo ogni elemento su una riga differente tramite la funzione TableForm

In[270]:= lista êê TableForm

Out[270]//TableForm=

153948

in forma grafica, usando la funzione ListPlot per rappresentare ogni elemento tramite un puntoche ha come ordinata il valore dell'elemento stesso e come ascissa la sua posizione all'internodella lista

cap0.nb 47

In[273]:= ListPlot@listaD

2 3 4 5 6

4

6

8

Out[273]= Ü Graphics Ü

Attenzione! La funzione ListPlot, oltre a produrre e visualizzare un grafico, ritorna il grafico stesso come oggetto (che in

realtà corrisponde a un tipo particolare di lista). E' per questo che in corrispondenza della cella di input è stata prodotta una cella di

output il cui contenuto è - Graphics -. L'uso del carattere di punto e virgola permette di eliminare quest'ultima visualizzazione.

La funzione ListPlot è corredata da un considerevole numero di opzioni:

In[275]:= Options@ListPlotDOut[275]= 9AspectRatio Ø

1ÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅGoldenRatio , Axes Ø Automatic, AxesLabel Ø None,

AxesOrigin Ø Automatic, AxesStyle Ø Automatic, Background Ø Automatic,ColorOutput Ø Automatic, DefaultColor Ø Automatic,DefaultFont ß $DefaultFont, DisplayFunction ß $DisplayFunction,Epilog Ø 8<, FormatType ß $FormatType, Frame Ø False, FrameLabel Ø None,FrameStyle Ø Automatic, FrameTicks Ø Automatic, GridLines Ø None,ImageSize Ø Automatic, PlotJoined Ø False, PlotLabel Ø None,PlotRange Ø Automatic, PlotRegion Ø Automatic, PlotStyle Ø Automatic,Prolog Ø 8<, RotateLabel Ø True, TextStyle ß $TextStyle, Ticks Ø Automatic=

tra queste, l'unica opzione che si riferisce espressamente a ListPlot è PlotJoined, settabile a Trueo False, che permette di decidere se il grafico deve essere fatto congiungendo i punti tra di loro:

48 cap0.nb

In[272]:= ListPlot@lista, PlotJoined Ø TrueD;

2 3 4 5 6

4

6

8

tutte le altre opzioni agiscono sul modo in cui viene prodotto l'oggetto grafico.

1.19. Liste innestate

Una lista può contenere elementi di natura eterogenea: ad esempio la lista

In[31]:= 8Pi, N@PiD, "Pi"<Out[31]= 8p, 3.14159, Pi<contiene il valore esatto di p, il suo valore approssimato e la stringa "Pi" rispettivamente in prima,seconda e terza posizione. Più in generale è possibile costruire liste che annoverino tra i loro elementialtre liste

In[34]:= listaInnestata = 8Pi, N@PiD, "Pi", 81, 2, 3<<;tali liste vengono dette di tipo innestato. I loro elementi vengono acceduti nel modo usuale, tenutoconto del fatto che ora un elemento può essere una lista

In[37]:= listaInnestata@@1DDlistaInnestata@@4DD@@1DDLength@listaInnestata@@4DDD

Out[37]= p

Out[38]= 1

Out[39]= 3

cap0.nb 49

Qualora l'argomento di ListPlot sia una lista composta esclusivamente da liste di due elementi,ognuna di queste liste viene interpretata come la descrizione di un punto nel piano (con l'usualecodifica in cui il primo elemento corrisponde all'ascissa e il secondo all'ordinata).

In[40]:= listaPunti = 883, 1<, 87, 5<, 88, 3<, 89, 9<, 81, 4<, 82, 8<<;ListPlot@listaPunti, PlotJoined Ø TrueD;

4 6 8

4

6

8

Il contenuto di una lista innestata è visualizzabile anche in forma tabulare utilizzando la funzioneTableForm:

In[42]:= listaPunti êê TableForm

Out[42]//TableForm=

3 17 58 39 91 42 8

Questa funzione ha il vantaggio di poter essere utilizzata anche con liste aventi una struttura piùcomplessa di quelle utilizzabili con ListPlot:

In[43]:= listaComplicata = 881, 2, 3, 4<, 8a, b, c, d<, 8A, B, C, D<, 8i, ii, iii, iv<<;listaComplicata êê TableForm

Out[44]//TableForm=

1 2 3 4a b c dA B C Di ii iii iv

50 cap0.nb

in particolare, la visualizzazione prodotta da TableForm è particolarmente significativa con liste a unao due dimensioni o livelli. In realtà Mathematica permette di gestire anche liste con più livelli.

In alcuni casi si rende necessario trasformare una lista innestata in una lista semplice, o più ingenerale di ridurre il numero di livelli di una lista, "fondendo" assieme i livelli superiori. Questaoperazione viene realizzata in Mathematica dalla funzione Flatten, che riduce qualunque listapassatagli a una lista a un solo livello:

In[60]:= Flatten@881, 2, 3<, 8a, b, c<<DOut[60]= 81, 2, 3, a, b, c<

In[64]:= Flatten@888a, b<, 8A, B<<, 88x, y<, 8X, Y<<<DOut[64]= 8a, b, A, B, x, y, X, Y<Nel caso si voglia fondere solo un determinato numero di livelli, è sufficiente specificare tale numerocome secondo argomento

In[65]:= Flatten@888a, b<, 8A, B<<, 88x, y<, 8X, Y<<<, 1DOut[65]= 88a, b<, 8A, B<, 8x, y<, 8X, Y<<1.20. Matrici e vettori

Le liste vengono frequentemente utilizzate per codificarvi dei vettori.

In[47]:= vettore1 = 81, 0, 1<;vettore2 = 81, 1, 0<;

Mathematica predispone una serie di funzioni che agiscono su liste interpretandone il contenuto comese fossero dei vettori:

Dot e Cross implementano rispettivamente i prodotti scalare e vettore. Dot può essere utilizzandoil simbolo di punto (.) in modalità infissa (cioé tra i due operatori)

In[50]:= vettore1.vettore2

Out[50]= 1

cap0.nb 51

In[51]:= Cross@vettore1, vettore2DOut[51]= 8-1, 1, 1<Norm calcola la norma Euclidea di un vettore. Se viene specificato come secondo argomento un

numero p, viene calcolata la p-norma (dove p può essere infinito)

In[52]:= Norm@vettore1DOut[52]=

è!!!2In[58]:= Norm@vettore1, 5D

Out[58]= 21ê5In[59]:= Norm@vettore1, ¶D

Out[59]= 1

Analogamente, liste a due dimensioni possono essere utilizzate per memorizzare delle matrici.Mathematica mette a disposizione la funzione MatrixForm per visualizzare una lista formattandola nelmodo usato tipicamente per indicare le matrici:

In[66]:= matr = 881, 0, 1<, 81, 1, 0<, 80, 0, 1<<;matr êê MatrixForm

Out[67]//MatrixForm=ikjjjjjjj 1 0 11 1 00 0 1

y{zzzzzzzCome per il caso dei vettori, è possibile utilizzare una serie di funzioni specializzate nellamanipolazione di matrici:

Gli operatori di somma e sottrazione sono sovraccaricati in modo da funzionare correttamente conle matrici

52 cap0.nb

In[68]:= matr + matr êê MatrixForm

Out[68]//MatrixForm=ikjjjjjjj 2 0 22 2 00 0 2

y{zzzzzzzanalogamente, l'operatore usato per il prodotto scalare tra vettori può essere utilizzato anche per

moltiplicare tra di loro due matrici

In[70]:= matr.matr êê MatrixForm

Out[70]//MatrixForm=ikjjjjjjj 1 0 22 1 10 0 1

y{zzzzzzze' possibile generare automaticamente le matrici identità di una generica dimensione tramite la

funzione IdentityMatrix

In[79]:= IdentityMatrix@3D êê MatrixForm

Out[79]//MatrixForm=ikjjjjjjj 1 0 00 1 00 0 1

y{zzzzzzzTranspose calcola la trasposta di una matrice

In[72]:= Transpose@matrD êê MatrixForm

Out[72]//MatrixForm=ikjjjjjjj 1 1 00 1 01 0 1

y{zzzzzzzInverse calcola l'inversa di una matrice

In[75]:= matrInv = Inverse@matrD;matrInv êê MatrixForm

Out[76]//MatrixForm=ikjjjjjjj 1 0 -1-1 1 10 0 1

y{zzzzzzz

cap0.nb 53

In[77]:= matr.matrInv êê MatrixForm

Out[77]//MatrixForm=ikjjjjjjj 1 0 00 1 00 0 1

y{zzzzzzzDet calcola il determinante di una matrice

In[80]:= Det@matrDOut[80]= 1

Eigenvalues ritorna una lista contenente gli autovalori della matrice passatagli come argomento.Analogamente Eigenvectors calcola gli autovettori, indicandoli come una lista di vettori (che inultima analisi è una lista di liste di due elementi)

In[85]:= matr1 = 881, 3<, 83, 3<<;Eigenvalues@matr1D

Out[86]= 92 +è!!!!!!10 , 2 -

è!!!!!!10 =In[87]:= Eigenvectors@matr1D

Out[87]= 99-1 +1ÅÅÅÅ3 I2 +

è!!!!!!10 M, 1=, 9-1 +1ÅÅÅÅ3 I2 -

è!!!!!!10 M, 1==1.20.1. Una digressione: opzioni per gli oggetti di tipo Graphics

Abbiamo visto come utilizzando ListPlot sia possibile produrre grafici contenenti punti o lineespezzate. In realtà è possibile utilizzare Mathematica per produrre grafici utilizzando strumenti piùcomplessi. Quali che siano questi strumenti, è possibile specificare delle direttive che modificano ilmodo in cui il grafico viene visualizzato. Ad esempio

PlotRange, che indica quale intervallo degli assi cartesiani debba essere visualizzato. E' possibilespecificare come valore per questa opzione una lista a uno o due livelli. Nel primo caso la listacontiene due valori che indicano quale intervallo visualizzare per l'asse delle ordinate, nelsecondo la lista contiene due liste che indicano quale intervallo visualizzare rispettivamente perl'asse delle ascisse e delle ordinate. E' possibile utilizzare al posto di una di queste liste ilsimbolo Automatic: in questo caso Mathematica determinerà automaticamente quale intervallovisualizzare.

54 cap0.nb

In[129]:= listaPunti = 883, 1<, 87, 5<, 88, 3<, 89, 9<, 81, 4<, 82, 8<<;ListPlot@listaPunti, PlotJoined Ø TrueD;

4 6 8

4

6

8

In[131]:= ListPlot@listaPunti, PlotJoined Ø True, PlotRange Ø 80, 10<D;

4 6 8

2

4

6

8

10

cap0.nb 55

In[132]:= ListPlot@listaPunti, PlotJoined Ø True, PlotRange Ø 880, 10<, Automatic<D;

2 4 6 8 10

4

6

8

In[133]:= ListPlot@listaPunti, PlotJoined Ø True, PlotRange Ø 880, 10<, 80, 8<<D;

2 4 6 8 10

1

2

3

4

5

6

7

8

AxesOrigin permette di specificare in che punto gli assi cartesiani devono incrociarsi. Può infatticapitare (come ad esempio visto in alcuni dei grafici precedenti) che il punto di incrocio siadiverso dall'usuale origine degli assi.

56 cap0.nb

In[134]:= ListPlot@listaPunti, PlotJoined Ø True, AxesOrigin Ø 80, 0<D;

2 4 6 8

2

4

6

8

va notato come in questo caso la modifica di AxesOrigin porta a un grafico in cui una parte degliassi cartesiani non viene visualizzata. Questo è dovuto a una precisa scelta degli sviluppatori diMathematica. Quando si vogliono visualizzare gli assi cartesiani fino al loro punto diintersezione, in casi come questo è necessario modificare anche l'opzione PlotRange:

In[135]:= ListPlot@listaPunti, PlotJoined Ø True,AxesOrigin Ø 80, 0<, PlotRange Ø 880, 9<, 80, 10<<D;

2 4 6 8

2

4

6

8

10

PlotLabel e AxesLabel permettono di specificare eventuali valori con cui etichettare l'interografico e gli assi cartesiani, rispettivamente, inserendo nel secondo caso i due valori in una lista.Nel caso non si volesse specificare l'etichetta per un particolare asse, è sufficiente utilizzare ilvalore None:

cap0.nb 57

In[136]:= ListPlot@listaPunti, PlotJoined Ø True,AxesOrigin Ø 80, 0<, PlotRange Ø 880, 9<, 80, 10<<,AxesLabel Ø 8x, None<, PlotLabel -> "Una sequenza"D;

2 4 6 8x

2

4

6

8

10Una sequenza

Axes e Frame sono opzioni settabili a True o False, che determinano qualora il grafico debbavisualizzare anche gli assi cartesiani e una cornice che lo contorni.

In[137]:= ListPlot@listaPunti, PlotJoined Ø True,PlotLabel -> "Una sequenza", Axes Ø False, Frame Ø TrueD;

2 4 6 8

2

4

6

8

Una sequenza

AspectRatio determina quale sarà il rapporto tra l'altezza e la larghezza del grafico

58 cap0.nb

In[138]:= ListPlot@listaPunti, PlotJoined Ø True, PlotLabel -> "Una sequenza",Axes Ø False, Frame Ø True, AspectRatio Ø 0.4D;

2 4 6 8

2

4

6

8

Una sequenza

il valore predefinito per AspectRatio è 1/GoldenRatio, il che significa che alcuni grafici possonorisultare "schiacciati". Il valore Automatic, corrispondente a 1, permette di generare grafici in cuilarghezza e altezza hanno le stesse unità di misura.

Ticks permette di specificare i punti sugli assi di cui sarà visualizzato il relativo valore. E'necessario indicare una lista contenente due liste, ognuna indicante i valori da visualizzarerispettivamente sull'asse delle ascisse e delle ordinate. Anche in questo caso è possibileutilizzare None o Automatic per indicare che non si vogliono visualizzare valori o che si lascia aMathematica la scelta.

In[139]:= ListPlot@listaPunti, PlotJoined Ø True, AxesLabel Ø 8x, y<,Ticks Ø 881, 3, 5, 7, 9<, 82, 3, 4<<, AxesOrigin Ø 81, 1<D;

3 5 7 9x

2

3

4

y

FrameTicks ha un comportamento analogo a Ticks, ma agisce sui bordi della cornice. Pertanto lasua specificazione comprende quattro liste al posto di due.

cap0.nb 59

In[140]:= ListPlot@listaPunti, PlotJoined Ø True,PlotLabel -> "Una sequenza", Axes Ø False, Frame Ø True,FrameTicks Ø 88Pi, 2 Pi<, Automatic, None, None<D;

p 2 p

2

4

6

8

Una sequenza

Attenzione! I valori specificati in Ticks e FrameTicks possono essere anche numeri reali, come in quest'ultimo esempio.

In alcuni casi queste diretttive vengono usate come valore che modifica l'opzione PlotStyle,racchiudendole tra parentesi graffe nel caso si voglia indicare più di una direttiva. Tra le direttiveutilizzabili per ListPlot, le più frequentemente utilizzate sono

PointSize, che indica quale debba essere il diametro dei punti utilizzati (se non viene attivatal'opzione PlotJoined)

In[141]:= listaPunti = 883, 1<, 87, 5<, 88, 3<, 89, 9<, 81, 4<, 82, 8<<;ListPlot@listaPunti, PlotStyle Ø [email protected];

4 6 8

4

6

8

60 cap0.nb

Attenzione! Il valore specificato per il diametro va espresso come frazione rispetto all'ampiezza complessiva del grafico. E' quindi

opportuno specificare valori molto piccoli.

GrayLevel permette di specificare il colore del grafico all'interno di una scala di grigi,indipendentemente dal fatto che questo sia stato prodotto utilizzando dei punti o una linea. Il suoargomento è un numero tra 0 e 1, dove 0 indica il nero e 1 il bianco.

In[162]:= listaPunti = 883, 1<, 87, 5<, 88, 3<, 89, 9<, 81, 4<, 82, 8<<;ListPlot@listaPunti, PlotStyle Ø [email protected], [email protected]<D;ListPlot@listaPunti, PlotStyle Ø [email protected], PlotJoined Ø TrueD;

4 6 8

4

6

8

4 6 8

4

6

8

RGBColor permette di specificare il colore del grafico indicando le corrispondenti componenti neicolori fondamentali rosso, verde e blu. Questo viene fatto specificando per ognuna componenteun numero tra 0 e 1.

cap0.nb 61

In[165]:= ListPlot@listaPunti, PlotStyle Ø [email protected], 0, 0.5D, PlotJoined Ø TrueD;

4 6 8

4

6

8

Dashing permette di specificare come tratteggiare le linee tracciate. Il suo argomento è una listache indica la lunghezza di segmenti consecutivi: il primo numero indica quanto deve esserelungo il primo segmento, il secondo quanto deve essere lungo il primo spazio, il terzo quantodeve essere lungo il secondo segmento e così via. Quando la lista è terminata si ricomincia autilizzarne il primo valore. Tutti i valori sono indicati rispetto all'ampiezza totale del grafico.

In[182]:= ListPlot@listaPunti, PlotStyle Ø [email protected]<D, PlotJoined Ø TrueD;ListPlot@listaPunti,

PlotStyle Ø [email protected], 0.02, 0.08<D, PlotJoined Ø TrueD;

4 6 8

4

6

8

62 cap0.nb

4 6 8

4

6

8

Thickness permette di specificare lo spessore delle linee tracciate, rispetto all'ampiezza totale delgrafico.

In[185]:= ListPlot@listaPunti, PlotStyle Ø [email protected], PlotJoined Ø TrueD;

4 6 8

4

6

8

1.21. Oggetti di tipo grafico

Mathematica è in grado di generare altri tipi di grafici oltre a insiemi di punti e linee spezzate. Inparticolare è possibile costruire degli oggetti di tipo grafico contenenti una o più istanze dei seguentioggetti fondamentali:

Point[{x,y}] ritorna un punto le cui coordinate sono contenute nella lista usata come argomento.

Line[{{x1,y1},...,{xn,yn}}] ritorna una linea spezzata i cui segmenti sono delimitati dai punticontenuti nella lista usata come argomento; in particolare quando questa lista contiene solo duepunti viene generato un segmento.

Circle[{x,y},r] ritorna un cerchio i cui centro e raggio sono indicati rispettivamente dal primo esecondo argomento usati.

cap0.nb 63

La funzione Graphics trasforma questi oggetti in oggetti grafici visualizzabili tramite Show:

In[207]:= a = Line@880, 1<, 81, 3<, 82, 5<<D;b = Graphics@aD;Show@bD;

Va evidenziato che i grafici generati non includono gli assi cartesiani e fanno riferimento al valorepredefinito di AspectRatio. Quest'ultimo aspetto risulta più evidente quando si visualizza un cerchio:

In[210]:= a = Circle@80, 0<, 1D;b = Graphics@aD;Show@bD;

in questo caso otteniamo qualcosa che ha un aspetto diverso da quello che ci saremmo aspettati:proprio per il fatto che le distanze lungo i due assi cartesiani vengono misurate utilizzando unitàdifferenti, il cerchio appare "schiacciato" in un'ellissi. Per riparare a questo inconveniente è sufficienteimpostare l'opzione AspectRatio al valore Automatic:

64 cap0.nb

In[213]:= a = Circle@80, 0<, 1D;b = Graphics@aD;Show@b, AspectRatio Ø Automatic, Axes Ø TrueD;

-1 -0.5 0.5 1

-1

-0.5

0.5

1

In realtà Mathematica mette a disposizione anche altri tipi fondamentali di oggetti grafici. Fate riferimento al manuale per scoprire quali

sono.

Per generare un grafico contenente più oggetti fondamentali si possono seguire due strade:

generare singolarmente i vari oggetti e poi mostrarli assieme in un'unica chiamata alla funzioneShow:

cap0.nb 65

In[216]:= linea = Graphics@Line@880, 0<, 81, 1<<DD;cerchio = Graphics@Circle@81 ê2, 1 ê2<, 1ê2DD;Show@linea, cerchio, AspectRatio Ø AutomaticD;

generare i vari oggetti tramite la stessa istruzione Graphics, che può accettare come argomentouna lista di oggetti fondamentali:

66 cap0.nb

In[219]:= Show@Graphics@8Line@880, 0<, 81, 1<<D, Circle@81 ê 2, 1ê2<, 1ê 2D<D,AspectRatio Ø AutomaticD;

E' infine possibile generare oggetti specificando valori non predefiniti per l'opzione PlotStyle, anchese in modo differente rispetto a quanto visto per ListPlot: in questo caso è necessario specificare inmodo differente l'argomento passato a Graphics, che ora consterà di una lista contenente i valori perPlotStyle seguiti dall'oggetto o dagli oggetti che si vogliono disegnare

cap0.nb 67

In[228]:= Show@Graphics@[email protected]<D, [email protected], Circle@80, 0<, 1D<D,AspectRatio Ø AutomaticD;

Nel caso si voglia produrre un grafico in cui a oggetti differenti sono associati diversi valori per leopzioni di PlotStyle, è sufficiente utilizzare come argomento di Graphics una lista innestata, i cuielementi sono le singole liste contenenti le opzioni di PlotStyle:

68 cap0.nb

In[234]:= Show@Graphics@88RGBColor@0, 1, 0D, [email protected],Line@880, 0<, 80, 1<, 81 ê2, Sqrt@3D ê 2<, 80, 0<<D<, [email protected]<D,[email protected], Circle@80, 0<, 1D<<D, AspectRatio Ø AutomaticD;

1.22. Visualizzare grafici di quantità continue

Mentre la funzione ListPlot ha lo scopo di tracciare il grafico di un insieme discreto di punti, lafunzione Plot ritorna un oggetto di tipo grafico che approssima il grafico di una funzione continua neisuoi argomenti. Il suo formato è

Plot@espressione, rangeDdove espressione indica un'espressione, che dipende in modo continuo da una variabile simbolica, dicui si vuole disegnare il grafico, e range indica il range della variabile relativamente al grafico stesso,espresso nella forma {variabile, inizio fine}, molto simile a quella di un iteratore.

cap0.nb 69

In[145]:= Plot@x, 8x, 0, 2 Pi<D;

1 2 3 4 5 6

1

2

3

4

5

6

Qualora il primo argomento di Plot sia una lista di espressioni, i relativi grafici vengono visualizzati nelmedesimo oggetto di tipo grafico:

In[147]:= Plot@8x, x^2<, 8x, 0, 2<D;

0.5 1 1.5 2

1

2

3

4

E' necessario porre molta attenzione ai grafici prodotti da Plot. Se ad esempio si prova a visualizzare il

grafico di e-x2tra -5 e 5

70 cap0.nb

In[155]:= Plot@E^H-x^2L, 8x, -5, 5<D;

-4 -2 2 4

0.05

0.1

0.15

0.2

0.25

0.3

si ottiene un grafico troncato nella parte centrale. Questo è dovuto all'algoritmo che Mathematicautilizza per produrre l'output. L'oggetto grafico ritornato da Plot è infatti una linea spezzata ottenutanel seguente modo:

l'intervallo su cui graficare la funzione viene diviso in parti di uguale lunghezza, dove il numero diparti è specificato dal valore dell'opzione PlotPoints. In ogni punto di divisione viene valutatala funzione e viene generata una linea spezzata passante per i punti così ottenuti;

ogni volta che l'angolo tra due parti di linea spezzata successive è maggiore del valore specificatonell'opzione MaxBend, gli intervalli corrispondenti per la variabile indipendente vengono divisi indue e viene riapplicato l'algoritmo; questo algoritmo adattivo viene applicato in modo che unintervallo non venga suddiviso in due per più del numero di volte specificato nell'opzionePlotDivision (per evitare di suddividere all'infinito segmenti al cui interno cade un asintotoverticale).

E' quindi per questo motivo che il grafico sopra visualizzato non è completo: l'algoritmo di suddivisioneha erroneamente inferito che nella parte centrale vi fosse un asintoto. In questo caso è possibilespecificare manualmente un valore per l'opzione PlotRange

cap0.nb 71

In[156]:= Plot@E^H-x^2L, 8x, -5, 5<, PlotRange Ø 80, 1<D;

-4 -2 2 4

0.2

0.4

0.6

0.8

1

in alternativa è possibile specificare un valore abbastanza basso per l'opzione MaxBend

In[178]:= Plot@E^H-x^2L, 8x, -5, 5<, MaxBend Ø .1D;

-4 -2 2 4

0.2

0.4

0.6

0.8

1

E' possibile visualizzare quali sono i punti usati da Plot per campionare la funzione? Intuitivamente larisposta dovrebbe essere sì, a patto di poter estrarre informazioni sulla linea spezzata che approssimail grafico. Se salviamo l'oggetto grafico prodotto e andiamo a guardarne i contenuti otteniamo

72 cap0.nb

In[179]:= graph = Plot@x, 8x, 0, 1<D;Length@graphD

0.2 0.4 0.6 0.8 1

0.2

0.4

0.6

0.8

1

Out[180]= 2

In[181]:= graph@@0DDOut[181]= Graphics

In[182]:= graph@@1DDOut[182]= [email protected] µ10-8, 4.16667 µ 10-8<,80.040567, 0.040567<, 80.0848088, 0.0848088<, 80.126359, 0.126359<,80.166318, 0.166318<, 80.208853, 0.208853<, 80.249795, 0.249795<,80.293313, 0.293313<, 80.335239, 0.335239<, 80.375574, 0.375574<,80.418484, 0.418484<, 80.459802, 0.459802<, 80.499529, 0.499529<,80.541831, 0.541831<, 80.582542, 0.582542<, 80.625827, 0.625827<,80.667521, 0.667521<, 80.707624, 0.707624<, 80.750302, 0.750302<,80.791388, 0.791388<, 80.835049, 0.835049<, 80.877119, 0.877119<,80.917597, 0.917597<, 80.96065, 0.96065<, 81., 1.<<D<<

cap0.nb 73

In[183]:= graph@@2DDOut[183]= 9PlotRange Ø Automatic, AspectRatio Ø

1ÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅGoldenRatio ,

DisplayFunction ß $DisplayFunction, ColorOutput Ø Automatic,Axes Ø Automatic, AxesOrigin Ø Automatic, PlotLabel Ø None,AxesLabel Ø None, Ticks Ø Automatic, GridLines Ø None, Prolog Ø 8<,Epilog Ø 8<, AxesStyle Ø Automatic, Background Ø Automatic,DefaultColor Ø Automatic, DefaultFont ß $DefaultFont,RotateLabel Ø True, Frame Ø False, FrameStyle Ø Automatic,FrameTicks Ø Automatic, FrameLabel Ø None, PlotRegion Ø Automatic,ImageSize Ø Automatic, TextStyle ß $TextStyle, FormatType ß $FormatType=

vediamo come l'oggetto ritornato sia in realtà una lista (rappresentante, come sapevamo, un oggettografico) il cui primo elemento è proprio la linea spezzata che ci interessa, e il cui secondo elemento èun riepilogo delle opzioni grafiche da applicare. Sarà quindi sufficiente estrarre gli argomenti dellafunzione List contenuta nel primo elemento e usare ognuno di essi come argomento di funzioniPoint. La funzione Map ci permette di fare tutto ciò in modo agevole.

In[184]:= plotPoints = Graphics@Join@8AbsolutePointSize@3D<, Map@Point, graph@@1DD@@1DD@@1DD@@1DDDDD;

Show@graph, plotPointsD;

0.2 0.4 0.6 0.8 1

0.2

0.4

0.6

0.8

1

per poter studiare il comportamento di Plot conviene definire una funzione plotWithPoints cheabbia lo stesso formato di Plot ma che visualizzi anche i punti su cui si basa il grafico prodotto:

In[186]:= plotWithPoints@f_, range_D := Block@8graph<,graph = Plot@f, rangeD;points = Graphics@Join@8AbsolutePointSize@3D<, Map@Point, graph@@1DD@@1DD@@1DD@@1DDDDD;

Show@graph, pointsDD

74 cap0.nb

In[187]:= plotWithPoints@x, 8x, 0, 1<D;

0.2 0.4 0.6 0.8 1

0.2

0.4

0.6

0.8

1

0.2 0.4 0.6 0.8 1

0.2

0.4

0.6

0.8

1

Nonostante la funzione assolva allo scopo che ci eravamo prefissi, ha un fastidioso effetto collaterale:quando al suo interno viene chiamata Plot, il grafico corrispondente viene sempre visualizzato. Perevitare la visualizzazione è possibile ridefinire plotWithPoints facendo uso dell'opzioneDisplayFunction, specificabile sia in Plot che in Show: quando questa è settata a Identity l'oggetto ditipo grafico viene prodotto ma non visualizzato, mentre quando è settata a $DisplayFunctionl'oggetto viene anche visualizzato. E' inoltre opportuno permettere la specificazione di altre opzioni:

In[193]:= Clear@plotWithPointsD;plotWithPoints@f_, range_, opts___D := Block@8graph<,

graph = Plot@f, range, opts, DisplayFunction Ø IdentityD;points = Graphics@Join@8AbsolutePointSize@3D<, Map@Point, graph@@1DD@@1DD@@1DD@@1DDDDD;

Show@graph, points, DisplayFunction Ø $DisplayFunctionDD

cap0.nb 75

In[195]:= plotWithPoints@x, 8x, 0, 1<D;

0.2 0.4 0.6 0.8 1

0.2

0.4

0.6

0.8

1

In questo caso il numero di punti iniziali è sufficiente, in quanto graficando una linea retta i vincoli sugliangoli tra segmenti successivi sono automaticamente rispettati. Il grafico non sarebbe cambiato nelcaso avessimo usato un valore basso per PlotPoints:

In[202]:= plotWithPoints@x, 8x, 0, 1<, PlotPoints Ø 3D;

0.2 0.4 0.6 0.8 1

0.2

0.4

0.6

0.8

1

Le cose cambiano se invece si visualizza una funzione non lineare:

76 cap0.nb

In[171]:= plotWithPoints@Sin@xD, 8x, 0, 2 Pi<D;

1 2 3 4 5 6

-1

-0.5

0.5

1

In[200]:= plotWithPoints@Sin@xD, 8x, 0, 2 Pi<, PlotPoints Ø 2D;

1 2 3 4 5 6

-1

-0.5

0.5

1

cap0.nb 77

In[176]:= plotWithPoints@E^H-x^2L, 8x, -5, 5<, MaxBend Ø 100D;

-4 -2 2 4

0.2

0.4

0.6

0.8

1

1.23. Altri grafici di quantità continue

ParametricPlot permette di generare il grafico di una funzione espressa in forma parametrica:

In[246]:= ParametricPlot@8Sin@tD, Cos@tD<,8t, 0, 2 Pi<, AspectRatio Ø 1, PlotPoints Ø 50D;

-1 -0.5 0.5 1

-1

-0.5

0.5

1

Anche in questo caso è necessario fare attenzione a settare opportunamente il valore dell'opzionePlotPoints:

78 cap0.nb

In[266]:= a = ParametricPlot@t 8Sin@tD, Cos@tD<, 8t, 0, 50 Pi<,AspectRatio Ø Automatic, DisplayFunction Ø IdentityD;

b = ParametricPlot@t 8Sin@tD, Cos@tD<, 8t, 0, 50 Pi<,AspectRatio Ø Automatic, PlotPoints Ø 20, DisplayFunction Ø IdentityD;

Show@GraphicsArray@8a, b<DD;

-150-100-50 50 100150

-150

-100

-50

50

100

150

-150-100-50 50 100150

-150

-100

-50

50

100

150

In questo caso abbiamo usato la funzione GraphicsArray che permette di visualizzare più oggettigrafici disponendoli in righe e/o in colonne.

La funzione Plot3D funziona in modo analogo a Plot, con la differenza che permette di graficarefunzioni che dipendono da due argomenti. Anche in questo caso è necessario verificare che l'algoritmodi campionamento che produce il grafico si comporti in modo corretto, modificando i valori perPlotRange e/o PlotPoints nel caso si ottenesse un risultato falsato:

In[248]:= Plot3D@E^H-Hx^2 + y^2LL, 8x, -5, 5<, 8y, -5, 5<D;

-4-2

02

4-4

-2

0

2

4

0

0.002

0.004

-4-2

02

4

cap0.nb 79

In[269]:= Plot3D@E^H-Hx^2 + y^2LL, 8x, -5, 5<, 8y, -5, 5<, PlotRange Ø 80, 1<D;

-4-2

02

4-4

-2

0

2

4

00.20.40.60.81

-4-2

02

4

In[272]:= Plot3D@E^H-Hx^2 + y^2LL, 8x, -5, 5<,8y, -5, 5<, PlotRange Ø 80, 1<, PlotPoints Ø 40D;

-4-2

02

4-4

-2

0

2

4

00.20.40.60.81

-4-2

02

4

ContourPlot e DensityPlot generano grafici contenenti rispettivamente le curve di livello e i valori didensità di una funzione di due variabili:

80 cap0.nb

In[280]:= a = ContourPlot@E^H-Hx^2 + y^2LL,8x, -2, 2<, 8y, -2, 2<, DisplayFunction Ø IdentityD;b = DensityPlot@E^H-Hx^2 + y^2LL, 8x, -2, 2<,8y, -2, 2<, DisplayFunction Ø IdentityD;Show@GraphicsArray@8a, b<DD;

-2 -1 0 1 2-2

-1

0

1

2

-2 -1 0 1 2-2

-1

0

1

2

1.24. Un'altra digressione: la ruota dei colori

Mathematica mette a disposizione, oltre a RGBColor, un'ulteriore funzione che genera un colore. Huepermette infatti di generare colori specificando le corrispondenti componenti nella scala HSB (Hue,Saturation, Brightness) come numeri compresi tra 0 e 1. In particolare il primo di questi valori varia inmodulo 1, nel senso che quando la corrispondente componente vale 0 il colore ritornato fa parte dellascala del rosso e man mano che il valore aumenta, il colore si sposta prima nella scala del verde, poiin quella del blu, per ritornare infine ancora nella scala dei rossi.

La seguente cella utilizza questa informazione per generare la ruota dei colori. In che modo funziona(suggerimento: ricordatevi come funziona il passaggio in coordinate polari)?

In[95]:= stepRho = 100;stepTheta = 700;Show@Graphics@Table@8Hue@theta ê H2 PiL, rho, 1D,

AbsolutePointSize@2D, Point@8rho Cos@thetaD, rho Sin@thetaD<D<,8theta, 0, 2 Pi, 2 Pi ê stepTheta<, 8rho, 0, 1, 1 êstepRho<DD,Axes Ø True, AspectRatio Ø AutomaticD;

1.25. Le parentesi

Per quanto visto finora:

le parentesi tonde delimitano una parte di espressione da valutare senza seguire le regole diprecedenza predefinite per gli operatori matematici;

le parentesi quadre delimitano gli argomenti di una funzione;

le parentesi graffe delimitano il contenuto di una lista;

le doppie parentesi quadre delimitano una precisa posizione all'interno di una lista.

cap0.nb 81

1.26. Programmare con Mathematica

Mathematica implementa le seguenti strutture per la programmazione

If[test, istruzione_true, istruzione_false] realizza la struttura di selezione tra duealternative;

Switch[espressione, valore_1, istruzione_1, ...] realizza la struttura di selezione tra unnumero finito di alternative, basandosi sui possibili valori assunti da un'espressione;

Which[test1, istruzione_1, ...] realizza una struttura di selezione tra un numero finito dialternative;

For[inizio, test, incremento, istruzione] realizza una struttura di iterazione enumerata;

Do[espressione, iteratore] realizza una struttura di iterazione enumerata;

While[test, istruzione] realizza una struttura di iterazione condizionata.

Block[{var_locali}, istruzioni] realizza una procedura con una serie di variabili locali. E'possibile eseguire più iterazioni separandole con il carattere di punto e virgola. L'esito dell'ultimaistruzione senza un carattere di punto e virgola sarà il valore ritornato dalla procedura.

Verificate utilizzando l'help in linea la loro sintassi e la loro semantica e utilizzatele per scrivere deisemplici algoritmi che agiscono sulle strutture di cui abbiamo parlato. Ad esempio, verificate comel'istruzione

In[188]:= Do@ListPlot@Table@Sin@2 Pi êi jD, 8j, 1, 2 Pi, 0.01<DD, 8i, 1, 10, 0.2<D;

100 200 300 400 500

-1

-0.5

0.5

1

dia luogo a un'animazione.

82 cap0.nb

1.27. Importare ed esportare dati

E' possibile importare dati esterni per elaborarli con Mathematica e, analogamente, esportare risultatidi elaborazioni effettuate. Siccome per effettuare queste operazioni è spesso necessario interagire conil file system, è necessario capire dove Mathematica legge e scrive documenti su disco. Come in moltialtri programmi, in assenza di informazioni specifiche viene utilizzata una directory predefinita, il cuinome viene visualizzato quando si esegue la funzione Directory

In[464]:= Directory@DOut[464]= êUsersêmalchiode impostato utilizzando la funzione SetDirectory

In[467]:= SetDirectory@"êUsersêmalchiodêDesktopêDarioêEditoriaêLibriêMathematica"D;Attenzione! Ovviamente le directory indicate nei comandi precedenti fanno riferimento a directory presenti nel computer

dell'autore. Pertanto se eseguite il comando senza modificarne l'argomento otterrete con alta probabilità un messaggio di errore.

Il comando Import legge un file e lo interpreta in termini dell'oggetto di Mathematica più opportuno perdescriverne i contenuti. Se ad esempio nella directory /Users/malchiod/Desktop/Dario/Editoria/Libri/Mathematica è presente un file dal nome prova.csv il cuicontenuto è il seguente

1, 2, 3, 4, 5a, b, c, d, e

in cui ogni riga indica una serie di dati, separati da virgole, che si riferiscono a uno stesso record (einfatti l'estensione CSV indica il formato comma separated values, cioé "valori separati da virgole"),l'esito di Import sarà

In[479]:= Import@"prova.csv"DOut[479]= 881, 2, 3, 4, 5<, 8a, b, c, d, e<<e quindi

ogni riga di input è stata interpretata come l'elemento di una lista;

gli elementi di questa lista sono a loro volte liste che contengono tutti i valori indicati in una datariga.

Nel caso si tentasse di usare Import con un file non esistente nella directory, verrà visualizzato unmessaggio di errore:

cap0.nb 83

In[469]:= Import@"QuestoFileNonEsiste.csv"DImport::nffil : File not found during [email protected], CSVD. More…

Out[469]= $Failed

in realtà in casi come questo Mathematica effettua la ricerca in una serie di directory il cui nome ècontenuto nella variabile $Path:

In[462]:= $Path

Out[462]= 8êApplicationsêMathematica 5.0.appêAddOnsêJLink,êApplicationsêMathematica 5.0.appêAddOnsêNETLink,êUsersêmalchiodêLibraryêMathematicaêKernel,êUsersêmalchiodêLibraryêMathematicaêAutoload,êUsersêmalchiodêLibraryêMathematicaêApplications,êLibraryêMathematicaêKernel, êLibraryêMathematicaêAutoload,êLibraryêMathematicaêApplications, ., êUsersêmalchiod,êApplicationsêMathematica 5.0.appêAddOnsêStandardPackages,êApplicationsêMathematica 5.0.appêAddOnsêStandardPackagesêStartUp,êApplicationsêMathematica 5.0.appêAddOnsêAutoload,êApplicationsêMathematica 5.0.appêAddOnsêApplications,êApplicationsêMathematica 5.0.appêAddOnsêExtraPackages,êApplicationsêMathematica 5.0.appêSystemFilesêGraphicsêPackages,êApplicationsêMathematica 5.0.appêConfigurationêKernel<Attenzione! Anche in questo caso l'output del comando dipende fortemente dal particolare computer su cui è stato eseguito il

notebook.

Import è in grado di riconoscere le estensioni di alcuni formati comuni, oltre a quello CSV. E'comunque possibile specificare un secondo argomento per indicare esplicitamente il formato dautilizzare. In altre parole, l'istruzione

In[470]:= Import@"prova.csv", "CSV"Davrebbe avuto lo stesso esito. E' possibile specificare, tra le altre, le opzioni: EmptyField, che indicacome debba essere intrepretato un dato mancante, FieldSeparator, che indica quale sia il carattereche separa un dato dall'altro, e Numeric, che indica se le quantità lette che indicano un valorenumerico debbano essere convertite o mantenute come stringhe.

Altri formati supportati sono

Lines, che ritorna una lista contenente un elemento per ogni riga del file letto

84 cap0.nb

In[474]:= Import@"prova.csv", "Lines"DOut[474]= 81,2,3,4,5, a,b,c,d,e<nonostante l'output possa sembrare fuorviante, la lista ritornata contiene solo due elementi: lopossiamo evincere dal fatto che questi sono separati da una virgola seguita da uno spazio, oppureprocedendo a un'ispezione diretta

In[475]:= %@@1DDOut[475]= 1,2,3,4,5

List, che ritorna una lista contenente un elemento per ogni parola del file letto

Table, che funziona in modo simile a List, ma ritorna una lista bidimensionale che per ogni rigadel file letto contiene un elemento, che a sua volta è una lista composta da tutte le parolecontenute nella riga.

TSV, che funziona in modo simile a CSV, ma che separa i dati utilizzando il carattere di tabulazioneal posto della virgola.

In realtà Import riconosce anche tipi di dati non necessariamente numerici o simbolici

In[486]:= Import@"mela.gif"DOut[486]= Ü Graphics Ü

In[487]:= Show@%D;

cap0.nb 85

In[489]:= logo = Import@"x.jpg"D;Show@logoD;

L'elenco dei formati riconosciuti è lungo, e comprende formati per il suono, per l'output di particolariprogrammi che manipolano espressioni e dati numerici, e per gestire dati descritti tramite XML. Per unelenco dettagliato fate riferimento al manuale.

Utilizzando la funzione ImportString è infine possibile importare dati non da un file esterno, mainterpretando il contenuto di una stringa

In[496]:= ImportString@"1,2,3,4,5\n6,7,8,9", "CSV"DOut[496]= 881, 2, 3, 4, 5<, 86, 7, 8, 9<<E' altresì possibile effettuare l'operazione inversa di esportazione, cioé esportare il risultato di unacomputazione di Mathematica. In questo caso si utilizzano le funzioni Export ed ExportString, cheseguono lo stesso formato delle corrispondenti funzioni di importazione.

In[498]:= ExportString@Table@i, 8i, 1, 4<, 8j, 1, 2<D, "CSV"DOut[498]= 1,1

2,23,34,4

86 cap0.nb

In[503]:= Export@"prova.jpg", Graphics@Circle@80, 0<, 1DD, "JPG"DOut[503]= prova.jpg

Nel caso si volessero importare in un notebook dei dati che non seguono alcun formato tra quellisupportati, è possibile tentare di trasformarli ad esempio nel formato CSV utilizzando le funzioni disostituzione automatica di un editor di testi avanzato.

E' poi possibile esportare il risultato di una valutazione in formati utilizzabili da altri linguaggi: adesempio TeXForm e CForm producono in output l'esito dell'espressione passata come argomentoespresso in una forma utilizzabile rispettivamente in TEX e in C:

In[518]:= Sqrt@x z + 1êyD êê TeXForm

Out[518]//TeXForm=

{\sqrt{\frac{1}{y} + x\,z}}

In[517]:= Sqrt@x z + 1êyD êê CForm

Out[517]//CForm=

Sqrt(1/y + x*z)

E' infine da segnalare la possibilità di esportare un intero notebook in formato LATEX , HTML eMATHML, utilizzando la voce di menù File/Save As Special.

1.28. Leggere e scrivere su file

Nella sezione precedente abbiamo visto come Mathematica sia in grado di importare ed esportare datiutilizzando vari formati di codifica. Spesso è utile invece poter effettuare delle semplici operazioni dilettura e scrittura su disco, ad esempio per salvare in modo permanente l'esito di un'operazionecomplessa per poi rileggerlo in una sessione successiva. I comandi Get e Put, rispettivamenteabbreviati con le sequenze << e >> permettono di effettuare operzioni di questo tipo. Più precisamente:

>> è un operatore preceduto da un'espressione e seguito dal nome di un file. Quando la cella chelo contiene viene eseguita, l'espressione viene valutata ed il valore ottenuto viene scritto nel file.Il file risiederà nella directory corrente, ed eventuali suoi contenuti verranno cancellati.L'operatore PutAppend, abbreviabile tramite la sequenza >>>, ha lo stesso effetto di >> con lasola differenza che l'output viene scritto in coda a eventuali contenuti del file.

In[505]:= Table@i, 8i, 1, 10<D >> "provoutput"

<< è un operatore seguito dal nome di un file. Quando la cella che lo contiene viene eseguita, ilcontenuto del file viene inserito nella cella stessa al posto dell'operatore e del nome del file, esuccessivamente la cella viene valutata.

cap0.nb 87

In[506]:= << "provoutput"

Out[506]= 81, 2, 3, 4, 5, 6, 7, 8, 9, 10<In[513]:= tabellaLetta = << "provoutput";

tabellaLetta

Out[514]= 81, 2, 3, 4, 5, 6, 7, 8, 9, 10<1.29. Esercizi

1.29.1. Implementare la serie di Fibonacci

In[191]:= fib@n_D := fib@n - 1D + fib@n - 2D;fib@1D = 1;fib@0D = 1;

In[194]:= Trace@fib@3DDOut[194]= 8fib@3D, fib@3 - 1D + fib@3 - 2D,883 - 1, 2<, fib@2D, fib@2 - 1D + fib@2 - 2D, 882 - 1, 1<, fib@1D, 1<,882 - 2, 0<, fib@0D, 1<, 1 + 1, 2<, 883 - 2, 1<, fib@1D, 1<, 2 + 1, 3<

1.29.2. Implementare la sostituzione per la somma di logaritmi

In[91]:= log@x_ y_D := log@xD + log@yD;Trace@log@a b c dDD

Out[92]= 8log@a b c dD, log@aD + log@b c dD,8log@b c dD, log@bD + log@c dD, 8log@c dD, log@cD + log@dD<,log@bD + Hlog@cD + log@dDL, log@bD + log@cD + log@dD<,

log@aD + Hlog@bD + log@cD + log@dDL, log@aD + log@bD + log@cD + log@dD<

88 cap0.nb

1.29.3. Implementare l'algoritmo per le frazioni egiziane

Il problema della scomposizione in frazioni egiziane è il seguente: data una frazione minore di 1,scomporla come la somma di frazioni aventi il numeratore pari a uno. Il seguente approccio porta auna scomposizione di questo tipo: partendo dal numero q, la più grande frazione avente forma 1/mche risulta essere minore o uguale a q è tale che m è il più piccolo intero maggiore di 1/q, che risultaessere Ceiling[1/q]; trovata tale funzione, è sufficiente reiterare il procedimento sulla quantità residuaq-1/m. Verificare come il seguente codice implementi questo approccio

In[203]:= greedyEF@0D := 8<;greedyEF@q_D :=

Prepend@greedyEF@q - 1êCeiling@1 ê qDD, Ceiling@1 êqDD ê; q < 1

In[209]:= greedyEF@2 ê3DOut[209]= 82, 6<quale è il significato del contenuto della lista? Suggerimento: la seguente istruzione verifica che ilrisultato sia corretto

In[210]:= Apply@Plus, 1ê %DOut[210]=

2ÅÅÅÅ3

Verificare il comportamento dell'algoritmo sulle frazioni aventi la forma 1-10^(-i), dove i è un interopositivo da far variare.

1.29.4. Frazioni continue e rapporti aurei

La funzione NestList costruisce una lista nel seguente modo: considera un valore di partenza (ilprimo della lista), e gli applica una funzione ottenendo un valore (il secondo della lista). A questovalore applica nuovamente la funzione, ottenendo un nuovo valore (il terzo della lista) e così via, perun numero di volte determinato:

In[213]:= NestList@f, x, 10DOut[213]= 8x, f@xD, f@f@xDD, f@f@f@xDDD, f@f@f@f@xDDDD, f@f@f@f@f@xDDDDD,

f@f@f@f@f@f@xDDDDDD, f@f@f@f@f@f@f@xDDDDDDD, f@f@f@f@f@f@f@f@xDDDDDDDD,f@f@f@f@f@f@f@f@f@xDDDDDDDDD, f@f@f@f@f@f@f@f@f@f@xDDDDDDDDDD<

cap0.nb 89

Applicando NestList alla funzione 1/(1+x) si ottiene un oggetto matematico chiamato funzionecontinua:

In[214]:= f@x_D := 1ê H1 + xL;NestList@f, x, 6D

Out[215]= 9x, 1ÅÅÅÅÅÅÅÅÅÅÅÅ1 + x , 1

ÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅ1 + 1ÅÅÅÅÅÅÅ1+x

, 1ÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅ1 + 1ÅÅÅÅÅÅÅÅÅÅÅÅ

1+ 1ÅÅÅÅÅÅÅÅ1+x

, 1ÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅ1 + 1ÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅ

1+ 1ÅÅÅÅÅÅÅÅÅÅÅÅÅ1+ 1ÅÅÅÅÅÅÅÅÅ1+x

, 1ÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅ1 + 1ÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅ

1+ 1ÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅ1+ 1ÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅ

1+1

ÅÅÅÅÅÅÅÅÅÅÅÅ1+x

, 1ÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅ1 + 1ÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅ

1+ 1ÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅ1+ 1ÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅ

1+1

ÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅ1+

1ÅÅÅÅÅÅÅÅÅÅÅÅ1+x

=Cosa succede se invece specifichiamo un valore preciso come punto di partenza?

In[216]:= NestList@f, 1, 20DOut[216]= 91, 1

ÅÅÅÅ2 , 2ÅÅÅÅ3 , 3

ÅÅÅÅ5 , 5ÅÅÅÅ8 , 8

ÅÅÅÅÅÅÅ13 , 13ÅÅÅÅÅÅÅ21 , 21

ÅÅÅÅÅÅÅ34 , 34ÅÅÅÅÅÅÅ55 , 55

ÅÅÅÅÅÅÅ89 , 89ÅÅÅÅÅÅÅÅÅÅ144 , 144

ÅÅÅÅÅÅÅÅÅÅ233 ,

233ÅÅÅÅÅÅÅÅÅÅ377 , 377

ÅÅÅÅÅÅÅÅÅÅ610 , 610ÅÅÅÅÅÅÅÅÅÅ987 , 987

ÅÅÅÅÅÅÅÅÅÅÅÅÅ1597 , 1597ÅÅÅÅÅÅÅÅÅÅÅÅÅ2584 , 2584

ÅÅÅÅÅÅÅÅÅÅÅÅÅ4181 , 4181ÅÅÅÅÅÅÅÅÅÅÅÅÅ6765 , 6765

ÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅ10946 , 10946ÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅ17711 =

Considerate la sequenza dei numeratori e dei denominatori delle frazioni: non notate nulla di strano?

Se invece consideriamo la stessa lista in formato approssimato otteniamo

In[217]:= NestList@f, 1, 20D êê N

Out[217]= 81., 0.5, 0.666667, 0.6, 0.625, 0.615385, 0.619048, 0.617647,0.618182, 0.617978, 0.618056, 0.618026, 0.618037, 0.618033,0.618034, 0.618034, 0.618034, 0.618034, 0.618034, 0.618034, 0.618034<

Sembra che la successione definita dagli elementi della lista tenda a un valore limite. Argomentatequesta asserzione nel modo più convincente possibile e tentate di stabilire una connessione tra questolimite e il valore della costante

In[219]:= GoldenRatio êê N

Out[219]= 1.61803

90 cap0.nb