Open Marshhhhh opened 8 years ago
simulate_walk <- function(lower = -10, upper = 10, n_max = 200, p = 1e-3) { current_position <- (lower + upper) / 2 for (i in 1:n_max) { is_absorbed <- rbinom(1, 1, p) if (is_absorbed) return(list(status = "Absorbed", position = current_position, steps = i)) current_position <- current_position + rnorm(1) if (current_position < lower) return(list(status = "Left breach", position = current_position, steps = i)) if (current_position > upper) return(list(status = "Right breach", position = current_position, steps = i)) } return(list(status = "Max steps reached", position = current_position, steps = n_max)) }
result <- replicate(1000, simulate_walk(), simplify = FALSE) result <- data.frame( status = sapply(result, function(x) x$status), position = sapply(result, function(x) x$position), steps = sapply(result, function(x) x$steps) )
tapply(result$position, result$status, length) tapply(result$steps, result$status, mean)
Задача При помощи функции simulate_walk из предыдущего видео можно моделировать случайное блуждание на отрезке [lower, upper]. Это достаточно простой случай. Больший интерес представляют задачи с блужданием по плоскости, то есть в размерности 2.
Возьмите написанную мной функцию и измените её так, чтобы блуждание начиналось в центре координат (0, 0), а все переходы по координатам x и y были бы независимы и имели стандартное нормальное распределение. Если вас пугают эти слова, то это то же самое, что делал я, только отдельно по x и по y.
Процесс обрывается в момент выхода за границу круга с центром в (0, 0) и радиусом 6. Вероятность поглощения на каждом шаге равна 0.01. Максимальное количество шагов — 100. Расстояние, разумеется, евклидово: расстояние от точки (x, y) до (0, 0) есть x2+y2−−−−−−√x2+y2. Один шаг процесса подразумевает изменение обеих координат одновременно!
Теперь, когда все параметры зафиксированы, вероятность выхода частицы за пределы круга строго определена. Наша задача — найти эту вероятность. Это некоторое число, не зависящее от реализации алгоритма. Его можно даже вычислить теоретически, но это не так-то просто. Поэтому в подобных случаях пользуются моделированием: запускают алгоритм достаточно большое количество раз (скажем, миллион траекторий) и оценивают долю частиц, вылетевших за границу. Эта доля и есть приближение вероятности, которую мы ищем (реверанс в сторону закона больших чисел).
Для того, чтобы в нашей задаче определить нужную вероятность с точностью до целых процентов, достаточно будет ста тысяч запусков, у меня это несколько секунд. Если у вас считается слишком долго, то грубую оценку можно получить и для десяти тысяч запусков.
В ответе укажите вероятность вылета частицы в процентах, с точностью до целых процентов, в виде XX (например, 14, без указания значка процентов). Вероятность должна получиться больше 50%.
Подсказки:
для быстродействия можно не возвращать список, как делаю я, а просто число, например: 1 — поглощение, 2 — вылет за границу, 3 — максимальное число шагов; если вы воспользовались предыдущим советом, то в replicate оставьте simplify = TRUE, тогда результатом будет вектор исходов; если функция получилась совсем медленной, то и тысячи траекторий хватит, чтобы попасть в диапазон правильного ответа плюс-минус пара процентов.