Estratto del documento

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 effettivamente 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 diminuire 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 kernel 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 Mathematica come funzioni. Da questo deriva la potenza del programma in effetti. Sebbene 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 significato 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:

TreeForm[expr] mostra l'espressione con notazione ad albero testuale.

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 eseguire 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 separatamente 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 estrae 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 una 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 di aver sbagliato, e che in realtà sia una cubica, e ci siamo scordati di scrivere w x3: 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 ignorante 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 utilizzare il seguente comando:

Trace[espr] restituisce la lista delle sottoespressioni generate 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, ottengo:

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.

f/:espr:=def applica la definizione specificata quando la f 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:

  • Hold[expr] lascia expr in forma non valutata.
  • HoldComplete[expr] lascia expr non valutata ed evita che venga modificata da ulteriori calcoli a livelli superiori.
  • HoldForm[expr] mantiene expr non valutata, e scrive l'espressione senza l'head HoldForm.
  • ReleaseHold[expr] rimuove Hold e HoldForm da expr.
  • Extract[expr, index, Hold] prende una parte di expr, modificandola con Hold per prevenire la valutazione.
  • ReplacePart[e, index, Hold[value], 1] sostituisce una parte di expr, estraendo value senza valutarlo.

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.

LaTeX

L'ordine della valutazione è importante specialmente quando andiamo a usare espressioni in confronti e specialmente nei pattern, che vedremo fra poco. Supponiamo, per esempio, di voler 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 valutazione della regola, la funzione viene comunque valutata prima di applicare la regola.

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
D/illustrazione/soddisfatti o rimborsati
Acquista con carta o PayPal
Scarica i documenti tutte le volte che vuoi