Методы Монте-Карло

Примеры

Приближенное вычисление числа

Пусть -- случайный вектор, равномерно распределенный на квадрате . Плотность распределения: в .

Пусть -- единичный круг с центром в точке . Вероятность того, что случайный вектор попадёт в круг, равна

Определим также случайную величину , равную 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*");

Приближенное вычисление определенного интеграла

Источники:

  1. Бахвалов, Жидков, Кобельков "Численные методы"
  2. Modest Radiative heat transfer, 2013.

Требуется найти определенный интеграл .

Пусть -- случайная величина с равномерным распределением на . Плотность распределения:

Введем случайную величину , тогда

Таким образом,

Для приближенного вычисления интеграла рассмотрим попарно независимых, одинаково распределенных (с распределением, как у ) случайных величин . Положим , здесь -- попарно независимые сл.в.

В силу закона больших чисел

Алгоритм:

  1. Сгенерировать выборку с распределением по формуле , где -- выборка с распределением .
  2. Найти .

Код:

# Вычисление интеграла от 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] приводится формула с весом: где Плотность распределения выбирается так, чтобы было примерно постоянным на , тогда все элементы выборки вносят примерно одинаковый вклад в сумму.

Формула для вычисления интеграла: Здесь выборка распределена по закону .

Генерация случайной величины с заданным законом распределения

Источники:

  1. Генераторы непрерывно распределенных случайных величин, Хабрахабр.
  2. Сборник задач по математике для втузов. Часть 3. ТВ и МС. Под ред. А.В. Ефимова. - М.: Наука, 1990.

Пусть -- заданная функция распределения.

Алгоритм:

  1. Сгенерировать выборку с распределением .
  2. Найти .

Код:

# Датчик случайной величины с распределением Лапласа
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);

Гистограмма, построенная по датчику случайной величины с распределением Лапласа:

Гистограмма, построенная по датчику случайной величины с нормальным распределением:

results matching ""

    No results matching ""