Новички часто воспринимают математику и имитационное моделирование как две совершенно разные, никак не связанные между собой вещи. Возникает этакая отчуждённость. И это понятно: современное программное обеспечение позволяет закрывать глаза на разного рода «ненужные» тонкости – достаточно перетащить блок, нажать кнопку, и модель уже работает. Проблема в том, что именно из-за этого мы постепенно теряем понимание основ. Но то, что кажется сиюминутно бесполезным, может быть стратегически важным. Потому что сама возможность моделировать – генерировать случайность, описывать динамику, получать достоверные результаты – опирается на дифференциальные уравнения и вероятностные распределения.
Поэтому я считаю важным данной статьёй провести небольшой экскурс в мир нестрашной математики на примере самых востребованных распределений имитационного моделирования. Зная их и немного статистики, уже можно называть себя неплохим «модельером». Так давайте сделаем ещё один шаг к этому званию.
Равномерное распределение (uniform)
В данном распределении каждое значение в заданном интервале имеет одинаковую вероятность.
min ≤ x ≤ max, где x — результат, min и max — нижняя и верхняя границы.
Пример использования в AnyLogic:
Размещаем дом на GIS-карте в случайной точке внутри прямоугольной области:
x = uniform(x_min, x_max);
y = uniform(y_min, y_max);
house.setLocation(x, y);
Треугольное распределение (triangular)
Вероятность плавно нарастает от минимума к наиболее вероятному значению и так же плавно спадает к максимуму.
min ≤ x ≤ max, где x — результат, min — минимум, mode — наиболее вероятное значение, max — максимум.
Пример использования в AnyLogic:
Моделируем количество пассажиров в маршрутке: меньше 0 не садится, больше 20 салон не вмещает, чаще всего едет 5 человек:
passengers = triangular(0, 5, 20);
Используется, когда наиболее вероятное значение не находится посередине между минимумом и максимумом, а симметричный «купол» (как у нормального распределения) не требуется — распределение имеет форму треугольника с острой вершиной.
Экспоненциальное распределение (exponential)
Описывает время между независимыми событиями; много коротких промежутков, мало длинных.
f(x) = λ e^(-λx), x ≥ 0
где x — результат (время между событиями), λ — интенсивность (средняя частота, обратная среднему интервалу).
Пример использования в AnyLogic:
Моделируем интервалы между заходами посетителей на сайт — в среднем каждые 2 минуты:
intervisitTime = exponential(1.0 / 2);
Используется, когда нужно смоделировать поток событий с постоянной интенсивностью, но без «памяти»: вероятность наступления события в следующий момент не зависит от того, сколько времени прошло с предыдущего. В отличие от равномерного, где интервалы строго ограничены и ожидание «сгорает», здесь возможны сколь угодно долгие паузы и внезапные всплески активности подряд.
Нормальное распределение (normal)
Симметричное колоколообразное распределение, значения концентрируются вокруг среднего.
f(x) = (1/(σ√(2π))) * exp(-(x-μ)²/(2σ²))
где x — результат, μ — среднее (mean), σ — стандартное отклонение (stddev).
Пример использования в AnyLogic:
Моделируем рост мужчины: большинство около 175 см с разбросом 7 см:
height = normal(175, 7);
Благодаря центральной предельной теореме широко распространено в природе и технике: суммы множества независимых малых факторов стремятся к нормальному распределению.
Логнормальное распределение (lognormal)
Всегда положительное, с длинным правым хвостом; подходит для величин, которые не могут быть отрицательными.
x = min + exp(mu + sigma * Z), где Z ~ N(0,1)
x ≥ min, где x — результат, mu и sigma — среднее и стандартное отклонение логарифма величины, min — сдвиг (часто 0).
Пример использования в AnyLogic:
Моделируем длительность болезни: большинство болеет 5–7 дней, стандартное отклонение порядка 3 дней (бывают затяжные случаи до 40 дней).
illnessDuration = lognormal(1.6, 0.5);
Как получены параметры:
Если известны среднее M и стандартное отклонение S итоговой величины (при min = 0), то
sigma = sqrt(ln(1 + (S/M)^2))
mu = ln(M) — sigma^2 / 2
Для M ≈ 5.6, S ≈ 3 получаем sigma ≈ 0.5, mu ≈ 1.6.
Гамма распределение (gamma)
Описывает время, необходимое для накопления нескольких независимых экспоненциальных этапов с одинаковой средней длительностью.
x ≥ min, где x — результат, shape — количество этапов, scale — средняя длительность одного этапа, min — минимально возможное время (часто 0).
Пример использования в AnyLogic:
Моделируем время доставки груза с двумя перевалками (три этапа: склад → сортировка → склад). Каждый этап длится в среднем 2 дня экспоненциально. Общее время в пути — гамма с shape = 3, scale = 2:
deliveryTime = gamma(3, 2);
Используется, когда итоговое время складывается из нескольких последовательных независимых стадий, каждая из которых обладает свойством «без памяти» и одинаковой средней продолжительностью.
Вместо заключения
Всё это я освоила на практике путём проб и ошибок (не самый лучший путь). Если знаете какие полезные книги или курсы на тему максимально прикладной математики, жду ваши комментарии под постом. Это будет полезно как мне (нет предела совершенству), так и новичкам, только начавшим этот сложный путь.
ссылка на оригинал статьи https://habr.com/ru/articles/1045386/