Corso di Metodi Computazionali della Fisica

Alessandro Vicini (Università di Milano)


Introduzione a Mathematica 1



Per cominciare

per avviare Mathematica:

math per avviare il kernel, mathematica per avviare il notebook


una sequenza di comandi di Mathematica può essere:

scritta in un file filename.m salvata in una pagina di notebook filename.nb


per caricare un file:

<<filename.m;


per scrivere in un file:

expr >> filename.res; oppure Write["filename.res", expr];


help on-line:

??comando oppure ??*partedelnome*


L'argomento di qualunque funzione è scritto con parentesi quadre: p.es. Sin[x]


Gli iteratori sono indicati con parentesi graffe p.es.: {i, 1, 10}


I commenti si aprono con (* e si chiudono con *)

L'output della linea di comando precedente si richiama con %

La n-esima riga di output si richiama con %n


Mathematica permette di lavorare su espressioni:

simboli, numeri, stringhe, oggetti grafici, liste contenenti qualunque tipo di questi oggettti.

Il tipo di una espressione può essere ottenuto con il comando Head[expr]


L'espressione completa di una espressione, senza abbreviazioni/abbellimenti grafici, si ottiene con FullForm[expr]


Al risultato di qualunque operazione può essere SEMPRE assegnato un nome,
ovvero il risultato di un'operazione può essere sempre salvato in una variabile (senza necessità di inizializzazioni).


= indica l'assegnazione (es. a=3)

==, != stabiliscono la relazione

=== verifica l'uguaglianza (restituisce True/False)

=!= verifica la disuguaglianza (restituisce True/False)


Ogni espressione ha la struttura seguente: Operazione che agisce su una sequenza di argomenti.
È comodo ragionare quindi in termini di liste di argomenti, sui quali di volta in volta agiamo.


Definiamo una lista prova = {a, 3, pippo};

per estrarre il secondo elemento si scrive prova[[2]] oppure Part[prova, 2]


Una sostituzione ha la struttura expr /. { a -> b }


Operazioni di comune utilizzo


materiale addizionale rispetto alle funzioni elementari predefinite si trova nelle directories

/usr/local/mathematica/AddOns/StandardPackages/

/usr/local/mathematica/AddOns/ExtraPackages/

/usr/local/mathematica/AddOns/Utilities/


per caricare questi packages basta digitare <<nomepackage` (non serve il path assoluto)


Operazioni di comune utilizzo. Esempi

Calcolatore scientifico e simbolico

2+5;

(2+6)/(3+6);

Sin[0.3];

Sin[Pi/4];

3 a + 2 b + 5 a;

5^3;

Sqrt[81];

Log[2]; Log[2.];


Il valore numerico di un'espressione di ottiene con N[expr]; si digiti N[Pi,32]
Si confronti il risultato di N[1/7] con N[1/7,32] e con N[1/7.,32]



Funzioni in campo complesso

z = 2 + 3 I; FullForm[z]; Log[z]; N[Log[z]];

esercizio: si trovi la posizione del taglio del logaritmo e la prescrizione per la fase sui due bordi del taglio


Definizione di funzione (di una variabile)

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


Derivate di una funzione

D[x^3,x];

D[x^n,x];

D[ Sin[Sqrt[x]], {x,2} ];

Dt[ Sin[x^2+y^2+t^2], t];

g[x_,y_] := Derivative[1,2][f ][x,y];

Integrate[ f "[x], x]; FullForm[f "[x]];

caveat: negli integrali indefiniti manca sempre la costante di integrazione


Espansioni in serie di potenze

Normal[Series[ f[x],{x,x0,5}]];

Normal[Series[ Sin[x],{x,0,5}]];


esercizio: Con quanti termini è necessario sviluppare Log[1+x] nell'intorno di x=0, in modo da valutare Log[0.1] con una accuratezza dello 0.01 percento?


Integrali indefiniti e definiti

Nel calcolo di integrali indefiniti si usa la sintassi Integrate[ nomefunzione, variabile]

Nel calcolo di integrali definiti si usa la sintassi Integrate[ nomefunzione, {var, varmin, varmax} ]

caveat: negli integrali indefiniti manca sempre la costante di integrazione

Integrate[ Sin[x], x];

Integrate[ 1/(1+x^2), x];

Integrate[ 3 x^2,{x,1,4}];

Integrate[ x^(a-1) (1-x)^(b-1), {x,0,1}]];


Somme, prodotti e liste

Sum[ x^n/n!, {n,3,Infinity}];

Product[ 1- 1/((2 k)^2) ,{k, 1, 10}];

Table[ a[i], {i,1,4}];

Table[ a[i,j], {i,1,2},{j,1,4}];

Table[ Print["i=",i]; tmp=i^2 ; tmp, {i,1,5} ];


Matrici

Una matrice 2 x 2 si scrive M = {{ a,b }, { c,d }}.

Una matrice n x n si ottiene con il comando Table; p.es.Table[ a[i,j],{i,1,5}, {j,1,5}]] // MatrixForm.

Il prodotto tra due matrici si indica con un punto: m1.m2 o, esplicitamente, Dot[m1,m2]


Det[M];

Eigenvalues[M];

V = Eigenvectors[M];

W = Transpose[V];

Inverse[W].M.W;


Esercizio: Verificare le regole di commutazione delle matrici di Pauli.


Soluzione di (sistemi di) equazioni

Notazione matriciale per sistemi di equazioni lineari

M = {{ a,b }, { c,d }}; X = { x1,x2 }; Y1 = { 0,0 }; Y2 = { 3,5 };

Solve[ M.X==Y1, X];

Solve[ M.X==Y2, X];


Il simbolo == stabilisce l'equazione tra i due membri.

Notazione esplicita per sistemi di equazioni lineari

Solve[ {a x1 + b x2 == 3, c x1 + d x2 == 5}, {x1,x2} ];


Ogni soluzione è presentata come una lista di una o più regole di sostituzione.

C'è una sostituzione per ogni variabile.


Nel caso di un sistema lineare, c'è una sola soluzione e quindi una sola lista di sostituzioni, una per ogni variabile.

Nel caso di una equazione di secondo grado in una variabile, ci sono due soluzioni e quindi due liste di regole di sostituzione, ciascuna con una sola sostituzione, poichè c'è una sola variabile.

Solve[ a x^2 + b x + c == 0, x];

Nel caso di una singola equazione, si possono omettere le graffe.



Equazioni differenziali ordinarie

Sono necessari 3 argomenti: le equazioni, la funzione soluzione, la variabile rispetto a cui si integra l'equazione.


Se non si specificano le condizioni al contorno, si ottiene una famiglia di soluzioni, in cui le costanti di integrazione sono lasciate indicate.

DSolve[ y"[x] + 4 y[x] == 0, y[x], x];


Se si specificano le condizioni al contorno si ottiene una lista di equazioni che devono essere soddisfatte contemporaneamente.

DSolve[ { y"[x]+4 y[x] ==0, y[0] ==1, y'[0] == 0 }, y[x], x];


Nel caso in cui sia necessario risolvere numericamente l'equazione, è necessario indicare l'intervallo in cui si intende risolvere il problema.

NDSolve[ { y"[x]+4 y[x] ==0, y[0] ==1, y'[0] == 0 }, y[x], {x,0,5}];


Le soluzioni sono sempre presentate come regole di sostituzione.

è possibile utilizzare queste regole, p.es. per produrre un plot, nel seguente modo:


soluzione = NDSolve[ { y"[x]+4 y[x] ==0, y[0] ==1, y'[0] == 0 }, y[x], {x,0,5}];

sol[x_] = y[x] /. soluzione;

Plot[ sol[x],{x,0,5}];


Calcolo numerico di integrali definiti

NIntegrate[ Exp[-x^2],{x,-1,1}];

NIntegrate[ Exp[-x^2],{x,-10,10}];

int[a_] := NIntegrate[ Exp[-x^2], {x,-a,a}];


Disegnare grafici

I comandi Plot, Plot3D, ContourPlot e ListPlot generano come output degli oggetti grafici

Plot[ {Sin[x],Cos[x], x-x^3/6 ,1-x^2/2},{x,0,5}];

Plot3D[ Sin[x^2+y^2], {x,-3,3},{y,-3,3}];

ContourPlot[ Sin[x^2+y^2], {x,-3,3},{y,-3,3}];

ListPlot[ Table[{i,i^3},{i,1,5}];

ParametricPlot[ {Cos[t],Sin[t]}, {t,0,2 Pi} ];

ParametricPlot3D[ {Sin[th] Cos[phi], Sin[th] Sin[phi], Cos[th]}, {th,0,Pi}, {phi,0,2 Pi} ]


Plot[ {Sin[x],Cos[x]},{x,0,2 Pi},PlotStyle -> {{RGBColor[1,0,0],Thickness[0.001]},{RGBColor[0,1,0],Thickness[0.01]}}];



Ogni oggetto grafico può essere visualizzato in una nuova finestra con Show.

Grafici bidimensionali possono essere sovrapposti con Show (p.es. Show[grafico1,grafico2]).

Ogni oggetto grafico può essere visualizzato con opzioni diverse (Options[Show]).

In una stessa finestra possono essere accostati più grafici, combinandoli in una "matrice" con GraphicsArray.


Salvare oggetti grafici

g3 = Plot3D[ Sin[x^2+y^2] , {x,-3,3},{y,-3,3} ];

f[a_,b_,c_] := Show[ g3, ViewPoint-> {a,b,c} ];

final = f[0,1,0];

Export[ "final.eps",final,"EPS"];

Export[ "final.jpg",final,"JPEG"];


Costrutti condizionali: If, Which, Switch

If[ condizione, se verificata, se non verificata, se la condizione è non vera e non falsa];
costrutto minimale: If[ condizione, se verificata];
Which[cond1, esegue1, cond2, esegue2,...,cond-n,esegue-n]; Switch[espressione, pattern1,risuktato1,...pattern-n,risultato-n];

Cicli: Do, While, For