Sunteți pe pagina 1din 9

12

METODA MONTE CARLO


12.1 Introducere
Analiza numeric a clasic a metode deterministe
Algoritmii acelasi rezultat pe orice calculator prin aceeasi succesiune nit a de operatii.
n zic a sisteme cu num ar mare de grade de libertate.
Functia de partitie clasica a unui gaz din N atomi care interactioneaz a prin v(r
ij
):
Z =
_

_
d
3
r
1
d
3
r
N
exp
_

1
k
B
T
N

i<j
v(r
ij
)
_
Pentru N = 20 si n = 10 puncte de integrare pe ecare dimensiune 10
60
operatii.
Supercalculator 10
10
operatii / secund a 3 10
42
ani!
Alternativa metode probabilistice, bazate pe legea numerelor mari.
Metoda Monte Carlo nume generic dup a faimosul cazinou din Monaco.
Metod a nedeterminist a utilizeaz a rezultatele unor experiente aleatoare.
M arimea c autat a valoarea medie a unei m arimi aleatoare.
Mod mai avantajos de scalare a efortului de calcul cu cresterea dimensiunii problemei.
Evaluarea integralelor simple metoda Monte Carlo este cea mai inecient a metod a.
Calculul integralelor multiple mult mai avantajoas a odat a cu cresterea dimensiunii.
Aplicatii:
calculul integralelor multiple
rezolvarea sistemelor de ecuatii liniare
rezolvarea problemelor de tip Dirichlet pentru ecuatii diferentiale.
12.2 Integrarea functiilor
Teorema fundamental a a metodei Monte Carlo integrala unei functii f pe un
domeniu D produsul dintre valoarea medie a functiei si volumul V al domeniului,
_
D
fdV V f
f pe un esantion de n puncte, x
1
, ..., x
n
, distribuite aleator si uniform n D.
deviatia standard incertitudinea m asur a a abaterii functiei f de la medie.

2
varianta.
= V
_
f
2
f
2
n
=
V

n

f
f
1
n
n

i=1
f(x
i
), f
2

1
n
n

i=1
f
2
(x
i
)
Comparatie cu eroarea formulelor deterministe de integrare
descreste lent num arul punctelor de esantionare n
1/2
nu depinde de dimensiune!
Formula trapezelor unidimensional a eroarea n
2
Formula trapezelor d-dimensional a eroarea n
2/d
(n evalu ari / dimensiune).
Pentru d > 4 metoda Monte Carlo devine mai ecient a.
Importanta esantion arii eciente a domeniului D
deviatia standard
f
a functiei cu att mai mic a cu ct f este mai plat a.
Functie constant a sucient a evaluarea ntr-un singur punct pentru a anula varianta.
Dac a f are valori semnicative ntr-un domeniu restrns x
i
distribuite uniform n D
esantioneaz a n general valori nesemnicative ale functiei estimare imprecis a.
Caz particular: integral a undidimensional a
I =
_
b
a
f(X)dX
Schimbare de variabil a X = (b a)x + a:
I = (b a)
_
1
0
f((b a)x + a)dx
Formula Monte Carlo:
I
b a
n
n

i=1
f((b a)x
i
+ a)
x
i
n abscise aleatoarea uniform distribuite n [0, 1]
X
i
= (b a)x
i
+ a punctele de esantionare din [a, b].
2
Generarea variabilelor aleatoare uniform distribuite
Functia standard rand() (denit a n STDLIB.H).
Apel ari repetate secvente de numere ntregi cu distributie uniform a n [0,RAND_MAX]
RAND_MAX constant a predenit a (32767 pentru majoritatea implement arilor C)
Functia srand initializeaz a generatorul; argumente diferite secvente distincte.
time(NULL) (denit a n TIME.H) timpul n secunde de la 1 ianuarie 1970, ora 00:00:00.
Aplicatie:
_
1
0
xe
x
dx = 1 2e
1
0.26424
/*------------------------ Cuadratura Monte Carlo -------------------------*/
#include <stdlib.h>
#include <stdio.h>
#include <time.h>
#include <math.h>
#define Randomize() srand((unsigned)time(NULL)) /* Initializ. generatorul */
/* de numere aleatoare */
#define Rand() ((float)rand()/RAND_MAX) /* Returneaza un numar pseudo- */
/* aleator in intervalul [0,1] */
/*=========================================================================*/
float func(float x)
{
return x*exp(-x);
}
/*=========================================================================*/
void main()
{
float fx, f1, f2, s, sigma, x;
long i, n;
printf("n = "); scanf("%li",&n);
Randomize();
f1 = f2 = 0.0;
for (i=1; i<=n; i++) {
x = Rand(); fx = func(x);
f1 += fx;
f2 += fx * fx;
}
f1 /= n; f2 /= n;
s = f1;
sigma = sqrt((f2-f1*f1)/n);
printf("s = %f +/- %f\n",s,sigma);
}
TABELUL 12.1. Estim ari Monte Carlo ale integralei I =
_
1
0
xe
x
dx si deviatiile standard core-
spunz atoare, calculate cu functiile de pondere w(x) = 1 si w(x) = (3/2)x
1/2
.
w(x) = 1 w(x) = (3/2)x
1/2
n I I
100 0.26906 0.01080 0.26014 0.00259
1000 0.26324 0.00337 0.26477 0.00086
10000 0.26416 0.00105 0.26432 0.00027
3
12.3 Metoda reducerii variantei
Incertitudinea abaterea integrandului f fat a de valoarea sa medie.
"Aplatizarea" integrandului prin introducerea unei functii de pondere w(x) > 0,
_
1
0
w(x)dx = 1
Integrala:
I = (b a)
_
1
0
f((b a)x + a)
w(x)
w(x)dx
Schimbare de variabil a cu :
d = w(x)dx sau (x) =
_
x
0
w(x

)dx

(0) = 0, (1) = 1 conservarea domeniului consecint a a norm arii functiei w(x).


Integrala devine:
I = (b a)
_
1
0
f((b a)x() + a)
w(x())
d
Formula Monte Carlo pentru f/w, pe un esantion de puncte
i
uniform distribuite:
I
b a
n
n

i=1
f((b a)x(
i
) + a)
w(x(
i
)
Avantaj dac a w(x) are comportare similar a functiei f((b a)x + a).
Integrandul f/w devine relativ neted reducere a variantei (impreciziei) integralei.
Conditie: w(x) inversabil a.
Distributie uniform a pentru
i
distributie neuniform a pentru x
i
x(
i
).
Probabilitatea ca abscisa transformat a x
i
(x, x + dx) este w(x)dx.
Abscisele x
i
generate cu probabilitate maxim a n regiunile unde w are valorile mari.
Esantionare optim a a domeniului D elimin a valorile nesemnicative pentru f/w.
Aplicatie:
_
1
0
xe
x
dx = 1 2e
1
0.26424
Integrandul crestere monoton a pe [0, 1] de la 0 la e
1
si derivat a secund a negativ a.
Comportare similar a functiei inversabile e
1
x
1/2
.
Functia de pondere normat a:
w(x) = (3/2)x
1/2
.
Inversarea integralei incomplete a schimb arii de variabil a:
x =
2/3
.
4
/*------------- Cuadratura Monte Carlo cu reducerea variantei -------------*/
#include <stdlib.h>
#include <stdio.h>
#include <time.h>
#include <math.h>
#define Randomize() srand((unsigned)time(NULL)) /* Initializ. generatorul */
/* de numere aleatoare */
#define Rand() ((float)rand()/RAND_MAX) /* Returneaza un numar pseudo- */
/* aleator in intervalul [0,1] */
/*=========================================================================*/
float func(float x)
{
return x*exp(-x);
}
/*=========================================================================*/
float Ran(float *w)
/*---------------------------------------------------------------------------
Returneaza un numar pseudo-aleator real in intervalul [0,1] cu distributia
w(x) = 3/2 x^(1/2) si valoarea corespunzatoare w(x)
---------------------------------------------------------------------------*/
{
float x;
x = pow(Rand(),2./3.);
*w = 1.5 * sqrt(x);
return x;
}
/*=========================================================================*/
int main()
{
float fx, f1, f2, s, sigma, w, x;
long i, n;
printf("n = "); scanf("%li",&n);
Randomize();
f1 = f2 = 0.0;
for (i=1; i<=n; i++) {
x = Ran(&w); fx = func(x)/w;
f1 += fx;
f2 += fx * fx;
}
f1 /= n; f2 /= n;
s = f1;
sigma = sqrt((f2-f1*f1)/n);
printf("s = %f +/- %f\n",s,sigma);
return 0;
}
mbun at atire evident a deviatia standard scade n mod tipic cu un ordin de m arime.
Ecient a deosebit a atunci cnd integrandul este un produs F(x) = w(x)f(x).
5
12.1 Integrale multidimensionale
Integrarea functiei f pe domeniul complex D, pentru care esantionarea este dicil a.
Domeniu extins

D (include D), care poate esantionat cu usurint a (hiper-paralelipiped).
Nou integrand

f(x) =
_
f(x) dac a x D
0 dac a x / D,
Formula de integrare:
_
D
fdV

V

f ,

f si sunt calculate relativ la domeniul extins



D.
Exemplu
I =
__
x
2
+y
2
1
dxdy = 4
_
1
0
dx
_

1x
2
0
dy = ,
Domeniul de integrare D sectorul de cerc din primul cadran.
Domeniu extins p atratul

D = [0, 1] [0, 1]
Rescriem integrala:
I = 4
_
1
0
dx
_
1
0
dy [1 (x
2
+ y
2
)],
Discriminarea punctelor interioare sectorului D de cele exterioare functia treapt a
(x) =
_
0 dac a x < 0
1 dac a x 0.
Formula de integrare Monte Carlo:
I
4
n
n

i=1
[1 (x
2
i
+ y
2
i
)] = 4
n
i
n
n num arul punctelor (x
i
, y
i
) distribuite aleator si uniform n p atratul

D.
n
i
num arul punctelor interioare sectorului de cerc D.
Aria sectorului de cerc proportional a cu probabilitatea gener arii punctelor interioare.
Valoarea medie si valoarea p atratic a medie a integrandului sunt egale, =
2
= n
i
/n.
Tehnica poate generalizat a pentru calculul volumelor multidimensionale:
V = lim
n
n
i
n

V .
Contabilizarea punctelor interioare domeniului initial n raport cu num arul total de puncte.
6
/*----------- Calculul Monte Carlo al ariei cercului de raza 1 ------------*/
#include <stdlib.h>
#include <stdio.h>
#include <time.h>
#include <math.h>
#define Randomize() srand((unsigned)time(NULL)) /* Initializ. generatorul */
/* de numere aleatoare */
#define Rand() ((float)rand()/RAND_MAX) /* Returneaza un numar pseudo- */
/* aleator in intervalul [0,1] */
/*=========================================================================*/
void main()
{
float x, y, s, sigma;
long i, n, ni;
printf("n = "); scanf("%li",&n);
Randomize();
ni = 0;
for (i=1; i<=n; i++) {
x = Rand(); y = Rand();
if (x*x + y*y <= 1.) ni++; /* nr. de puncte interioare */
}
s = (float) ni/n; /* nr. relativ de puncte interioare */
sigma = 4*sqrt((s - s*s)/n);
s *= 4;
printf("Aria = %f +/- %f\n",s,sigma);
}
TABELUL 12.2. Estim ari ale integralei I =
_ _
x
2
+y
2
1
dxdy si abateri standard calculate prin
metoda Monte Carlo.
n I n I
10 2.80000 0.57966 1000 3.12800 0.05223
20 3.40000 0.31937 2000 3.10600 0.03726
50 3.20000 0.22627 5000 3.14400 0.02320
100 3.20000 0.16000 10000 3.15520 0.01633
200 3.06000 0.11992 20000 3.13760 0.01163
500 3.22400 0.07074 50000 3.14128 0.00734
7
D
D

z
x
R r
FIGURA 12.1. Domeniul de integrare si sistemul de coordonate pentru exemplul de integrare
Monte Carlo tridimensional a.
Exemplu: masa si pozitia centrului de mas a pentru un tor de raze R = 3 si r = 1
Ecuatia torului:
(
_
x
2
+ y
2
R)
2
+ z
2
r
2
.
Domeniu de esantionare extins:

D = [R r, R + r] [R r, R + r] [r, r].
Masa si coordonatele centrului de mas a:
m =
_

D
dxdydz,
x
c
=
1
m
_

D
x dxdydz, y
c
=
1
m
_

D
y dxdydz, z
c
=
1
m
_

D
z dxdydz.
Metoda Monte Carlo:
m

V

V
_
[
2

2
] /n,
x
c
(

V /m)x (

V /m)
_
[(x)
2
x
2
] /n,
y
c
(

V /m)y (

V /m)
_
[(y)
2
y
2
] /n,
z
c
(

V /m)z (

V /m)
_
[(z)
2
z
2
] /n.

i
,
i
si
i
variabile aleatoare cu distributie uniform a n [0, 1]:
x
i
= (2
i
1) (R + r), y
i
= (2
i
1) (R + r), z
i
= (2
i
1) r.
8
/*---------------------------------------------------------------------------
Calculul masei si centrului de masa pentru un tor de raze r si R
centrat in origine, cu axa Oz ca axa de simetrie
---------------------------------------------------------------------------*/
#include <stdlib.h>
#include <stdio.h>
#include <time.h>
#include <math.h>
#define Randomize() srand((unsigned)time(NULL)) /* Initializ. generatorul */
/* de numere aleatoare */
#define Rand() ((float)rand()/RAND_MAX) /* Returneaza un numar pseudo- */
/* aleator in intervalul [0,1] */
/*=========================================================================*/
float Dens(float x, float y, float z)
{
return 1.0;
}
/*=========================================================================*/
void main()
{
const float r = 1.0;
const float R = 3.0;
const float v = 8 * (R+r) * (R+r) * r; /* volumul domeniului extins */
const float Rr = R + r, r2 = r * r;
float dens, f, sm, sm2, sx, sx2, sy, sy2, sz, sz2, x, y, z;
float m, sigm, sigx, sigy, sigz, xc, yc, zc;
long i, n;
printf("n = "); scanf("%li",&n);
sm = sx = sy = sz = 0.0;
sm2 = sx2 = sy2 = sz2 = 0.0;
Randomize();
for (i=1; i<=n; i++) {
x = (2*Rand() - 1) * Rr; /* -(R+r) <= x <= (R+r) */
y = (2*Rand() - 1) * Rr; /* -(R+r) <= y <= (R+r) */
z = (2*Rand() - 1) * r; /* -r <= z <= r */
if (pow(sqrt(x*x+y*y)-R,2) + z*z <= r2) {
dens = Dens(x,y,z);
f = dens ; sm += f; sm2 += f * f;
f = dens * x; sx += f; sx2 += f * f;
f = dens * y; sy += f; sy2 += f * f;
f = dens * z; sz += f; sz2 += f * f;
}
}
sm /= n; sx /= n; sy /= n; sz /= n; /* medii */
m = v * sm; sigm = v * sqrt((sm2/n - sm*sm)/n); f = v/m;
xc = f * sx; sigx = f * sqrt((sx2/n - sx*sx)/n);
yc = f * sy; sigy = f * sqrt((sy2/n - sy*sy)/n);
zc = f * sz; sigz = f * sqrt((sz2/n - sz*sz)/n);
printf("m = %8.5f +/- %8.5f\n",m ,sigm);
printf("xc = %8.5f +/- %8.5f\n",xc,sigx);
printf("yc = %8.5f +/- %8.5f\n",yc,sigy);
printf("zc = %8.5f +/- %8.5f\n",zc,sigz);
}
Rezultatele exacte pentru = 1: m = 2
2
Rr
2
59.2176 si x
c
= y
c
= z
c
= 0.
9

S-ar putea să vă placă și