Resolvendo Problemas com o Método de Monte Carlo

Published

August 27, 2025

Neste post, a ideia é apresentar o método de Monte Carlo e algumas de suas aplicações de forma prática. Vou mostrar exemplos simples, incluindo scripts em Python, que ilustram como o método funciona na prática. Ao longo do texto, também discuto algumas propriedades matemáticas que dão sustentação ao método — mas, se esse não for o seu foco, você pode tranquilamente pular essa parte e considerar somente os exemplos.

Por que “Monte Carlo”?

O nome foi popularizado nos anos 1940 por Stanislaw Ulam e John von Neumann, no Projeto Manhattan em Los Alamos. Na época, cálculos de probabilidades e integrais em física nuclear eram considerados intratáveis por métodos analíticos.

Em recuperação de uma cirurgia, Ulam refletiu sobre jogos de paciência: qual a chance de uma partida dar certo? Em vez de derivar uma fórmula, percebeu que poderia simular muitas partidas e estimar a probabilidade pela frequência observada. Nascia a ideia de usar amostragem aleatória para resolver problemas numéricos.

O nome Monte Carlo faz alusão ao cassino de Mônaco — uma metáfora para o uso de “sorteios” controlados. Desde então, o método expandiu-se da física para estatística, finanças, engenharia e IA.

Cassino de Monte Carlo em Mônaco

Cassino de Monte Carlo em Mônaco

O filme O Matemático retrata parte dessa história e o papel das simulações na ciência moderna.

A ideia central é simples: usar amostragem aleatória para estimar quantidades numéricas difíceis de calcular analiticamente. A sacada é que, com simulações suficientes, a frequência observada (quantas partidas deram certo) se aproxima da probabilidade real. Este princípio, conhecido como a Lei dos Grandes Números, é o que faz o método de Monte Carlo funcionar.

1940s – Projeto Manhattan
Ulam e von Neumann desenvolvem a ideia em Los Alamos.

1946 – Inspiração no jogo de paciência
Ulam imagina simular partidas para estimar probabilidades.

1947 – Nome “Monte Carlo”
Escolhido em referência ao cassino de Mônaco.

1950–1960
Método se espalha para física, estatística e pesquisa operacional.

1970+
Com computadores mais potentes, o método ganhou ampla difusão e passou a ser aplicado em muitas áreas.

Hoje
Aplicações vão de finanças a IA e modelagem científica.

A estratégia de Monte Carlo se baseia em três pilares simples:

  • Aleatoriedade: usamos sorteios controlados para explorar um problema. Em vez de calcular uma resposta exata, nós a descobrimos através de amostragem.
  • Lei dos Grandes Números: A solução acontece na repetição. Uma única amostra não diz muito, mas milhares (ou milhões) delas revelam um padrão confiável. Esse é o princípio da consistência: a média amostral converge para a média verdadeira do sistema.
  • Computação intensiva: O método se tornou prático com o advento dos computadores, que conseguem realizar milhões de “experimentos” aleatórios em segundos.

Exemplo 1 — Estimando π pelo “jogo de dardos”

Considere o quadrado [0,1]×[0,1] e o quarto de círculo de raio 1 definido por x2+y21.

  • A área do quadrado é 1.

  • A área do quarto de círculo é πr2/4=π/4, pois r=1.

Assim, a razão entre as áreas é exatamente:

área do quarto de círculoárea do quadrado=π4

Agora, se lançarmos pontos uniformemente no quadrado, a proporção de pontos que cai dentro do quarto de círculo aproxima essa razão. Multiplicando por 4, obtemos uma estimativa de π:

π^=4×#dentron

Quanto maior o número de pontos n, menor a variabilidade da estimativa. Pela Lei dos Grandes Números, π^ converge para o valor verdadeiro de π.

O GIF abaixo mostra esse processo como um jogo de dardos: a cada ponto lançado, verificamos se caiu dentro do quarto de círculo (em vermelho) ou fora (em azul). A cada quadro, a estimativa π^ vai ficando mais estável.

Observe no GIF como a estimativa de π varia bastante no início, mas gradualmente se estabiliza perto do valor verdadeiro de 3.14159… à medida que mais pontos são lançados. Essa é a Lei dos Grandes Números.

O código abaixo implementa essa técnica para a estimativa de π.

import random

def estima_pi(n_sim = 100_000, seed = 42):
  
    random.seed(seed)
    dentro = 0
    
    for _ in range(n_sim):
        x, y = random.random(), random.random()
        if x**2 + y**2 <= 1.0:
            dentro += 1
    return 4.0 * dentro / n_sim

for n in (1000, 10000, 100000):
    print(f"n={n:>7} → pi ≈ {estima_pi(n):.6f}")
n=   1000 → pi ≈ 3.128000
n=  10000 → pi ≈ 3.126000
n= 100000 → pi ≈ 3.137280

Exemplo 2 — Integral por Monte Carlo

O truque de ‘atirar dardos’ para medir uma área é poderoso, mas como aplicamos essa ideia a problemas mais abstratos, como calcular uma integral? A resposta está em reformular o problema em termos de um valor esperado, que podemos estimar com uma média amostral.

Queremos calcular

I=abg(x)dx.

O estimador de Monte Carlo

Se gerarmos X1,,XniidUnif(a,b), um estimador natural é

I^n=(ba)1ni=1ng(Xi)

Esse é o estimador por média simples, também chamado plain Monte Carlo.

Exemplo

Vamos calcular a integral de f(x)=ex2 em [0,1].

import math, random
from statistics import mean, stdev

random.seed(123)

def integral_mc(g, a, b, n=100_000):
    xs = [random.uniform(a, b) for _ in range(n)]
    gx = [g(x) for x in xs]
    Ihat = (b - a) * mean(gx)
    # EP por CLT (amostral): (b-a)*sd(f(X))/sqrt(n)
    ep = (b - a) * (stdev(gx) / math.sqrt(n))
    return Ihat, ep

g = lambda x: math.exp(-x**2)
Ihat, ep = integral_mc(g, 0.0, 1.0, n=100_000)
lo, hi = Ihat - 1.96*ep, Ihat + 1.96*ep

print(f"Î ≈ {Ihat:.6f}  EP ≈ {ep:.6f}  IC95% ≈ [{lo:.6f}, {hi:.6f}]")
Î ≈ 0.746341  EP ≈ 0.000637  IC95% ≈ [0.745093, 0.747588]
print(f"Valor verdadeiro ≈ {0.5*math.sqrt(math.pi)*math.erf(1.0):.6f}")
Valor verdadeiro ≈ 0.746824

Por que funciona?

Se XUnif(a,b), a densidade é f(x)=1ba. Logo,

E[g(X)]=abg(x)f(x)dx=1(ba)abg(x)dx

Portanto,

I=(ba)E[g(X)].

A seguir, listamos três propriedades fundamentais que explicam por que esse método funciona:

  1. Temos que E[I^n]=I. Em termos estatísticos, dizemos que o estimador I^n é não viesado. A seguir demonstramos essa propriedade.

E[I^n]=E[(ba)1ni=1ng(Xi)]=(ba)ni=1nE[g(Xi)]=(ba)ni=1nabg(x)1(ba)dx=(ba)n1(ba)i=1nabg(x)dx=(ba)n1(ba)i=1nI=(ba)n1(ba)nI=I.

Além disso,

Var[I^n]=Var[(ba)1ni=1ng(Xi)]=(ba)2n2i=1nVar[g(Xi)]=(ba)2n2nVar[g(Xi)]=(ba)2nVar[g(Xi)].

  1. Pela Lei dos Grandes Números, I^nq.c.I quando n.

  2. Incerteza (Teorema do Limite Central). A partir do que vimos antes, temos que

n(I^nI)dN(0,(ba)2Var[g(X)]).

Ou seja,

I^nN(I,(ba)2nVar[g(X)]).

Portanto, podemos estimar o erro padrão por

EP(I^n)(ba)Var^[g(X)]n.

Em outras palavras, o TCL nos diz que a distribuição do nosso estimador se aproxima de uma Normal centrada no valor verdadeiro. Essa aproximação Normal é o que nos permite construir intervalos de confiança para I^n, quantificando a incerteza da nossa estimativa.

Observação: este é o estimador por média (também chamado plain Monte Carlo). É diferente do “hit-or-miss”, que amostra no retângulo [a,b]×[0,M] e conta proporções abaixo da curva; o estimador por média costuma ter variância menor e é o padrão para integrais.

💡 Essência do Método de Monte Carlo:
Monte Carlo = transformar problema em valor esperadogerar amostrascalcular sua média

A Lei dos Grandes Números

A Lei dos Grandes Números (LGN) é a garantia de que o método funciona. Ela garante que a média de uma amostra aleatória grande converge para a “média verdadeira” do sistema que investigamos.

Em Monte Carlo, a estratégia é reformular um problema complexo de modo que sua resposta seja uma média teórica (um valor esperado). Em seguida, usamos o computador para gerar muitas amostras aleatórias e simplesmente calcular sua média. A LGN garante que essa média amostral se aproxima do resultado que buscamos.

Veja como essa ideia se relaciona com os nossos dois exemplos:

  • Para estimar π: A “média teórica” que queremos descobrir é a probabilidade de um ponto cair no quarto de círculo, que vale π/4. A “média amostral” que calculamos é a proporção de pontos que, de fato, caíram dentro. A LGN nos assegura que:

#dentronMédia Amostralnπ4Média Teórica

  • Para calcular a integral: A “média teórica” é o valor esperado da função, E[g(X)]. A “média amostral” que calculamos é a média dos valores da função aplicados aos nossos números sorteados. A LGN garante que:

1ni=1ng(Xi)Média AmostralnE[g(X)]Média Teórica

Em resumo, o método de Monte Carlo consiste em transformar um problema complexo em um valor esperado, gerar amostras aleatórias e calcular sua média. A Lei dos Grandes Números garante que essa média amostral converge para a média teórica, tornando a estratégia viável.

Conclusão

A história de Monte Carlo revela como uma ideia simples pode ter grande impacto: usar sorteios para resolver cálculos complexos. O que nasceu em jogos de paciência e nos desafios da física nuclear hoje é um dos métodos mais versáteis e aplicados da estatística moderna.