Javascript must be enabled in your browser to use this page.
Please enable Javascript under your Tools menu in your browser.
Once javascript is enabled Click here to go back to �нтеллектуальная Кобринщина

Perform a Monte Carlo Simulation - Wolfram Mathematica

Моделирование методом Монте-Карло

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

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

Воспользуемся функцией RandomVariate вместе с NormalDistribution для создания последовательности из 20 чисел по нормальному распределению, со средним 0 и стандартным отклонением 1:

In[1]:=

PerformAMonteCarloSimulationRU_1.gif

Out[1]=

PerformAMonteCarloSimulationRU_2.gif

Применим функцию ListPlot для визуализации данных:

In[2]:=

PerformAMonteCarloSimulationRU_3.gif

Out[2]=

PerformAMonteCarloSimulationRU_4.gif

По полученным данным можно построить график случайного блуждания:

In[3]:=

PerformAMonteCarloSimulationRU_5.gif

Out[3]=

PerformAMonteCarloSimulationRU_6.gif

Чтобы начать блуждание с нуля, добавим ноль в начало списка:

In[4]:=

PerformAMonteCarloSimulationRU_7.gif

Out[4]=

PerformAMonteCarloSimulationRU_8.gif

In[5]:=

PerformAMonteCarloSimulationRU_9.gif

Out[5]=

PerformAMonteCarloSimulationRU_10.gif

Используем команду Accumulate для последовательного суммирования данных, отобразив полученные результаты при помощи ListLinePlot:

In[13]:=

PerformAMonteCarloSimulationRU_11.gif

Out[13]=

PerformAMonteCarloSimulationRU_12.gif

Следующее определение объединяет вместе предыдущие команды для создания случайного блуждания, которое Вы можете использовать для моделирования множества случайных блужданий и анализа их свойств.

Определим функцию randomWalk, которая генерирует случайные блуждания длиной n:

In[36]:=

PerformAMonteCarloSimulationRU_13.gif

Функция Table использована для создания пяти случайных блужданий, с одинаковой длиной 100. Все они отображены при помощи команды ListLinePlot:

In[15]:=

PerformAMonteCarloSimulationRU_14.gif

Out[15]=

PerformAMonteCarloSimulationRU_15.gif

Теперь сгенерируем 1000 блужданий длиной 100. Вывод такого большого результата на экран подавляется при помощи точки с запятой (;), так как видеть его совсем не обязательно:

In[16]:=

PerformAMonteCarloSimulationRU_16.gif

Теперь Вы можете проводить вычисления описательной статистики для любых аспектов случайных блужданий. Ниже приведен анализ конечной позиции каждого блуждания.

Используем [[ ]] (краткая форма записи функции Part) для извлечения конечной точки каждого случайного блуждания:

In[17]:=

PerformAMonteCarloSimulationRU_17.gif

Рассчитаем различные статистические показатели для конечных точек 1000 случайных блужданий:

In[18]:=

PerformAMonteCarloSimulationRU_18.gif

Out[18]=

PerformAMonteCarloSimulationRU_19.gif

    

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

Сгенерируем 10,000 точек в в квадрате, ограниченном значениями {-1,-1} и {1,1}:

In[19]:=

PerformAMonteCarloSimulationRU_20.gif

Просмотрим полученные точки:

In[20]:=

PerformAMonteCarloSimulationRU_21.gif

Out[20]=

PerformAMonteCarloSimulationRU_22.gif

Для приблизительного вычисления ?, умножим площадь квадрата на процентное соотношение точек, попадающих в круг радиусом 1 с центром в начале координат.

Умножим площадь квадрата (в данном случае 4) на относительную массу точек, находящихся внутри круга:

In[21]:=

PerformAMonteCarloSimulationRU_23.gif

Out[21]=

PerformAMonteCarloSimulationRU_24.gif

Использование большего количества точек или среднего для нескольких аппроксимаций, как правило, дает лучшее приближеное значение.

Определим функцию approxPi для нахождения приблизительного значения ? из набора данных размера n:

In[22]:=

PerformAMonteCarloSimulationRU_25.gif

Проведем аппроксимацию ?, используя миллион точек:

In[23]:=

PerformAMonteCarloSimulationRU_26.gif

Out[23]=

PerformAMonteCarloSimulationRU_27.gif

Рассчитаем приблизительное значение ? как среднее от 50 аппроксимаций из набора данных размера 10000:

In[24]:=

PerformAMonteCarloSimulationRU_28.gif

Out[24]=

PerformAMonteCarloSimulationRU_29.gif

    

Моделирование методом Монте-Карло часто бывает полезно при рассмотрении систем со сложными свойствами. В Байесовском анализе, зачастую понадобится совместить два рас пределения, где параметры каждого следуют друг за другом, создавая двумерное распределение. Из-за взаимной зависимости исходных распределений, точки должны поочередно рассчитываться из образованного двумерного распределения  и включаться в результирующую выборку.

Этот способ генерации выборки совместного распределения называется методом Гиббса. По завершению последовательного расчета, полученные точки будут вплотную следовать смешанной выборке. Количество итераций называется интервалом приработки.

Например, у Вас есть нормальное распределение, для которого дано среднее, но неизвестно стандартное отклонение. При этом известно, что стандартное отклонение следует бета-распределению, которое имеет общеизвестный параметр формы, а другой параметр формы соответствует нормальному распределению, для которого известно среднее.

Определим функцию, генерирующую случайные числа по нормальному распределению:

In[25]:=

PerformAMonteCarloSimulationRU_30.gif

Определим функцию, генерирующую случайные числа по бета-распределению.  Вторым параметром формы бета-распределения будет абсолютное значение переменной с нормальном распределением:

In[26]:=

PerformAMonteCarloSimulationRU_31.gif

Можно рассчитывать точки на основании двумерного распределения, взяв за начальное значение нормальное стандартное отклонение, а затем, поочередно генерируя случайные числа по нормальному и бета-распределениям. Переменная с нормальным распределением генерируется при помощи начального значения для нормального стандартного отклонения. Затем генерируется бета-переменная, с использованием переменной с нормальным распределением в качестве неизвестного параметра формы для бета-распределения. Полученная бета-переменная затем используется как неизвестное стандартное отклонение для нового нормального распределения и так далее. Этот процесс выполняется отпределенное количество циклов, и полученные в результате нормально распределенные и бета-переменные являются координатами рассчитанных точек.

Сгенерируем 500 точек, начав со значения стандартного отклонения 0,5 и выполнив 1000 итераций в качестве интервала приработки:

In[27]:=

PerformAMonteCarloSimulationRU_32.gif

Отобразим полученные в результате точки при помоши функции ListPlot:

In[28]:=

PerformAMonteCarloSimulationRU_33.gif

Out[28]=

PerformAMonteCarloSimulationRU_34.gif

Визуализируем плотность распределения точек, при помощи функции Histogram3D:

In[29]:=

PerformAMonteCarloSimulationRU_35.gif

Out[29]=

PerformAMonteCarloSimulationRU_36.gif

Другие примеры применения метода Монте-Карло для статистических оценок включают в себя оптимизацию и многомерную интеграцию. Функции NMinimize и NIntegrate содержат методы оптимизации и численной интеграции, использующие эти техники.