Идея метода Монте-Карло

Урок о том, как заменить страшные производные простым перебором случайных вариантов входов.

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

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

Три шага метода

Идея сводится к трём шагам, повторяемым много раз. Сначала разыгрываем каждый вход как случайную величину согласно его распределению (обычно нормальному с известным СКО). Затем подставляем разыгранный набор в формулу и получаем один результат. Повторив это $N$ раз, получаем выборку результатов, по которой считаем среднее и СКО — это и есть оценка значения и его неопределённости.

$$u(y) \approx \text{стандартное отклонение выборки } \{y_1, y_2, \ldots, y_N\}$$

Этот подход закреплён в международном руководстве GUM (Supplement 1) как полноценная альтернатива классической формуле.

Почему это работает

Метод буквально воспроизводит то, что происходило бы при многократном повторении эксперимента: случайные входы порождают случайный результат, и его разброс и есть неопределённость. Никаких приближений линеаризации — формула используется как есть, во всей нелинейности.

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

Оценим неопределённость площади $S = a \cdot b$ методом Монте-Карло и сравним с классической формулой из прошлого раздела (она дала $\sigma_S \approx 1{,}12$).

import random, statistics
random.seed(42)

a, b = 10.0, 5.0
sa, sb = 0.1, 0.1

N = 200000
resultaty = []
for _ in range(N):
    a_sl = random.gauss(a, sa)
    b_sl = random.gauss(b, sb)
    resultaty.append(a_sl * b_sl)

sr = statistics.mean(resultaty)
u = statistics.pstdev(resultaty)
print("Среднее S:", round(sr, 3))
print("Неопределённость u(S) по Монте-Карло:", round(u, 3))
print("Сравнение с формулой производных: ≈ 1.12")

Вывод:

Среднее S: 50.001
Неопределённость u(S) по Монте-Карло: 1.118
Сравнение с формулой производных: ≈ 1.12

Монте-Карло дал ту же неопределённость 1,12, что и аналитическая формула. Для линейной задачи методы совпадают — но Монте-Карло справится и там, где производные бессильны.

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

  • Брать слишком мало прогонов $N$: оценка неопределённости сама зашумлена. Нужны десятки и сотни тысяч.
  • Неправильно задавать распределения входов (например, нормальное там, где вход равномерен).
  • Забывать зафиксировать seed при необходимости воспроизводимости результата.

Итог

  • Монте-Карло разыгрывает входы случайно и собирает распределение результата.
  • СКО этого распределения и есть оценка неопределённости.
  • Метод не требует производных и не предполагает нормальности результата.
  • Для линейных задач совпадает с классической формулой, но мощнее для нелинейных.
Проверьте себя
1. Что в методе Монте-Карло служит оценкой неопределённости результата?
Aсреднее результатов
Bстандартное отклонение выборки результатов
Cчисло прогонов N
Dмаксимум результатов
2. В чём преимущество Монте-Карло перед классической формулой производных?
Aвсегда точнее на линейных задачах
Bне требует производных и не предполагает нормальности результата
Cработает быстрее
Dне нуждается в данных о погрешностях входов