Методы Монте-Карло
Примеры
Приближенное вычисление числа
Пусть -- случайный вектор, равномерно распределенный на квадрате . Плотность распределения: в .
Пусть -- единичный круг с центром в точке . Вероятность того, что случайный вектор попадёт в круг, равна
Определим также случайную величину , равную 1, если , и 0 в противном случае. Очевидно, что .
Пусть -- повторная выборка, т.е. совокупность попарно независимых и одинаково распределенных (с таким же распределением, как ) случайных величин. Согласно закону больших чисел, то есть
Для приближенной оценки числа сгенерируем пар случайных величин с распределением , затем найдем , и положим , если , и в противном случае.
Оценка числа :
Используем пакет GNU Octave. Датчик случайных чисел -- функция rand, в которой реализован алгоритм "Вихрь Мерсенна" с периодом .
# Оценка числа pi
# N -- количество точек
function ret = pi_est(N)
s = 0;
for i = 1 : N
p = 2 * rand(1, 2) - 1;
s += p(1) ^ 2 + p(2) ^ 2 < 1;
endfor
ret = 4 * s / N;
endfunction
Далее возьмем значения и для каждого проведем 5 вычислений оценки числа .
Результаты представлены на следующем графике.
Также для каждого посчитаем по 5 оценкам среднеквадратичное отклонение от числа .
Отметим, что при каждом запуске программы будут получаться разные графики ввиду случайности.
Код:
clear all
more off
Nval = 1000 : 1000 : 25000;
M = 5;
for i = 1 : length(Nval)
N = Nval(i)
rms = 0;
for k = 1 : M
est = pi_est(N);
rms += (est - pi) ^ 2;
px(i, k) = N;
py(i, k) = est;
endfor
rms_vec(i) = sqrt(rms / M);
endfor
figure
plot(Nval, rms_vec);
px_ = vec(px')';
py_ = vec(py')';
figure
plot(px_, py_, "r*");
Приближенное вычисление определенного интеграла
Источники:
- Бахвалов, Жидков, Кобельков "Численные методы"
- Modest Radiative heat transfer, 2013.
Требуется найти определенный интеграл .
Пусть -- случайная величина с равномерным распределением на . Плотность распределения:
Введем случайную величину , тогда
Таким образом,
Для приближенного вычисления интеграла рассмотрим попарно независимых, одинаково распределенных (с распределением, как у ) случайных величин . Положим , здесь -- попарно независимые сл.в.
В силу закона больших чисел
Алгоритм:
- Сгенерировать выборку с распределением по формуле , где -- выборка с распределением .
- Найти .
Код:
# Вычисление интеграла от f на (a, b) при помощи выборки длины N
function ret = calc_integral(f, a, b, N)
s = 0;
for i = 1 : N
x = a + rand * (b - a);
s += f(x);
endfor
ret = (b - a) / N * s;
endfunction
Пример: .
Проведем такие же вычисления, как и для числа .
Значения интеграла в зависимости от :
Среднеквадратичное отклонение от точного значения интеграла:
В [2] приводится формула с весом: где Плотность распределения выбирается так, чтобы было примерно постоянным на , тогда все элементы выборки вносят примерно одинаковый вклад в сумму.
Формула для вычисления интеграла: Здесь выборка распределена по закону .
Генерация случайной величины с заданным законом распределения
Источники:
- Генераторы непрерывно распределенных случайных величин, Хабрахабр.
- Сборник задач по математике для втузов. Часть 3. ТВ и МС. Под ред. А.В. Ефимова. - М.: Наука, 1990.
Пусть -- заданная функция распределения.
Алгоритм:
- Сгенерировать выборку с распределением .
- Найти .
Код:
# Датчик случайной величины с распределением Лапласа
function ret = gen_laplace()
y = rand;
ret = laplace_inv(y);
endfunction
# Датчик случайной величины с нормальным распределением
function ret = gen_normal()
y = rand;
ret = norminv(y);
endfunction
N = 25000;
sample_laplace = sample_normal = zeros(1, N);
for i = 1 : N
sample_laplace(i) = gen_laplace();
endfor
figure
hist(sample_laplace, 40);
for i = 1 : N
sample_normal(i) = gen_normal();
endfor
figure
hist(sample_normal, 40);
Гистограмма, построенная по датчику случайной величины с распределением Лапласа:
Гистограмма, построенная по датчику случайной величины с нормальным распределением: