Buscar

Prévia do material em texto

Me´todos de Monte Carlo
Paulo Roberto de Carvalho Ju´nior
prcjunior@inf.ufpr.br
VRI – Visa˜o Robo´tica e Imagem
Universidade Federal do Parana´
Paulo Roberto de Carvalho Ju´nior Me´todos de Monte Carlo
Introduc¸a˜o
Me´todos de Monte Carlo sa˜o me´todos estat´ısticos baseados
em amostragens aleato´rias ou pseudoaleato´rias
Tempo de execuc¸a˜o determin´ıstico
Resultado aproximado
Quanto maior a quantidade de amostras, maior a
probabilidade de se aproximar do resultado correto
Paulo Roberto de Carvalho Ju´nior Me´todos de Monte Carlo
Exemplo: Ca´lculo de pi
Paulo Roberto de Carvalho Ju´nior Me´todos de Monte Carlo
Exemplo: Ca´lculo de pi
Equac¸a˜o da Circunfereˆncia: x2 + y2 = r2 ⇒ x2 + y2 = 1
A´rea do Quadrante do C´ırculo: AC =
pir2
4 =
pi
4
A´rea do Quadrado: AQ = r
2 = 1
AC
AQ
=
pi
4
1 =
pi
4 ⇒ pi = 4ACAQ
Paulo Roberto de Carvalho Ju´nior Me´todos de Monte Carlo
Algoritmo: Ca´lculo de pi
double calc_pi(int n)
{
int i;
int count = 0;
for (i = 0; i < n; ++i) {
double x = (double)rand() / RAND_MAX;
double y = (double)rand() / RAND_MAX;
if (x*x + y*y <= 1.0)
++ count;
}
return (double)count / n * 4.0;
}
Paulo Roberto de Carvalho Ju´nior Me´todos de Monte Carlo
Integrac¸a˜o pelo Me´todo de Monte Carlo
Problema: a complexidade da integrac¸a˜o nume´rica
determin´ıstica cresce exponencialmente de acordo com o
nu´mero de dimenso˜es do dom´ınio
Embora a integrac¸a˜o pelo me´todo de Monte Carlo tenha
resultado com erro probabil´ıstico, ela e´ escala´vel quanto a`
dimensa˜o do dom´ınio
Integrac¸a˜o pelo me´todo de Monte Carlo:∫
Ω
f (~x)d~x ≈ V 1
N
N∑
i=1
f (~xi )
onde Ω e´ um intervalo em Rm com volume V e ~xi sa˜o
amostras (pseudo)aleato´rias de Ω
Paulo Roberto de Carvalho Ju´nior Me´todos de Monte Carlo
Integrac¸a˜o pelo Me´todo de Monte Carlo
Paulo Roberto de Carvalho Ju´nior Me´todos de Monte Carlo
Algoritmo: Integrac¸a˜o pelo Me´todo de Monte Carlo
double calc_integral(double (*f)(double),
double a, double b, int n)
{
int i;
double fsum = 0.0;
for (i = 0; i < n; ++i) {
double x = a + (( double)rand()/RAND_MAX)
* (b - a);
fsum += f(x);
}
return (fsum / n) * (b - a);
}
Paulo Roberto de Carvalho Ju´nior Me´todos de Monte Carlo
Geradores de Nu´meros Pseudoaleato´rios
Sequeˆncias de nu´meros verdadeiramente aleato´rios:
Imprevis´ıveis
Irreprodut´ıveis
Sa˜o dif´ıceis de se obter
Requer hardware especializado
Taxa de transfereˆncia da sequeˆncia e´ geralmente baixa
Sequeˆncias de nu´meros pseudoaleato´rios:
Sa˜o geradas por algoritmos
Sa˜o determin´ısticas e reprodut´ıveis
Um mesmo valor de semente gera sempre a mesma sequeˆncia
Na˜o sa˜o aleato´rias, mas possuem propriedades pro´ximas de
sequeˆncias aleato´rias
Paulo Roberto de Carvalho Ju´nior Me´todos de Monte Carlo
Qualidade de Geradores de Nu´meros Pseudoaleato´rios
A qualidade de uma sequeˆncia pseudoaleato´ria e´ determinante
para a qualidade do resultado de um algoritmo de Monte Carlo
O per´ıodo da sequeˆncia deve ser suficientemente longo
Deve se comportar estatisticamente como a uma sequeˆncia de
nu´meros verdadeiramente aleato´rios
Deve estar equilibrada dentro de uma determinada distribuic¸a˜o
probabil´ıstica
Uniforme
Gaussiana (Normal)
Poisson
A relac¸a˜o entre os nu´meros da sequeˆncia deve ser dif´ıcil de se
identificar
Deve passar em testes emp´ıricos de aleatoriedade
O ca´lculo do pro´ximo nu´mero da sequeˆncia deve ser eficiente
e ra´pido
Paulo Roberto de Carvalho Ju´nior Me´todos de Monte Carlo
Gerador Congruencial Linear
Gerador de nu´meros pseudoaleato´rios de distribuic¸a˜o uniforme
Fa´cil de implementar
Eficiente e ra´pido
xn+1 = (a · xn + c) mod m
onde:
m, m > 0: mo´dulo
a, 0 < a < m: multiplicador
c , 0 6 c < m: incremento
x0, 0 6 x0 < m: semente
Paulo Roberto de Carvalho Ju´nior Me´todos de Monte Carlo
Gerador Congruencial Linear
A qualidade da sequeˆncia depende dos valores escolhidos para
as constantes
O per´ıodo da sequeˆncia e´ limitado por m, mas pode ser muito
menor se o valor do multiplicador a e do incremento c na˜o
forem escolhido adequadamente
De acordo com o teorema de Hull-Dobell, os seguintes
crite´rios devem ser obedecidos para maximizar o per´ıodo:
c e m devem ser primos entre si
a− 1 deve ser divis´ıvel por todos os fatores primos de m
a− 1 deve ser mu´ltiplo de 4 se m e´ mu´ltiplo de 4
Exemplos:
xn+1 = (3 · xn + 5) mod 32, x0 = 9
glibc: xn+1 = (1103515245 · xn + 12345) mod 231
Paulo Roberto de Carvalho Ju´nior Me´todos de Monte Carlo
Bibliotecas de Geradores de Nu´meros Pseudoaleato´rios
glibc (C/C++):
Per´ıodo: 231
#include <stdlib.h>
srand(): Inicializa a semente
rand(): Retorna um nu´mero pseudoaleato´rio entre 0 e
RAND MAX
SPRNG (C/C++, FORTRAN):
Inclui va´rios geradores diferentes, com diferentes per´ıodos
(2219, 264, 261, 248 e 231)
Suporte a processamento paralelo e concorrente
Dispon´ıvel em http://www.sprng.org/
Paulo Roberto de Carvalho Ju´nior Me´todos de Monte Carlo
Rotinas U´teis
Usar sementes diferente para cada vez que executar o
programa (resoluc¸a˜o de 1s)
srand(time(NULL));
var ← random[0, 1]
var = (double)rand() / RAND MAX;
var ← random[a, b]
var = a + (b - a) * ((double)rand() / RAND MAX);
Paulo Roberto de Carvalho Ju´nior Me´todos de Monte Carlo
Exerc´ıcio 1
Integre pelo me´todo de Monte Carlo a func¸a˜o f (x , y) definida no
intervalo [(−pi,−pi), (pi, pi)]:
f (x , y) = 3x2 + 5y2 + 3sin(x3) + 5cos(y3)
O programa deve utilizar 100 milho˜es de amostras de pontos
pseudoaleato´rios em f (x , y)
Use como semente para srand() o nu´mero 1234
Calcule o wall-clock time da integrac¸a˜o
Acesse http://www.inf.ufpr.br/prcjunior/ para baixar
o co´digo base
Paulo Roberto de Carvalho Ju´nior Me´todos de Monte Carlo
Exerc´ıcio 2
Otimize a func¸a˜o de integrac¸a˜o implementada no exerc´ıcio anterior
O co´digo pode ser otimizado especificamente para a func¸a˜o
f (x , y) apesentada, ou seja, na˜o e´ necessa´rio deixa´-lo gene´rico
para integrar qualquer func¸a˜o
Utilize as estrate´gias de otimizac¸a˜o aprendidas na disciplina
Utilize a ferramenta likwid-perfctr para auxiliar na ana´lise de
desempenho
Quem consegue o menor tempo de execuc¸a˜o? :)
Paulo Roberto de Carvalho Ju´nior Me´todos de Monte Carlo