Sei sulla pagina 1di 16

Note per il corso di

Laboratorio di Fisica Computazionale


(A. A. 2022/23)

Metodi Monte Carlo

Prof. G. Profeta
Dipartimento di Scienze Fisiche e Chimiche
Università degli Studi dell’Aquila

4 novembre 2022
Indice

Indice 1

1 Metodo Monte Carlo 3


1.1 Funzione di Probabilità . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3
1.1.1 Istogramma . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 4
1.2 Valore di aspettazione . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 4
1.2.1 Distribuzione Gaussiana . . . . . . . . . . . . . . . . . . . . . . . 5
1.2.2 Teorema del limite centrale . . . . . . . . . . . . . . . . . . . . . . 5
1.2.3 Proprietà della varianza . . . . . . . . . . . . . . . . . . . . . . . . 6
1.3 Numeri random . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 8
1.4 Integrazione Monte Carlo . . . . . . . . . . . . . . . . . . . . . . . . . . . . 11
1.4.1 Integrazione unidimensionale . . . . . . . . . . . . . . . . . . . . . 12
1.4.2 Aree e Volumi . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 13

1
Capitolo 1

Metodo Monte Carlo

I metodi cosiddetti Monte Carlo sono molto utilizzati attualmente in fisica, matematica,
biologia, medicina ed informatica, in quanto rappresentano uno strumento molto potente per
risolvere numerosi problemi di varia natura. Il primo articolo in cui gli autori Metropolis
e Ulam descrivono il metodo è apparso nel 1949, ma è solo con l’avvento dei moderni
computer che ha trovato piena applicazione. Semplicisticamente i metodi Monte Carlo
possono essere descritti come metodi computazionali in cui si utilizza la generazione di
numeri casuali (random) per eseguire un calcolo o una simulazione. In quanto avremo a che
fare con generazione dei numeri random, risulta fondamentale richiamare alcuni concetti di
base di statistica e teoria delle probabilità.

1.1 Funzione di Probabilità


Per una variabile discreta causale, la funzione di distribuzione è una lista di propabilità
associata ad ogni valore possibile della variabile (si pensi, ad esempio, alle facce del dado:
(1, 1/6), (2, 1/6), (3, 1/6), . . .).
Per una variabile casuale, x, che può assumere valori continui all’interno di un intevallo
(a, b), la funzione di probabilità è una funzione p(x) tale che la probabilità P che la variabile
x assuma un valore nell’intervallo (a0 , b0 ) è :
Z b0
0 0
P {a ≤ x ≤ b } = p(x)dx (1.1)
a0

La funzione p(x) deve soddisfare le seguenti condizioni:

1. p(x) ≥ 0 per x ∈ (a, b)


Rb
2. a p(x)dx = 1

Si definisce funzione di distribuzione cumulativa, F (x), la probabilità che una variabile casuale
ξ assuma una valore minore di x :

F (x) = P (ξ ≤ x)

3
4 CAPITOLO 1. METODO MONTE CARLO

Mediante tale definizione, avremo che P {a ≤ x ≤ b} = F (b) − F (a). Estendendo tale


definizione, avremo che (nel caso di distribuzioni continue) la probabilità di avere un numero
x0 , sarà definita come:

P (x0 ≤ ξ ≤ x0 + ∆x)
p(x0 ) = lim = F 0 (x0 )
∆x→0 ∆x

1.1.1 Istogramma
Per avere informazioni sulla distribuzione di probabilità o la sua funzione cumulativa do-
vremmo fare infinite misure della variabile x e dai risultati estrarre le funzioni di probabilità.
Immaginiamo di fare N estrazioni (o misure) della variabile discreta x e definiamo la funzione
ZN (x) come il numero di misure con xi ≤ x. Dalla definizione di F (x) avremo che
1
F (x) = lim ZN (x).
N →∞ N
ed il numero di estrazioni comprese tra xi+1 ed xi sarà:
1
(ZN (xi+1 ) − ZN (xi )) ' F (xi+1 ) − F (xi ) = P (xi ≤ ξ ≤ xi+1 )
N
Data una lista di xi , la funzione P (xi ≤ ξ ≤ xi+1 ) è detta funzione istogramma e corri-
sponde alla probabilità che la nostra variabile casuale assuma un valore compreso all’interno
di una coppia di valori [xi , xi+1 ].

1.2 Valore di aspettazione


Mediante la funzione di distribuzione si definiscono la media (E[x]) e varianza (V[x]) della
variabile causale x :
Z b
E[x] = µ = xp(x)dx = (1.2)
a
Z b
2 2
V[x] = σ = E[(x − µ) ] = (x − µ)2 p(x)dx = (1.3)
a
Z b Z b Z b
2 2
= x p(x)dx + µ dx − 2µ xp(x)dx = E[x2 ] − µ2 (1.4)
a a a

Il valore di aspettazione di una funzione φ(x) è ugualmente definito come:


Z b
E[φ(x)] = φ(x)p(x)dx
a
Per distribuzioni discrete, analogamente avremo:
X
E[xk ] = xki p(xi )
i
X
E[φ(x)] = φ(xi )p(xi )
i
1.2. VALORE DI ASPETTAZIONE 5

1.2.1 Distribuzione Gaussiana


La funzione di probabilità e funzione cumulativa Gaussiana sono definite come:
1 (x−µ)2
p(x) = √ e− 2σ 2
2πσ 2
Z x
F (x) = p(t)dt
−∞

dove µ e σ sono dei parametri (reali) della funzione.


La funzione Gaussiana gode delle seguenti proprietà:

• F (∞) = 1
R∞
• µ = −∞ xp(x)dx
R∞
• σ 2 = −∞ (x − µ)2 p(x)dx

1.2.2 Teorema del limite centrale


Consideriamo N variabili random ξi con la stessa funzione cumulativa F (x), per cui E[ξ] = 0
e E[ξ 2 ] = 1.
Definiamo una nuova variabile random

ξ1 + ξ2 + . . . + ξN
ηN = √
N
Nel limite per N → ∞ la distribuzione cumulativa della variabile causale ηN (FN (x)) si
approssima alla funzione cumulativa di una Gaussiana:
Z x
1 2
lim FN (x) = Φ(x) = √ e−t /2 dt
N →∞ 2π −∞
Immaginiamo di ripetere la misura di una quantità fisica x per N volte, avendo come risultato
x1 , x2 , x3 , . . . , xN misure indipendenti random secondo una stessa distribuzione di probabilità
f (xi ). Il valore di aspettazione sarà:
Z
E[x] = xf (x)dx = X

ed la deviazione standard: p
σx = E[x2 ] − X 2
(Ricordiamo che invece, la media campionaria della variabile x è definita come x̄ = ( N
P
i xi )/N ).
Definiamo una nuova variabile random, ξi = xiσ−X x
che avrà per definizione media zero,
E[x]−X
E[ξ] = σx = 0 e deviazione standard:
 x2 + X 2 − 2xX  E[x2 ] − X 2
σξ2 = E[ξ 2 ] − E[ξ]2 = E 2
= =1
σX σx2
6 CAPITOLO 1. METODO MONTE CARLO


La variabile random, η, uguale alla somma delle variabili random ξi divisa per N , può
essere riscritta come:
PN PN √
ξ i x i − N X N
η = √i = i√ = (x̄ − X)
N N σx σx
e per il Teorema del limite centrale obbedisce ad una distribuzione normale,
1 η2
f (η) = √ e− 2

Dalla definizione di media campionaria x̄, vale la seguente uguaglianza:

N
f (x̄)dx̄ = f (η)dη = f (η(x̄)) dx̄
σx
dalla quale possiamo ricavare la funzione di distribuzione delle medie campionarie:

1 n (x̄ − X)2 o
f (x̄) = √ exp − 2
2π √σN
x
2 σNx
Ovvero la distribuzione delle medie obbedisce ad una distribuzione Gaussiana con valore
medio X e deviazione standard ridotta rispetto a quella della variabile x (σx ), pari a:
σx
σx̄ = √ .
N

1.2.3 Proprietà della varianza


Prima di procedere diamo alcune proprietà della funzione varianza.
• Se x è una variabile casuale e a e b due costanti arbitrarie, allora vale la seguente
relazione: V[ax + b] = a2 V[x].
La dimostrazione è ovvia, calcolando il termine
(ax + b) − E[ax + b] = ax + b + aE[x] − b = a(x − E[x])
quindi,
V[y] = E[((ax + b) − E(ax + b))2 ] = E[a2 (x − E[x])2 ] = a2 V[x]

• La varianza della somma di due variabili casuali indipendenti (x e y), è la somma della
varianze
V[x + y] = V[x] + V[y]
Tale relazione si dimostra sempre dalla definizione. Consideriamo, per semplicità, due
variabili con media nulla, pertanto:
V[x + y] = E[(x + y)2 ] = E[x2 ] + 2E[xy] + E[y 2 ] = V[x] + V[y]
data l’indipendenza delle variabili E[xy] = E[x]E[y] = 0. Un interessante corollario
della precedente relazione, è la varianza della differenza delle due variabili, che risulta
V[x − y] = V[x + (−y)] = V[−y] = V[x] + V[y].
1.2. VALORE DI ASPETTAZIONE 7

• Nel caso in cui le due variabili non siano indipendenti e con media diversa da zero, la
relazione include anche la loro covarianza,

V[x + y] = V[x] + V[y] + 2Cov[xy]

dove Cov[xy] = E[xy] − E[x]E[y]


Per la dimostazione basta calcolare

V[x + y] = E[((x + y) − E[x + y])2 ] = E[((x − E[x]) + (y − E[y]))2 ]

• Una interessante applicazione è rappresentata dal calcolo della varianza della media
aritmetica di N variabili casuali indipendenti, xi = 1, N , x̄ = x1 +x2 N
+...+xN
,

1 N 1
V[x̄] = V[x 1 + x 2 + . . . + x N ] = V[x 1 ] = V[x1 ]
N2 N2 N
8 CAPITOLO 1. METODO MONTE CARLO

1.3 Numeri random


Qualsiasi metodo basato sui numeri random, necessita di un generatore di numeri casuali.
Processi completamente casuali ”artificiali” non esistono e soltanto eventi fisici possono
simulare un evento completamente casuale. Per esempio, l’intensità di un fascio luminoso da
un diodo in funzione del tempo dovuto a fluttuazioni termiche.
Una vera sequenza casuale di numeri è una sequenza impredicibile di numeri, pertanto
irriproducibile. Nella pratica è impossibile generare una sequenza veramente random, ma
si utilizzano dei generatori di numeri pseudo-random, ovvero numeri generati secondo un
algoritmo ben preciso, ma che appaiono random a chi non conosce l’algoritmo stesso.
Per fare un esempio pratico, spieghiamo su cosa di basava il primo generatore random
fatto da von Neumann:

1. Immaginiamo di prendere un numero a 4 digit, per esempio x1 = 0.9876 (che rappre-


senterà il primo numero della sequenza random).

2. Facciamone il quadrato, x21 = 0.97535376 ottenendo cosı̀ un numero a 8 digit.

3. Il secondo numero della sequenza, x2 , sarà quello costruito prendendo i 4 digit centrali
di x21 , x2 = 0.5353.

4. A questo punto la sequenza continua facendo il quadrato di x2 e costruendo x3 nella


maniera precedente, e cosı̀ via...

L’algoritmo però tende a generare sequenze con una frequenza elevata di numeri piccoli ed è
pertanto poco utile ai fini pratici.
Un interessante algoritmo è il metodo ricorsivo chiamato generatore lineare congruenziale:

ri+1 = (ari + c)mod m (1.5)


con 0 < a < m e 0 < c < m e m > 0 (modulo) ed r0 il seme di partenza.

Esempio 1 Realizziamo un generatore moltiplicativo (con c = 0). Prendiamo


a = 3, r0 = 3 e m = 7. Si ottiene:

r1 = 9 (mod7) = 2
r2 = 6 (mod7) = 6
r3 = 18 (mod7) = 4
r4 = 12 (mod7) = 5
r5 = 15 (mod7) = 1
r6 = 3 (mod7) = 3
r7 = 9 (mod7) = 2

Naturalmente la successione è periodica di periodo al più pari ad m. Se un genera-


tore ha periodo pari ad m, ovvero il periodo massimo, si dice che il generatore ha
1.3. NUMERI RANDOM 9

periodo pieno e, in questo caso, ogni scelta del seme r0 porterà alla generazione
dell’intero ciclo di valori da 0 a m − 1. Se invece un generatore non ha periodo
pieno allora la lunghezza del ciclo può dipendere dal particolare valore iniziale
del seme.

Esercizio 1
Un esempio di generatore di base può essere dato da a = 3, c = 1, m = 5, r0 = 1.
Implementare la generazione dei numeri casuali congruenti e graficare la sequenza
generata in funzione del passo di generazione.
10 CAPITOLO 1. METODO MONTE CARLO

Nel Fortran, cosı̀ come negli altri linguaggi di compilazione, esiste una libreria che genera
numeri casuali distribuiti uniformemente tra (0, 1), ovvero con funzione cumulativa:

F (x) = 0 per x < 0, F (x) = x per 0 < x < 1, F (x) = 1 per x > 1
mentre la funzione di distribuzione sarà:

f (x) = 1 per 0 < x < 1 e zero altrimenti.

Il seguente codice illustra l’utilizzo della libreria rand e genera N numeri random distribuiti
uniformemente, con l’estrazione di un numero ad ogni chiamata della routine rand().
do i =1 , N
x = rand ()
write (6 ,*) x
enddo
La sequenza dei numeri generata sarà sempre la stessa ogni volta che eseguiamo il program-
ma, cosa che molte volte (la maggioranza) è da evitare, se vogliamo avere una statistica su
sequenze veramente random. Per evitare tale comportamento, cosı̀ come visto per il metodo
congruenziale, possiamo cambiare il seme di partenza con cui il generatore inizia la sua
sequenza random.
Studiare l’output del seguente listato per capire esattamente il funzionamento della chiamata
a rand :
program test_rand
INTEGER , PARAMETER :: seed = 86456

call srand ( seed )


print * , rand () , rand () , rand () , rand ()
print * , rand (1) , rand () , rand () , rand ()
print * , rand (1) , rand () , rand () , rand ()
print * , rand ( seed ) , rand ( seed ) , rand () , rand ()

end program test_rand

Esercizio 2 Costruire un istogramma (larghezza bin di 0.1) delle frequenze


relative di 100, 1000, 10000 numeri random distribuiti tra 0 e 1.
1.4. INTEGRAZIONE MONTE CARLO 11

1.4 Integrazione Monte Carlo


La generazione dei numeri random risulta molto utile in vari campi della fisica e matematica.
Un esempio fondamentale è rappresentato dall’integrazione Monte Carlo, ovvero mediante
l’utilizzo di numeri random. Per meglio comprendere la filosofia del metodo, illustriamo un
primo, semplice, utilizzo. Nel capitolo dedicato alle integrazioni numeriche, abbiamo visto
come sia possibile risolvere numericamente un integrale unidimensionale:
Z b N
X
I= f (x)dx ≈ ωi f (xi ), (1.6)
a i=1
dove i ωi sono dei pesi determinati a seconda del metodo scelto (rettangoli, trapezi, Simpson)
e gli xi sono i punti della griglia scelta per l’integrazione.
Nel metodo dei rettangoli, avremo che scelto h = b−a N
il passo di integrazione su una
griglia di N divisioni ed ampiezza (b − a):
Z b N
(b − a) X
I= f (x)dx ≈ f (xi ), (1.7)
a N i=1

Ovvero ωi = b−a
N
.
Possiamo in effetti dimostrare che una buona stima dell’integrale sia proprio:
N
b−aX
FN (I) = f (xi ) (1.8)
N i=1

Per farlo, calcoliamone in valore d’aspettazione:


* N
+ * N + N
b−aX b−a X b − a X

hFN i = f (xi ) = f (xi ) = f (xi ) (1.9)
N i=1 N i=1
N i=1

Ma la media (valore d’aspettazione) di una funzione f (x) di una variabile x con funzione di
distribuzione p(x) è: Z +∞


f (x) = f (x)p(x)dx. (1.10)
−∞
1
Identificando quindi con p(x) = (b−a)
per x ∈ [a, b] e zero per tutti gli altri valori, ovvero una
distribuzione uniforme all’interno dell’intervallo di integrazione [a, b] si avrà:
Z b

f (x)
f (x) = dx. (1.11)
a (b − a)

E quindi sostituendo nella Eq.(1.9):


N Z
b − a X b f (x)
hFN i = dx = (1.12)
N i=1 a (b − a)
N Z
1 X b 1  b  Z b
Z
f (x)dx = N f (x)dx = f (x)dx = I (1.13)
N i=1 a N a a
12 CAPITOLO 1. METODO MONTE CARLO

Una dimostrazione alternativa prevede lo studio della convergenza mediante il teorema della
media integrale:
Z b N

1 X
I= f (x)dx = (b − a) f (x) ≈ (b − a) f (xi ) = FN (1.14)
a N i=1

1.4.1 Integrazione unidimensionale


Consideriamo il caso pratico di un calcolo di un integrale e vediamo come un metodo statistico
basato sulla generazione di numeri random possa implementato.
Il calcolo di un integrale sarà effettuato mediante l’utilizzo della seguente stima dell’inte-
grale:

b N
(b − a) X
Z
I= f (x)dx ≈ f (xi ), (1.15)
a N i=1

estraendo N variabili casuali xi mediante l’estrazione di numeri random tra (0, 1).
Consideriamo il seguente integrale:
Z 1
1 π
f (x) = dx 2
= (1.16)
0 1+x 4
Il generatore di numeri casuali implementato nel compilatore gfortran è il rand() che
restituisce un numero random compreso tra 0 e 1 con una probabilità uniforme.
Di seguito un codice che mostra l’utilizzo della funzione rand() per il calcolo di un
integrale mediante tecnica Monte Carlo.
program random

INTEGER ( kind =4) :: n_estrazioni , clock


INTEGER ( kind =4) :: iseed ! srand vuole il kind =4
REAL ( kind =4) :: x ,a ,b , int , sum , sum2 , var

a =0; b =1 ! estremi di integrazione


n_estrazioni =1000 ! numero di estrazioni

iseed =10 ! seme iniziale


call srand ( iseed )
int =0.0
sum =0.0
var =0.0

do i =1 , n_estrazioni
x = rand ()
sum = sum +1./(1.+ x **2) ! somma di f ( x )
var = var +(1./(1.+ x **2))**2 ! somma di f ( x )^2
1.4. INTEGRAZIONE MONTE CARLO 13

enddo

! Valore dell ’ integrale e varianza della f ( x )


sum2 = sum / real ( n_estrazioni ) ! media di f ( x )
int =( b - a )/ real ( n_estrazioni ) * sum
var =1./ real ( n_estrazioni ) * var ! media di f ( x )^2
write (6 ,*) int , atan (1.) , &
int - atan (1.) , sqrt ( var - sum2 **2)

stop
end
La funzione srand(iseed) inizializza il generatore random con il seme iseed. Ricordiamo
che la funzione intrinseca rand() genera un numero random x ∈ (0, 1) con distribuzione
uniforme caratterizzata da una funzione di probabilità costante. Se gli estremi di integrazione
dovessero essere genericamente (a, b), la distribuzione dovrà essere costante tra [a, b]:

1
p(x) = Θ(x − a)Θ(b − x) (1.17)
b−a
dove Θ(x) è la theta di Heaviside, che possiamo generare partendo dalla libreria rand()
mediante il seguente cambio di variabile:

z = a + (b − a)x, (1.18)
che genererà una variabile causale z distribuita uniformemente con x ∈ (a, b) partendo da
una variabile casuale x ∈ (0, 1) distribuita anch’essa uniformemente.

1.4.2 Aree e Volumi


Una delle applicazioni più interessanti del metodo Monte Carlo è appunto il calcolo di aree e
volumi. L’esempio più semplice è quello relativo al calcolo dell’area di un cerchio di raggio R.
Immaginiamo di inscrivere il cerchio nel quadrato di lato R. La procedura utilizzata si basa
sulla generazione di N punti random distribuiti uniformemente sulla superficie del quadrato e
contare quanti ne ”cadono” all’interno del cerchio. Evidentemente il rapporto tra le aree del
cerchio e del quadrato sarà uguale al rapporto tra il numero totale di punti caduti nel cerchio e
quelli totali,
Acerchio Ncerchio R2
= =
Aquadrato N Aquadrato
La stessa procedura può essere utilizzata per calcolare il volume di un solido, per esempio
una sfera. Inscrivendo la sfera in un cubo, generiamo una tripletta (x, y, z) mediante tre numeri
random all’interno del cubo inscrivente. Il rapporto tra i volumi sarà uguale al rapporto tra i
punti ”dentro” e quelli totali.
Si può estendere tale metodo per integrare una funzione scalare, su un dominio definito
(per esempio un cerchio) utilizzando il teorema della media integrale,
14 CAPITOLO 1. METODO MONTE CARLO

Z


Ncerchio
f (x, y)dxdy = f (x, y) A · Acerchio = f (x, y) A · · Aquadrato
A N


Dove f (x, y) P è la media della funzione valutata solo per i punti all’interno del cerchio,
1

f (x, y) = N i f (xi , yi ) per (xi , yi ) all’interno dell’area del cerchio.

Esercizio 3 Calcolare l’area del cerchio di raggio R = 2 cm mediante il


metodo Monte Carlo, in funzione del numero di punti generati. Graficare il valore
dell’integrale in funzione del numero N di punti, la deviazione standard (σN )
calcolata mediante un processo binomiale con p = π/4 (graficare ±σN ).

Esercizio 4
Verificare il teorema di Gauss calcolando il flusso del campo elettrico generato da
una carica puntiforme di carica unitaria e posizionata nel punto rq = (0.5, 0.0, 0.0)
attraverso una sfera centrata nell’origine con raggio R = 1.
Graficare l’andamento del flusso in funzione del numero di punti utilizzato.

Potrebbero piacerti anche