Anteprima
Vedrai una selezione di 19 pagine su 89
Manuale di Mathematica 09 Pag. 1 Manuale di Mathematica 09 Pag. 2
Anteprima di 19 pagg. su 89.
Scarica il documento per vederlo tutto.
Manuale di Mathematica 09 Pag. 6
Anteprima di 19 pagg. su 89.
Scarica il documento per vederlo tutto.
Manuale di Mathematica 09 Pag. 11
Anteprima di 19 pagg. su 89.
Scarica il documento per vederlo tutto.
Manuale di Mathematica 09 Pag. 16
Anteprima di 19 pagg. su 89.
Scarica il documento per vederlo tutto.
Manuale di Mathematica 09 Pag. 21
Anteprima di 19 pagg. su 89.
Scarica il documento per vederlo tutto.
Manuale di Mathematica 09 Pag. 26
Anteprima di 19 pagg. su 89.
Scarica il documento per vederlo tutto.
Manuale di Mathematica 09 Pag. 31
Anteprima di 19 pagg. su 89.
Scarica il documento per vederlo tutto.
Manuale di Mathematica 09 Pag. 36
Anteprima di 19 pagg. su 89.
Scarica il documento per vederlo tutto.
Manuale di Mathematica 09 Pag. 41
Anteprima di 19 pagg. su 89.
Scarica il documento per vederlo tutto.
Manuale di Mathematica 09 Pag. 46
Anteprima di 19 pagg. su 89.
Scarica il documento per vederlo tutto.
Manuale di Mathematica 09 Pag. 51
Anteprima di 19 pagg. su 89.
Scarica il documento per vederlo tutto.
Manuale di Mathematica 09 Pag. 56
Anteprima di 19 pagg. su 89.
Scarica il documento per vederlo tutto.
Manuale di Mathematica 09 Pag. 61
Anteprima di 19 pagg. su 89.
Scarica il documento per vederlo tutto.
Manuale di Mathematica 09 Pag. 66
Anteprima di 19 pagg. su 89.
Scarica il documento per vederlo tutto.
Manuale di Mathematica 09 Pag. 71
Anteprima di 19 pagg. su 89.
Scarica il documento per vederlo tutto.
Manuale di Mathematica 09 Pag. 76
Anteprima di 19 pagg. su 89.
Scarica il documento per vederlo tutto.
Manuale di Mathematica 09 Pag. 81
Anteprima di 19 pagg. su 89.
Scarica il documento per vederlo tutto.
Manuale di Mathematica 09 Pag. 86
1 su 89
Disdici quando vuoi 162x117
Disdici quando
vuoi
Acquista con carta
o PayPal
Scarica i documenti
tutte le volte che vuoi
Sintesi

<div>

Scarica il

</div>

Estratto del documento

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

Dettagli
Publisher
89 pagine