Простой и элегантный способ оценки по Монте-Карло описан в этой статье . Бумага на самом деле об обучении e . Следовательно, подход кажется идеально подходящим для вашей цели. Идея основана на упражнении из популярного российского учебника по теории вероятностей Гнеденко. Смотри ex.22 на стр.183ee
Случается так, что , где ξ - случайная величина, которая определяется следующим образом. Это минимальное число п такое , что Σ п я = 1 г я > 1 и г я случайные числа от равномерного распределения на [ 0 , 1 ] . Красиво, не правда ли ?!E[ξ]=eξn∑ni=1ri>1ri[0,1]
Поскольку это упражнение, я не уверен, что для меня было бы здорово опубликовать решение (доказательство) здесь :) Если вы хотите доказать это сами, вот совет: глава называется «Моменты», которая должна указывать Вы в правильном направлении.
Если вы хотите реализовать это самостоятельно, не читайте дальше!
Это простой алгоритм для моделирования Монте-Карло. Нарисуйте случайный случайный случай, затем еще один и так далее, пока сумма не превысит 1. Количество нарисованных рандомов - ваше первое испытание. Допустим, вы получили:
0.0180
0.4596
0.7920
Затем ваше первое испытание было выполнено 3. Продолжайте выполнять эти испытания, и вы заметите, что в среднем вы получаете .e
Код MATLAB, результат моделирования и гистограмма следуют.
N = 10000000;
n = N;
s = 0;
i = 0;
maxl = 0;
f = 0;
while n > 0
s = s + rand;
i = i + 1;
if s > 1
if i > maxl
f(i) = 1;
maxl = i;
else
f(i) = f(i) + 1;
end
i = 0;
s = 0;
n = n - 1;
end
end
disp ((1:maxl)*f'/sum(f))
bar(f/sum(f))
grid on
f/sum(f)
Результат и гистограмма:
2.7183
ans =
Columns 1 through 8
0 0.5000 0.3332 0.1250 0.0334 0.0070 0.0012 0.0002
Columns 9 through 11
0.0000 0.0000 0.0000
ОБНОВЛЕНИЕ: я обновил свой код, чтобы избавиться от массива результатов испытаний, чтобы он не занимал ОЗУ. Я также напечатал оценку PMF.
Обновление 2: вот мое решение Excel. Поместите кнопку в Excel и свяжите ее со следующим макросом VBA:
Private Sub CommandButton1_Click()
n = Cells(1, 4).Value
Range("A:B").Value = ""
n = n
s = 0
i = 0
maxl = 0
Cells(1, 2).Value = "Frequency"
Cells(1, 1).Value = "n"
Cells(1, 3).Value = "# of trials"
Cells(2, 3).Value = "simulated e"
While n > 0
s = s + Rnd()
i = i + 1
If s > 1 Then
If i > maxl Then
Cells(i, 1).Value = i
Cells(i, 2).Value = 1
maxl = i
Else
Cells(i, 1).Value = i
Cells(i, 2).Value = Cells(i, 2).Value + 1
End If
i = 0
s = 0
n = n - 1
End If
Wend
s = 0
For i = 2 To maxl
s = s + Cells(i, 1) * Cells(i, 2)
Next
Cells(2, 4).Value = s / Cells(1, 4).Value
Rem bar (f / Sum(f))
Rem grid on
Rem f/sum(f)
End Sub
Введите количество испытаний, например 1000, в ячейку D1 и нажмите кнопку. Вот как должен выглядеть экран после первого запуска:
ОБНОВЛЕНИЕ 3: Серебряная рыбка вдохновила меня на другой путь, не такой элегантный, как первый, но все же крутой. Он рассчитал объемы n-симплексов с использованием последовательностей Соболя .
s = 2;
for i=2:10
p=sobolset(i);
N = 10000;
X=net(p,N)';
s = s + (sum(sum(X)<1)/N);
end
disp(s)
2.712800000000001
По совпадению он написал первую книгу о методе Монте-Карло, которую я прочитал еще в старшей школе. На мой взгляд, это лучшее введение в метод.
ОБНОВЛЕНИЕ 4:
Silverfish в комментариях предложил простую реализацию формулы Excel. Вот такой результат вы получите с его подходом после примерно 1 миллиона случайных чисел и 185K испытаний:
Очевидно, что это намного медленнее, чем реализация Excel VBA. Особенно, если вы измените мой код VBA, чтобы не обновлять значения ячеек внутри цикла, а делать это только после сбора всей статистики.
ОБНОВЛЕНИЕ 5
Решение Сианя №3 тесно связано (или даже в некотором смысле то же, что и комментарий jwg в ветке). Сложно сказать, кто придумал эту идею сначала Форсайт или Гнеденко. Оригинальное издание Гнеденко 1950 года на русском языке не имеет разделов «Проблемы» в главах. Таким образом, я не смог найти эту проблему с первого взгляда, где она есть в более поздних выпусках. Возможно это было добавлено позже или похоронено в тексте.
Как я прокомментировал в ответе Сианя, подход Форсайта связан с другой интересной областью: распределением расстояний между пиками (экстремумами) в случайных (IID) последовательностях. Среднее расстояние оказывается равным 3. Последовательность обратного хода в подходе Форсайта заканчивается дном, поэтому, если вы продолжите выборку, вы получите еще одно дно в какой-то момент, затем еще одно и т. Д. Вы можете отслеживать расстояние между ними и строить распределение.
R
команда2 + mean(exp(-lgamma(ceiling(1/runif(1e5))-1)))
. (Если использование гамма-функции журнала вас беспокоит, замените ее2 + mean(1/factorial(ceiling(1/runif(1e5))-2))
, которая использует только сложение, умножение, деление и усечение, и игнорируйте предупреждения о переполнении.) Что может быть более интересным, так это эффективные симуляции: можете ли вы минимизировать количество вычислительные шаги, необходимые для оценки