математических задач при помощи моделирования случайных величин. Представление об истории метода и простейшие примеры его применения можно найти в Википедии.
В самом методе нет ничего сложного. Именно эта простота объясняет популярность данного метода.
Метод имеет две основных особенности. Первая — простая структура вычислительного алгоритма. Вторая — ошибка вычислений, как правило, пропорциональна
Однако одну и ту же задачу можно решать различными вариантами метода Монте-Карло, которым отвечают различные значения
Общая схема метода
Допустим, что нам требуется вычислить какую-то неизвестную величину m. Попытаемся придумать такую случайную величину
Рассмотрим
На основе Центральной предельной теоремы (или если хотите предельной теоремы Муавра-Лапласа) не трудно получить соотношение:
где
Это — чрезвычайно важное для метода Монте-Карло соотношение. Оно дает и метод расчета
В самом деле, найдем
В зависимости от целей последнее соотношение используется по разному:
- Если взять k=3, то получим так называемое «правило
»:
- Если требуется конкретный уровень надежности вычислений
,
Точность вычислений
Как видно из приведенных выше соотношений, точность вычислений зависит от параметра
В этом пункте хотелось бы указать важность именно второго параметра
Вычисление определенного интеграла эквивалентно вычислению площадей, что дает интуитивно понятный алгоритм вычисления интеграла (см. статью в Википедии). Я рассмотрю более эффективный метод (частный случай формулы для которого, впрочем, тоже есть в статье из Википедии). Однако не все знают, что вместо равномерно распределенной случайной величины в этом методе можно использовать практически любую случайную величину, заданную на том же интервале.
Итак, требуется вычислить определенный интеграл:
Выберем произвольную случайную величину
Математическое ожидание последней случайной величины равно:
Таким образом, получаем:
Последнее соотношение означает, что если выбрать
Таким образом, для вычисления интеграла, можно использовать практически любую случайную величину
Можно показать, что
Численный пример
Теория, конечно, дело хорошее, но давайте рассмотрим численный пример:
Вычислим значение интеграла с применением двух различных случайных величин.
В первом случае будем использовать равномерно распределенную случайную величину на [a,b], т.е.
Во втором случае возьмем случайную величину с линейной плотностью на [a,b], т.е.
Вот график, указанных функций

Нетрудно видеть, что линейная плотность лучше соответствует функции
restart; with(Statistics): with(plots): #исходные функции g:=x->cos(x): a:=0: b:=Pi/2: N:=10000: #плотности распределений p1:=x->piecewise(x>=a and x<b,1/(b-a)): p2:=x->piecewise(x>=a and x<b,4/Pi-8*x/Pi^2): #графики plot([g(x),p1(x),p2(x)],x=a..b, legend=[g,p1,p2]); #Точное значение интеграла I_ab:=int(g(x),x=0..b); #функция метода Монте-Карло для вычисления приближенного вычисления интеграла #не стоит ее использовать при реальных расчетах INT:=proc(g,p,N) local xi; xi:=Sample(RandomVariable(Distribution(PDF = p)),N); evalf(add(g(xi[i])/p(xi[i]),i=1..N)/N); end proc: #Приближенное значение интеграла I_p1:=INT(g,p1,N);#c равномерной плотностью I_p2:=INT(g,p2,N);#c линейной плотностью #Абсолютная погрешность Delta1:=abs(I_p1-I_ab);#c равномерной плотностью Delta2:=abs(I_p2-I_ab);#c линейной плотностью #Относительные погрешности в процентах delta1:=Delta1/I_ab*100;#c равномерной плотностью delta2:=Delta2/I_ab*100;#c линейной плотностью #Вычисление дисперсий Dzeta1:=evalf(int(g(x)^2/p1(x),x=a..b)-1); Dzeta2:=evalf(int(g(x)^2/p2(x),x=a..b)-1); #Оценка погрешности в первом случае 3*sqrt(Dzeta1)/sqrt(N); #Оценка погрешности во втором случае 3*sqrt(Dzeta2)/sqrt(N);
Файл с данной программой можно взять тут
Точное значение интеграла легко вычислить аналитически, оно равно 1.
Результаты одного моделирования при
Для равномерно распределенной случайной величины:
Для случайной величины с линейной плотностью распределения:
В первом случае относительная погрешность более 21%, а во втором 2.35%. Точность
Думаю, данный модельный пример показывает важность выбора случайной величины в методе Монте-Карло. Выбрав, правильную случайную величину, можно получить более высокую точность вычислений, при меньшем числе итераций.
Конечно, так не вычисляют одномерные интегралы, для этого есть более точные квадратурные формулы. Но ситуация меняется при переходе к многомерным интегралам, т.к. квадратурные формулы становятся громоздкими и сложными, а метод Монте-Карло применяется лишь с небольшими изменениями.
Количество итераций и генераторы случайных чисел
Не трудно видеть, что точность вычислений зависит от количества
При решении некоторых задач для получения приемлемой точности оценки требуется брать очень большое число
Если в качестве источника случайности используется некоторое физическое явление (физический датчик случайных чисел), то все работает отлично.
Часто для вычислений по методу Монте-Карло применяют датчики псевдослучайных чисел. Главная особенность таких генераторов – наличие некоторого периода.
Метод Монте-Карло можно использовать при значениях
При проведении больших расчетов нужно убедиться, что свойства генератора случайных чисел позволяют вам провести эти расчеты. В стандартных генераторах случайных чисел (в большинстве языков программирования) период чаще всего не превосходит 2 в степени разрядности операционной системы, а то и еще меньше. При использовании таких генераторов нужно быть чрезвычайно осторожным. Лучше изучить рекомендации Д.Кнута, и построить свой генератор, имеющий наперед известный и достаточно большой период.
Литература
Популярные лекции по математике 1968. Выпуск 46. Соболь И.М. Метод Монте-Карло. М.: Наука, 1968. — 64 с.

