Оценка числа π методом Монте-Карло

Как с помощью случайных точек и интеграла оценить число π прямо в браузере.

Метод Монте-Карло оценивает интегралы и площади через случайные точки: доля точек, попавших в фигуру, приближает её площадь.

Иногда честно посчитать интеграл сложно, особенно в многомерье. Тогда выручает неожиданно простой приём — бросать случайные точки и считать, какая доля попала «внутрь». Это метод Монте-Карло, и он позволяет элегантно оценить число $\pi$. Идея в том, что площадь четверти круга радиуса $1$ равна $\frac{\pi}{4}$, и эту площадь можно записать интегралом.

Связь π с интегралом

Площадь четверти единичного круга — это интеграл функции верхней дуги:

$$\int_0^1 \sqrt{1-x^2}\,dx = \frac{\pi}{4}$$

Значит, $\pi = 4\int_0^1 \sqrt{1-x^2}\,dx$. Можно посчитать этот интеграл суммой Римана, а можно — методом Монте-Карло, который особенно нагляден.

Монте-Карло: бросаем точки

Кидаем случайные точки в единичный квадрат $[0,1]\times[0,1]$. Точка попадает в четверть круга, если $x^2+y^2 \le 1$. Доля попавших точек примерно равна отношению площадей — то есть $\frac{\pi}{4}$. Умножаем долю на $4$ и получаем оценку $\pi$.

import random
import math

random.seed(42)
for n in [1000, 10000, 100000, 1000000]:
    inside = 0
    for _ in range(n):
        x = random.random()
        y = random.random()
        if x*x + y*y <= 1.0:
            inside += 1
    pi_est = 4 * inside / n
    print(f"n={n:>7}  оценка pi = {pi_est:.5f}  ошибка={abs(pi_est-math.pi):.5f}")

print("настоящее pi =", round(math.pi, 5))

Вывод:

n=   1000  оценка pi = 3.12800  ошибка=0.01359
n=  10000  оценка pi = 3.12880  ошибка=0.01279
n= 100000  оценка pi = 3.13988  ошибка=0.00171
n=1000000  оценка pi = 3.14056  ошибка=0.00103
настоящее pi = 3.14159

С ростом числа бросков оценка приближается к $\pi$. Случайность, усреднённая по миллиону точек, выдаёт фундаментальную математическую константу. Зерно генератора фиксировано (`seed(42)`), поэтому вывод воспроизводим.

Скорость сходимости

У Монте-Карло своя цена: ошибка убывает медленно — как $\frac{1}{\sqrt{n}}$. Чтобы добавить один верный знак, надо в $100$ раз больше точек. Для одномерных интегралов это хуже трапеций и Симпсона. Но в высоких размерностях Монте-Карло незаменим: там сетка из прямоугольников взрывается экспоненциально, а случайные точки работают всегда.

Как работает под капотом

Каждая точка — это честный «эксперимент»: попала в круг или нет. Доля успехов — это эмпирическая вероятность попадания, а вероятность по определению равна отношению благоприятной площади ко всей. Поскольку площадь квадрата равна $1$, доля попаданий прямо даёт площадь четверти круга. Закон больших чисел гарантирует, что с ростом числа испытаний эмпирическая доля сходится к истинной вероятности.

Частые ошибки

Первая — забыть умножить долю на $4$: сама доля даёт лишь $\frac{\pi}{4}$. Вторая — ждать высокой точности при малом $n$: из-за закона $\frac{1}{\sqrt{n}}$ тысяча точек даёт лишь два-три знака. Третья — не зафиксировать зерно генератора и удивляться, что вывод каждый раз разный (для воспроизводимости ставьте `random.seed`). Четвёртая — применять Монте-Карло там, где детерминированные методы (Симпсон) точнее и быстрее.

Итог

  • Монте-Карло оценивает площади и интегралы случайными точками.
  • $\pi = 4\cdot$ доля точек, попавших в четверть круга.
  • Ошибка убывает как $\frac{1}{\sqrt{n}}$ — медленно, но надёжно.
  • Метод незаменим в высоких размерностях.
Проверьте себя
1. Почему в методе Монте-Карло оценку доли точек умножают на 4?
AТак точнее
BДоля даёт площадь четверти круга π/4, а нужно π
CЧтобы убрать отрицательные значения
DЭто случайный коэффициент
2. Как убывает ошибка метода Монте-Карло с ростом числа точек n?
AКак 1/n
BКак 1/√n
CКак 1/n²
DНе убывает