Corso di Metodi Computazionali della Fisica

Alessandro Vicini (Università di Milano)


Introduzione a Mathematica 2




Mathematica può essere utilizzato come:


In Mathematica l'unità elementare è l' "espressione"


Un'espressione può essere:


Il tipo di espressione pu`o essere ottenuto con il comando Head[expr]


In Mathematica QUALUNQUE enunciato ha la struttura:Op[el1,el2,....]

dove Op indica un operatore, mentre el1, el2,... sono una lista di argomenti su cui l'operatore agisce.

Un elemento può a sua volta avere questa struttura (struttura ad albero).

Ogni espressione è descritta in termini dei suoi livelli e del numero delle sue "foglie".


La struttura di un enunciato può essere ottenuta esplicitamente con il comando FullForm.


esempio: utilizzando FullForm, confrontare a + b + c con a b c


Mathematica è un programma di manipolazione algebrica:


effettua in modo formale operazioni su oggetti

è possibile introdurre operatori che godono di proprietà algebriche (associatività, commutatività, distributività) (Flat, Orderless, Listable)

esempio: SetAttributes[f,Orderless]


Ogni operazione modifica una o più parti di una espressione.

Questo risultato viene ottenuto con:

Le due possibilità si differenziano per i modi e i tempi in cui l'espressione viene modificata.


Regole di sostituzione: a -> b

FullForm[ a -> b] = Rule[a,b]


E' comodo accorpare diverse sostituzioni in una lista

rules = {a1 -> b1, a2 -> b2, ...}


Le regole di sostituzione vengono applicate, una per volta, su ogni sottoespressione, con i comandi Replace e RepeatedReplace

FullForm[expr /. rules] = Replace[expr, rules]

FullForm[expr //. rules] = RepeatedReplace[expr, rules]


Nel secondo caso le regole vengono riapplicate fin quando il risultato non rimane invariato.

Le regole di sostituzione agiscono solo quando vengono applicate con un Replace.


Definizioni immediate e ritardate

Distinguiamo le regole di sostituzione dalle definizioni,
poiché le regole di sotituzione agiscono solo sulle espressioni coinvolte dal comando dove esse compaiono,
mentre le definizioni sono sempre "attive" e vengono cercate e valutate da Mathematica ogni volta che consideriamo un'espressione.


Valutazione immediata di una definizione:

x=3;

f[x_] = a x^2 + b;

Print[f[y]];

Valutazione ritardata di una definizione:

x=3;

g[x_] := a x^2 + b;

Print[g[y]];


L'assegnazione e la sostituzione possono essere immediate o ritardate (=, :=, ->, :>).

La presenza del : indica che il secondo membro deve venire valutato SOLO quando la definizione viene utilizzata.

Nel secondo caso la variabile x=3 e la variabile x della definizione sono per Mathematica due simboli completamente distinti.



Funzioni

Ci sono vari modi di pensare a una funzione, al suo scopo e al suo utilizzo:



f[x_] := a x^2 + b x + c;


sp[x_List, y_List] := Sum[ x[[i]] y[[i]], { i,1,Length[x] }];


s[x_SurfaceGraphics,a_Real,b_Real,c_Real] := Show[ x, ViewPoint-> {a,b,c}]



agire su di una espressione significa considerarla come argomento di una operazione

l'operazione che si intende applicare sarà quindi la Head di una nuova espressione,

mentre come argomento ci sarà l'espressione di partenza

esempio : expr-> f[expr]


in certi casi, data un'espressione con certi argomenti, si vuole agire proprio su quegli argomenti

sostituendo la Head di partenza (non funziona con i tipi elementari);

per agire sulla Head: Apply[ f, g[a,b,c]] = f @@ g[a,b,c] = f[a,b,c]


spesso, data una lista di elementi (p.es. una somma di addendi è una lista di addendi su cui si agisce con Plus),

si vuole compiere una certa operazione f su ciascuno di essi

per agire sugli elementi: Map[ f, {a,b,c} ] = {f[a],f[b],f[c]};

Map[ f, {{a1, a2}, {b1, b2}, {c1, c2}} ] ={f[a1, a2], f[b1, b2], f[c1, c2]};

f = ( #[[2]] ) &; Map[ f, {{a1, a2}, {b1, b2}, {c1, c2}} ] = {a2, b2, c2};


Pattern

Si chiama pattern un modo di rappresentare in maniera generica una o più espressioni di Mathematica:

x_: una espressione di Mathematica;

x__ : una o più espressioni di Mathematica;

x___ : nessuna, una o più d'una espressione.

MatchQ[expr,pattern] = True/False a seconda che expr soddisfi o meno il pattern assegnato.


MatchQ[ a+b, x_] = True

MatchQ[ a+b, Plus[x_,y_,z_]] = False

MatchQ[ a+b, Plus[x_,y_,z___]] = True


x_h, x__h, x___h sono una, una o più, zero una o più espressioni aventi h come Head


MatchQ[5, x_Integer] = True

MatchQ[5, x_Real] = False


Esercizio

Scrivere la definizione di una funzione che, dato un prodotto di operatori a e a tali che [a, a†] = k, li riordini in modo che tutti gli a† risultino alla fine della manipolazione a sinistra

es.: a1 a† 2 a3= a† 2 a1 a3 + k a3


Semplificazioni

Expand[expr] sviluppa tutti i prodotti presenti in expr e restituisce una somma di termini.

Simplify[expr] cerca di raccogliere a tutti i livelli i fattori comuni, mettendo in evidenza, dove possibile, delle sottostrutture.

Factor[expr] cerca di porre expr in forma fattorizzata.

Together[expr] Mette tutti i termini di expr con un denominatore comune.

Apart[expr] Sviluppa una espressione razionale fratta come somma di frazioni elementari.

Collect[expr,{var1,var2,...},Method->tiposimpl] raccoglie in expr le potenze (anche negative). di var1; in ciascun coefficiente raccoglie le potenze di var2, etc; ciascun coefficiente viene quindi semplificato utilizzando tiposimpl come azione.

Coefficient[ expr, form, power] restituisce il coefficiente da cui è moltiplicato form^power all'interno di expr.

Esercizi:

1) Utilizzando MatchQ, implementare una nostra funzione myCoefficient.

2) Utilizzando Coefficient, implementare una nostra funzione myCollect.