Daniele Lupo Appunti di Mathematica
Programmazione
Introduzione
Come potete vedere e avete visto finora, Mathematica dispone di potentissimi comandi che permettono di eseguire operazioni e calcoli che richiederebbero un tempo notevole per poter essere eseguiti in qualsiasi altro modo (a me conosciuto). Soprattutto i comandi per il calcolo simbolico sono molto potenti, e permettono di poter effettuare cose che per esempio, in Fortran non si possono neanche pensare.
Sembra naturale ed ovvio, quindi, disporre di strumenti per poter mettere assieme questi comandi, in modo da poter eseguire una serie di operazioni in maniera automatizzata, esattamente come si tratta per i programmi veri e propri; anzi, Mathematica consiste proprio di un linguaggio di programmazione ad alto livello con comandi molto potenti, come avete anche visto con i vostri occhi e le vostre agili dita sulla tastiera.
Vedremo adesso i concetti base di programmazione in Mathematica, anche se probabilmente sarà una lettura molto veloce per molti di voi, dato che i principi base sono gli stessi per qualsiasi linguaggio di programmazione.
Quello che permette Mathematica, invece, è un controllo più avanzato per quanto riguarda le interfacce visuali, usando entrambi i sistemi Java e .NET. Tuttavia io non so ancora programmare ad oggetti, per cui le interfacce grafiche in Mathematica, come in C++, mi sono oscure. Tuttavia cercherò almeno di introdurvi nel discorso, in modo da poter cercare da soli la vostra strada per raggiungere la meta (miiii, che poetaaaa!!!! da leggere alla Aldo...).
Comandi base
Cominciamo direttamente con un esempio...
Inizio
Print@"Ciao bello!"D
In[1]:= Ciao bello!
Quello che abbiamo ottenuto è l'equivalente in Mathematica del famoso programma "Hello World" che qualsiasi professore di qualsiasi corso di qualsiasi università vi fa il primo giorno... Solo che qua le cose sono decisamente più semplici, dato che non esistono main ed altre cavolatine varie (qualcuno ha detto Basic?). 200
Printed by Mathematica for Students
Daniele Lupo Appunti di Mathematica
Il comando Print, effettivamente, non fa altro che rappresentare il suo argomento sullo schermo; in questo caso, una stringa. Ebbene sì, miei cari allievi pendenti dalle mie labbra: Mathematica permette anche di gestire le stringhe, fra l'altro con la stessa potenza (quasi, va') del calcolo.
D'altronde, essendo un programma di calcolo simbolico, che difficoltà ha nel gestire stringhe che altro non sono se una serie di simboli?
Abbiamo anche visto che le funzioni che possiamo definire in Mathematica possono fare ben più che dare come risultato un mero numero: in effetti, possiamo anche pensarle come le funzioni dei linguaggi di programmazione, che riescono a fare un compito assegnato qualsiasi, ammesso che si riesca a programmarlo... Ma questa è un'altra storia. Consideriamo, per esempio, la seguente funzione: 8t,
esprod@x_, y_, t_, n_IntegerD := FullSimplify@Series@x y, 0, n<DD
In[2]:= +
esprod@x ^ 2 Sqrt@xD, Gamma@xD, x, 3D
In[3]:= è!!! H6 L
è!!!
1 1 + π −
+ +
− 2 2 3/2
EulerGamma x
x x
EulerGamma
Out[3]= 12
x H−2
1
+ − π − +
3
2 2 5/2
EulerGamma x EulerGamma EulerGamma 4 Zeta@3DL x
H6 L
12
1 7/2
2 + π +
2 3
EulerGamma x O@xD
12
La nostra funzione, in questo caso, non restituisce un numeri, ma un'espressione, come potete ben vedere. Possiamo considerarla come un sottoprogramma, come una macro, come quello che volete, insomma. Le funzioni che si definiscono possono contenere un numero arbitrario di funzioni e comandi, diventando dei veri e propri programmi che girano all'interno di Mathematica. Il concetto è proprio questo, ed in questo risiede buona parte della potenza che un utente avanzato riesce a spremere dal programma. Non per niente in giro esiste una guida in inglese di 3400 pagine su come programmare in Mathematica... Brrrrrr.... mi vengono i brividi solo a pensare di aprire un simile libro...
Tranquilli, le cose che faremo qua sono molto, mooolto più semplici (e con questo mi sono dato dell'imbecille).
Cominciamo a vedere i comandi, per scrivere e ricevere dati.
201
Printed by Mathematica for Students
Daniele Lupo Appunti di Mathematica
Input ed output
Abbiamo visto, prima, come importare ed esportare dati da files, in modo semplice e diretto.
Abibamo anche visto, appena sopra, che è possibile dare in pasto ad un programmino opportuni argomenti, e inoltre abbiamo visto come stampare i risultati mediante il comando Print. Tuttavia, in maniera analoga ad altri casi, possiamo anche introdurre dei dati mediante il comando Input:
richiede un valore, esplicitando la richiesta mediante string
Input["String"]
Possiamo eseguire, per esempio, questo comando:
=
a Input@"Inserisci il numero"D
In[4]:= 555
Out[4]= a
In[5]:= 555
Out[5]=
Qua non posso mostrarlo, ma appena eseguiamo il comando, appare una finestra del kernel del programma, dove compare sopra la stringa che abbiamo scritto, e sotto un riquadro dove scrivere il valore desiderato. In questo modo ho introdotto il valore, che è stato assegnato, come avete visto, alla variabile a. Questo è utile quando dobbiamo scrivere funzioni con molti parametri, e magari utilizziamo alcuni solo in situazioni particolari. Tuttavia si tratta sempre di valori che dobbiamo introdurre noi, per cui non è possibile effettuare Input se la funzione deve essere automatizzata, cioè deve essere effettuata senza il nostro intervento, In questo caso bisogna passare tutti gli argomenti necessari, oltre a magari definire prima delle variabili opportune.
Come abbiamo visto, per l'output su schermo possiamo usare il comando Print, oltre che i vari comandi di disegno nel caso ci servano. 202
Printed by Mathematica for Students
Daniele Lupo Appunti di Mathematica
disegno@D := Sequence@
In[6]:= =
n Input@"Inserisci il numero di seni:"D,
Plot@
Evaluate@ 8i,
Table@
D
Sqrt@iD Sin@i xD, n<
D,
8x, 0, 10<,
→
D,
PlotStyle Hue@0.4D <> <>
Print@"Hai disegnato " ToString@nD " seni."D
D Clear@nD
disegno@D;
In[7]:= 2
1 2 4 6 8 10
-1
-2
Hai disegnato 6 seni.
In questo programmino abbiamo visto tutti e tre i metodi: il modo di avere un input al programma, e due output: uno grafico, che si ottiene semplicemente con il comando Plot, e l'altro ottenuto mediante Print.
Possiamo anche scrivere e leggere file che contengano espressioni di Mathematica, se non abbiamo bisogno di importare ed esportare, semplificando la sintassi. Supponiamo che dobbiamo scrivere un'espressione, e di volerla salvare su un file perché, per esempio, dobbiamo uscire con la nostra ragazza, ed al ritorno, se saremo tristi e soli perché ci ha lasciati, possiamo aprire un nuovo file senza dover ricaricare e valutare quello vecchio, continuando da dove ci siamo interrotti:
203
Printed by Mathematica for Students
Daniele Lupo Appunti di Mathematica
legge un file contenente espressioni di Mathematica,
Get: << restituendo il risultato dell'ultima
scrive l'espressione in un file. Possiamo scriverne più di
Put: >> una nello stesso file con la forma Put@ex1, ex2,...., " file "D
accoda l'espressione nel file
PutAppend: >>>
Dicevamo, che avevamo il seguente output:
−
Expand@Hx 6L ^ 7D
In[8]:= −279936 + − + − + − +
2 3 4 5 6 7
326592 x 163296 x 45360 x 7560 x 756 x 42 x x
Out[8]=
Adesso, vogliamo memorizzarlo nel file
>>
% "espanso"
In[9]:=
Questo comando memorizza l'espressione nel file. Vediamo se lo contiene:
!! espanso
In[10]:= -279936 + 326592*x - 163296*x^2 + 45360*x^3 - 7560*x^4 + 756*x^5 -
42*x^6 +
x^7
Abbiamo visto il contenuto del file. Se vogliamo ricaricarlo in memoria, a questo punto basta fare
= <<
espr espanso
In[11]:= −279936 + − + − + − +
2 3 4 5 6 7
326592 x 163296 x 45360 x 7560 x 756 x 42 x x
Out[11]= espr
In[12]:= −279936 + − + − + − +
2 3 4 5 6 7
326592 x 163296 x 45360 x 7560 x 756 x 42 x x
Out[12]=
Come potete vedere, adesso espr contiene l'espressione che avevamo salvato in precedenza. Notate come !! non restituisce l'espressione, ma solo il contenuto del file. Abbiamo comunque bisogno del comando Get per poter leggere il file, interpretarlo e memorizzarlo nella variabile.
A volte, invece, mentre lavoriamo, può capitare di non dover memorizzare tutte le espressioni in una volta, ma a poco a poco. In questo ci viene in aiuto il comando PutAppend:
204
Printed by Mathematica for Students
Daniele Lupo Appunti di Mathematica
ê Hx êê
− −
ExpandAll@Hx 4L ^ 5 2L ^ 7D TraditionalForm
In[13]:=
Out[13]//TraditionalForm= 5
x
ÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅ
ÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅ
ÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅ
ÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅ
ÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅ
ÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅ -
- + - + - + -
7 6 5 4 3 2
x 14 x 84 x 280 x 560 x 672 x 448 x 128
4
20 x
ÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅ
ÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅ
ÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅ
ÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅ
ÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅ
ÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅ
ÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅ +
- + - + - + -
7 6 5 4 3 2
x 14 x 84 x 280 x 560 x 672 x 448 x 128
3
160 x
ÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅ
ÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅ
ÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅ
ÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅ
ÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅ
ÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅ
ÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅ
ÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅ -
- + - + - + -
7 6 5 4 3 2
x 14 x 84 x 280 x 560 x 672 x 448 x 128
2
640 x
ÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅ
ÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅ
ÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅ
ÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅ
ÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅ
ÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅ
ÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅ +
- + - + - + -
7 6 5 4 3 2
Scarica il documento per vederlo tutto.
Scarica il documento per vederlo tutto.
Scarica il documento per vederlo tutto.
Scarica il documento per vederlo tutto.