Scarica il documento per vederlo tutto.
Scarica il documento per vederlo tutto.
Scarica il documento per vederlo tutto.
Scarica il documento per vederlo tutto.
Scarica il documento per vederlo tutto.
Scarica il documento per vederlo tutto.
Scarica il documento per vederlo tutto.
Scarica il documento per vederlo tutto.
Scarica il documento per vederlo tutto.
Scarica il documento per vederlo tutto.
Scarica il documento per vederlo tutto.
Scarica il documento per vederlo tutto.
Scarica il documento per vederlo tutto.
Scarica il documento per vederlo tutto.
Scarica il documento per vederlo tutto.
Scarica il documento per vederlo tutto.
Scarica il documento per vederlo tutto.
vuoi
o PayPal
tutte le volte che vuoi
<div>
Scarica il
</div>Daniele Lupo Appunti di Mathematica
Mathematica Avanzata
ü Introduzione
Quello che abbiamo visto finora, probabilmente servirà ed avanzerà per tutto quello che vi verrà in
mente. Tuttavia, ci sono alcuni aspetti avanzati che è sempre bene conoscere, sia perchè a volte
potranno snellirvi il compito e rendere più semplice la risoluzione di problemi avanzati, sia perchè
vorrete fare i fricchettoni davanti a chi chiederà aiuto a dei guru di Mathematica come voi...
vedremo come vengono effetivamente fatti i conti con il programma, come lavorare con funzioni
pure e generiche, usare variabili locali nei programmi e così via.
Ho detto che il capitolo più lungo era quello della grafica? Mi sbagliavo, sarà questo... E stavolta
non ci sono belle immagini a dimunuire la quantità di testo. Adesso si fa sul serio!!!
Cominciamo, quindi, perchè di carne al fuoco ce ne sarà davvero tanta...
ü Espressioni
Cosa sono
Consideriamo i seguenti
comandi: restituisce l'head dell'espressione
Head[expr] visualizza l'espressione nella forma piena di Mathematica
FullForm[expr]
Vediamo cosa fanno queste funzioni. Consideriamo, per esempio, il seguente comando:
Head@81, 2, 3<D
In[1]:= List
Out[1]=
Quello che ha fatto, apparentemente, è riconoscere il suo argomento come una lista, ma
effettivamente non è così:
− ∗
Head@a b cD
In[2]:= Plus
Out[2]=
A questo punto, le cose si fanno un pochetto più confuse. Cosa significa Plus, considerando fra
l'altro che non compare il segno di addizione nell'espressione?
231
Printed by Mathematica for Students
Daniele Lupo Appunti di Mathematica
Il fatto è che Mathematica tratta tutto quanto viene scritto come combinazione di funzioni: quando
+
scriviamo qualcosa come a b, in realtà il programma interpreta quanto scritto come la funzione
+
allegata a da applicare con argomento a, b. Il comando FullForm permette di vedere meglio ciò:
FullForm@81, 2, 3<D
In[3]:= List@1, 2, 3D
Out[3]//FullForm=
Da qua, possiamo vedere che quando noi scriviamo la lista, l'interprete del kerner di Mathematica
considera le parentesi graffe come la funzione List, avente come argomenti proprio gli elementi che
compongono la lista. Vedete come la funzione List può essere chiamata con un numero arbitrario di
argomenti, ma anche questo lo vedremo più avanti. Naturalmente, se effettuiamo operazioni
multiple, le rispettive funzioni saranno annidate nel modo opportuno:
ê
+ −
FullForm@Sqrt@a b cD f@x, yDD
In[4]:= Times@Power@Plus@a, b, Times@−1, cDD, Rational@1, 2DD,
Out[4]//FullForm= −1DD
Power@f@x, yD,
Come potete vedere, l'espressione viene interpretata da Matematica come funzioni. Da questo deriva
la potenza del programma in effetti. Sebbebe il funzionamento sia complicato, il concetto che sta alla
base è relativamente semplice: considera l'albero delle funzioni, e poi esegue le operazioni
effettuando le opportune sostituzioni nell'albero. Le regole di sostituzione variano a seconda del
comando o della funzione, e, da un albero, ne risulta un altro: di conseguenza, da un input simbolico
ne esce un altro simbolico. Semplice e potente. D'altronde, la potenza del programma sta nella
sofisticazione delle regole di sostituzione. Nell'esempio di sopra, potete anche vedere che la forma
piena tratta nella stessa maniera le funzioni definite e quelle non definite, come la f. Il fatto che non
venga calcolata viene dal fatto che, non essendo definita, non esistono regole per la sua
manipolazione, e Mathematica la lascia come tale.
Head@%D
In[5]:= Times
Out[5]=
A questo punto, si comprende meglio anche il signidicato di Head. Restituisce, in pratica, il nome
della funzione principale dell'espressione, quella che contiene tutte le altre. In questo caso, è appunto
Times, cioè la funzione che moltiplica fra loro i suoi argomenti. Possiamo anche avere una
rappresentazione più esplicita, mediante il seguente comando:
mostra l'espressione con notazione ad albero testuale
TreeForm[expr]
Considerando sempre l'espressione di prima, in questo caso abbiamo:
232
Printed by Mathematica for Students
Daniele Lupo Appunti di Mathematica
ê
+ −
TreeForm@Sqrt@a b cD f@x, yDD
In[6]:= » » » E
TimesA ,
Out[6]//TreeForm= » E
PowerA , Rational@1, 2D
PlusAa, b, Times@−1, cD
» E
» −1E
PowerA ,
f@x, yD
Il comando mostra una rappresentazione in caratteri ASCII dell'albero di parsing dell'espressione.
Questo permette di avere una rappresentazione più chiara della nidificazione delle funzioni.
Inoltre, possiamo vedere come, nell'interpretazione della forma normale in cui scriviamo, in
notazione FullForm, Mathematica sia in grado di riconoscere correttamente le precedenze,
applicando Times prima di Sqrt, per esempio. Questo permette di eeguire correttamente le
espressioni, ed il suo parsing ci evita di dover scrivere esplicitamente queste condizioni standard per
la matematica.
Quando definiamo una funzione, possiamo anche definire il modo in cui deve essere scritta: Una
volta dato il nome alla funzione, possiamo scriverla nei seguenti modi:
f y] notazione standard f y]
[x, [x,
f x notazione prefissa f
@ [x]
x f notazione postfissa f
// [x]
x f y notazione infissa f y]
~ ~ [x,
Possiamo quindi vedere come, una volta definita una funzione, possiamo scriverla in uno dei modi
seguenti. Da questo si vede come possiamo scrivere in maniera differente le funzioni, che
Mathematica interpreta sempre in notazione Standard. Effettivamente, abbiamo già visto i diversi
modi di scrivere una funzione:
881, 83, êê
2<, 4<< MatrixForm
In[7]:= N
J 1 2
Out[7]//MatrixForm= 3 4
corrisponde a: 83,
MatrixForm@881, 2<, 4<<D
In[8]:= J N
1 2
Out[8]//MatrixForm= 3 4 233
Printed by Mathematica for Students
Daniele Lupo Appunti di Mathematica
881, 83,
@
MatrixForm 2<, 4<<
In[9]:= J N
1 2
Out[9]//MatrixForm= 3 4
Questo modo di trattare le espressioni in Mathematica ha un importante aspetto, cioè quello di poter
trattare separatente le sue parti. Consideriamo, per esempio:
81,
=
a 2, 3, 4, 5<
In[10]:= 81, 2, 3, 4, 5<
Out[10]=
Sappiamo come fare per estrarre un elemento dalla lista:
a@@4DD
In[11]:= 4
Out[11]=
Tuttavia, sappiamo ora anche come vengono trattate le liste in Mathematica:
FullForm@aD
In[12]:= List@1, 2, 3, 4, 5D
Out[12]//FullForm=
A questo punto, possiamo dire che le doppie parentesi quadre, che corrispondono al comando Part in
notazione piena, funzionano effettivamente per qualsiasi espressione nella forma che abbiamo visto,
cioè con una funzione ed il numero di argomenti. Il comando estrare e visualizza l'n-simo argomento
della funzione.
Ipotizziamo di avere la seguente somma:
= + + + + +
somma h t q w r p
In[13]:= + + + + +
h p q r t w
Out[13]= FullForm@sommaD
In[14]:= Plus@h, p, q, r, t, wD
Out[14]//FullForm=
Possiamo quindi pensare di usare lo stesso comando, per poter estrarre un generico argomento della
funzione:
somma@@3DD
In[15]:= q
Out[15]= 234
Printed by Mathematica for Students
Daniele Lupo Appunti di Mathematica
E questo è quello che accade. Vedete anche che, nonostante la somma goda della proprietà
commutativa, la funzione abbia comunque gli argomenti ordinati per come li abbiamo scritti. Questo
permette di poter effettuare con facilità queste operazioni anche nelle espressioni: la proprietà
commutativa viene applicata nella definizione della somma. Non è detto che in un qualsiasi funzione
f gli argomenti godano di proprietà commutativa, e quindi è giusto mantenerli ordinati.
Nella stessa maniera, possiamo anche considerare di estrarre parti annidate da più funzioni:
supponiamo di avere un'espressione del tipo:
Hx
= + + +
es t u ^ ^ 2 v x iL
In[16]:= 2
+ i+v x+x
t u
Out[16]= TreeForm@esD
In[17]:= » E
» E
PlusAt,
Out[17]//TreeForm= » » E
PowerAu, PlusAi, , Power@x, 2D
Times@v, xD
Possiamo vedere che, se vogliamo estrarre l'esponente, basta indicare con un opportuno indice quello
che vogliamo. Vediamo che, nel primo livello, l'esponente si trova nella posizione 2: nel secondo
livello, alla posizione 2. Per cui, per estrarlo, possiamo scrivere:
es@@2, 2DD
In[18]:= + + 2
i v x x
Out[18]=
E abbiamo ottenuto l'esponente. Analogamente, potremmo anche sostituirlo. Per esempio, pensiamo
3
di aver sbagliato, e che in realtà sia una cubica, e ci siamo scordati di scrivere w x : a questo punto,
basta fare: +=
es@@2, 2DD w x ^ 3
In[19]:= + + +
2 3
i v x x w x
Out[19]= es
In[20]:= +w
2 3
+ i+v x+x x
t u
Out[20]=
Al posto di andare a modificare l'espressione con il mouse, abbiamo introdotto la modifica
direttamente dal notebook con un opportuno comando. Notate anche come, per brevità, abbia usato
+=, comando assolutamente analogo a quanto compare in C. D'altronde, se avete perso tempo a
programmare in Mathematica dovreste essere a conoscenza di questo simbolo.
235
Printed by Mathematica for Students
Daniele Lupo Appunti di Mathematica
Possiamo usare anche le regole per modificare la struttura delle espressioni. Per esempio, se
volessimo trasformare tutte le somme in moltiplicazioni, basterebbe fare:
ê. →
es Plus Times
In[21]:= 6
i v w x
t u
Out[21]=
Cambiando il nome delle funzioni opportune:
FullForm@%D
In[22]:= Times@t, Power@u, Times@i, v, w, Power@x, 6DDDD
Out[22]//FullForm=
Qua si può vedere meglio come abbiamo effettuato le sostituzioni delle funzioni Plus.
Possiamo anche applicare le altre funzioni tipiche delle liste:
Position@es, xD
In[23]:= 882, 82, 82,
2, 2, 2<, 2, 3, 1<, 2, 4, 2, 1<<
Out[23]=
Indica le posizioni, nella nidificazione, dove compare l'elemento x. Compare tre volte, ed infatti
abbiamo tre liste di indici.
A questo punto, si tratta solo di trovare il problema che può essere risolto efficacemente in questa
maniera. Tuttavia, a me è capitato raramente di dover usare queste notazioni, e soprattutto quando si
trattava di correggere alcuni particolari errori. Probabilmente sono ancora troppo ingnorante per
usarle al mio livello...
Valutazione delle espressioni
Come abbiamo potuto vedere, ci sono un sacco di funzioni in Mathematica, molte più di quanto ve
ne servirebbero... Tutte, però, godono di una proprietà importante, e cioè quella di restituire sempre
il risultato standard. Per esempio, vengono tolte automaticamente le parentesi dalle somme:
Ha Hc
+ + + +
b t aLL
In[24]:= 82 + + + + + + + + + + + + + + +
b c t, 4 b c t, 6 b c t, 8 b c t, 10 b c t<
Out[24]=
Questo funziona, in genere, per tutte le funzioni associative, e comunque per funzioni che godono di
determinate proprietà. Naturalmente (e lo vedremo fra qualche pagina), anche noi siamo in grado di
creare funzioni che sfruttino le medesime proprietà, come quella commutativa.
236
Printed by Mathematica for Students
Daniele Lupo Appunti di Mathematica
Per valutare le espressioni, Mathematica prima valuta e capisce cosa rappresenta l'head principale, e
poi va a valutare, ricorsivamente, i singoli elementi dell'espressione. Per esempio, se scriviamo
qualcosa come:
=
seno Sin;
In[25]:= D
2 2
+
Simplify@Cos@xD seno@xD
In[26]:= 1
Out[26]=
Vediamo come abbia riconosciuto che seno rappresenta Sin, e poi abbia valutato tutto quanto. Per
vedere le sottoespressioni utilizzate nella valutazione, possiamo utilzzare il seguente comando:
restituisce la lista delle sottoespressioni generate
Trace[espr] durante il calcolo dell'espressione
DD
2 2
+
Trace@Simplify@Cos@xD seno@xD
In[27]:= 88888seno, <, <,
D, 2 2
2 +
Sin<, Sin@xD<, Sin@xD Cos@xD Sin@xD
Out[27]= 2
2 +
Simplify@Cos@xD Sin@xD 1<
Come possiamo vedere, prima passa da seno a Sin, applicandolo poi alla corrispondente funzione, e
poi ne calcola il quadrato. Poi fa la somma fra i due addendi, ed applica la semplificazione.
Esattamente la ricorsività che ci aspettavamo dalla valutazione standard.
Possiamo, volendo, anche cambiare la valutazione standard esplicitamente, associando delle
specifiche regole a delle specifiche funzioni: per esempio, in questa espressione:
f@g@xDD
In[28]:= f@g@xDD
Out[28]=
Vediamo che, dalla natura ricorsiva, prima viene applicata la g, con le sue regole e definizioni, e poi
la f . Se creiamo delle regole per questo particolare pattern, possiamo associarle in modo distinto alle
due funzioni:
ê:
f f@g@x_DD := regolaf@xD
In[29]:= ê:
g f@g@x_DD := regolag@xD
In[30]:=
— General::spell1 : Possible spelling error: new symbol More…
name "regolag" is similar to existing symbol "regolaf".
237
Printed by Mathematica for Students
Daniele Lupo Appunti di Mathematica
Adesso, per lo stesso pattern dell'espressione, abbiamo due differenti regole. Dato che, però, la g
viene valutata prima nell'ordine delle espressioni, otterrò:
f@g@zDD
In[31]:= regolag@zD
Out[31]=
Viene applicata la regola associata alla g. Cancelliamola, e vediamo che succede:
Clear@gD; f@g@zDD
In[32]:= regolaf@zD
Out[32]=
In questa maniera, prima viene valutata la g ma, dato che adesso non ha più nessuna definizione e
nessuna regola, la sua valutazione lascia l'espressione inalterata. Dopo viene valutata la f che,
riconoscendo il particolare tipo di espressione, applica la sua regola.
applica la definizione specificata quando la f
f/:espr:=def compare nell'espressione specificata
Lavorando con queste regole, siamo in grado di modificare a piacimento, e nel modo che ci serve, il
modo in cui vengono calcolate determinate espressioni, dando il risultato nella forma che ci serve.
Un altro modo per modificare il calcolo delle espressioni consiste nello specificare quali parti
debbano essere calcolate e quali no: lascia expr in forma non valutata
Hold[expr] lascia expr non valutata ed evita che venga modificata
HoldComplete[expr] da ulteriori calcoli a livelli superiori
mantiene expr non valutata, e scrive l'espressione
HoldForm[expr] senza l'head HoldForm
rimuove e da expr
ReleaseHold[expr] Hold HoldForm
index, prende una parte di expr, modificandola con
Extract[expr, Hold] Hold
per prevenire la valutazione
x pr, sostituisce una parte di expr, estraendo value
ReplacePart[e senza valutarlo
index,
Hold[value], 1]
Consideriamo, per esempio, la seguente espressione:
+ + + ∗
3 4 5 Sin@4 7D
In[33]:= +
12 Sin@28D
Out[33]= 238
Printed by Mathematica for Students
Daniele Lupo Appunti di Mathematica
Vogliamo, adesso, valutarla, ma stavolta non vogliamo che venga calcolato l'argomento del seno:
+ + + ∗
3 4 5 Sin@Hold@4 7DD
In[34]:= +
12 Sin@Hold@4 7DD
Out[34]=
Vediamo come non venga valutato, Tuttavia, se ci interessa un output più pulito, conviene utilizzare
HoldForm:
+ + + ∗
3 4 5 Sin@HoldForm@4 7DD
In[35]:= +
12 Sin@4 7D
Out[35]=
In questa maniera, nascondiamo l'head, che è utile quando magari dobbiamo stampare la formula
(per esempio quando la esportiamo in oppure in Publicon).
A
L TEX
L'ordine della valutazione è importante speciamente quando andiamo a usare espressioni in confroni
e specialmente nei pattern (che vedremo fra poco). Supponiamo, per esempio, di vole creare una
regola per modificare una funzione quando compare un determinato argomento. Per esempio,
vorremmo fare questo:
= + ∗ →
regola f@x_ 3 5D Exp@xD;
In[36]:= 8regolaf,
— General::spell : Possible spelling error: new symbol More…
name "regola" is similar to existing symbols regolag<.
Vediamo quando la regola viene applicata:
ê.
f@4D regola
In[37]:= f@4D
Out[37]= ê.
+
f@w 15D regola
In[38]:= w
Out[38]=
Come possiamo vedere, in quest'ultimo caso Mathematica ha considerato equivalenti gli argomenti
delle funzioni, anche se nel primo caso abbiamo scritto una moltiplicazione, e nel secondo invece un
numero. ê.
+ +
f@i 12 3D regola
In[39]:= i
Out[39]= 239
Printed by Mathematica for Students
Daniele Lupo Appunti di Mathematica
Vediamo che anche in questo caso abbiamo ottenuto la sostituzione, perchè la somma contenuta
nell'argomento, se valutata, coincide sempre con quella valutata della regola. Quindi gli argomenti
coincidono perchè, analogamente all'argomento della funzione, anche il contenuto della regola viene
prima valutato. Possiamo lasciarlo in forma non valutata, se lo specifichiamo:
= + ∗ →
regola2 HoldForm@f@x_ 3 5DD Exp@xD;
In[40]:=
In questo caso, evitiamo che venga valutata, impedendo di eseguire la moltiplicazione. Di
conseguenza gli argomenti delle funzioni, pur essendo comunque equivalenti, non combacieranno
più nel modo in cui sono scritte, e la regola non viene applicata:
ê.
+
f@w 15D regola2
In[41]:= +
f@15 wD
Out[41]=
Invece, se andiamo a creare un argomento strutturalmente identico a quello ottenuto prima, la
sostituzione avviene comunque, perchè in questo caso abbiamo veramente due argomenti che sono
identici: ê.
+
f@w 3 5D regola2
In[42]:= +
f@15 wD
Out[42]=
Come vediamo, neanche in questo caso combaciano. Perchè? Sebbene abbiamo imposto la non
valutaione della regola, la funzione viene comunque valutata prima di applicare la regola. Dobbiamo
quindi lasciare senza valutazione