Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

ЛР / ЛР3 / ИМ ЛР3

.pdf
Скачиваний:
13
Добавлен:
25.06.2023
Размер:
393.49 Кб
Скачать

ГУАП

КАФЕДРА №41

ОТЧЕТ ЗАЩИЩЕН С ОЦЕНКОЙ

ПРЕПОДАВАТЕЛЬ

ассистент

 

 

 

М.Н. Шелест

 

 

 

 

 

 

 

 

 

должность, уч. степень, звание

 

подпись, дата

 

инициалы, фамилия

ОТЧЕТ О ЛАБОРАТОРНОЙ РАБОТЕ №3

МОДЕЛИРОВАНИЕ ВХОДНОГО ПОТОКА ЗАПРОСОВ

по курсу: Имитационное моделирование

РАБОТУ ВЫПОЛНИЛ

СТУДЕНТ ГР. №

подпись, дата

 

инициалы, фамилия

Санкт-Петербург 2022

Цель работы

Исследование основных характеристик входных потоков заявок, а также базовых принципов моделирования СМО по событиям.

Индивидуальный вариант

Индивидуальный вариант номер 10 в соответствии с таблицей 1.

Таблица 1 – Индивидуальный вариант задания

Номер варианта

Порядок эрланговского потока

Параметр λ

10

2

10

Ход работы

1.Формула и график закона распределения интервалов.

Нормальное распределение описывается следующей формулой:

( ; , ) =

−1 −

( − 1)!

График эрлановского распределения для нашего варианта при k = 2, λ = 10 в

соответствии с рисунком 1.

Рисунок 1 – График Эрлановского распределения

2

2. Описание разработанных программ для моделирования нормального закона

распределения.

Список использованных переменных функции random_erlang_val () для генерации

случайного числа эрланговского распределения в соответствии с таблицей 2.

Таблица 2 – Список используемых переменных функции random_erlang_val ()

Название

Описание

переменной

 

k

Константа порядка эрланговского порядка

lmbda

Константа коэффициент эрланговского распределения

N

Количество чисел, которое нужно сгенерировать

f

Лямбда функция генерации случайного числа эрланговского

распределения

 

Для генерации случайных чисел Эрланговского распределения была написана

использована

функция random_erlang_val(k, lmbda, N) в соответствии с

листингом 1.

Листинг 1 – Функция генерации случайных значений Эрланговского распределения

def random_erlang_val(k, lmbda, N=10000):

'''Функция создающая случайное число распределенное по закону Эрланговского распределения'''

f = lambda:-1/lmbda*sum(np.log(np.random.uniform(0,1)) for i in range(k)) return [f() for n in range(N)]

Список использованных переменных функции random_erlang_val () для генерации случайного числа эрланговского распределения в соответствии с таблицей 2.

Таблица 2 – Список используемых переменных функции random_erlang_val ()

Название

Описание

переменной

 

k

Константа порядка эрланговского порядка

lmbda

Константа коэффициент эрланговского распределения

N

Количество чисел, которое нужно сгенерировать

lmbda_old

Текущая оценка интенсивности (в момент итерации цикла)

nu_old

Текущая оценка коэффициента вариации потока (в момент итерации

цикла)

 

lmbda_list

Списки оценок интенсивности для разных N

nu_list

Списки оценок коэффициента вариации потока для разных N

u_list

Список значений выборки эрланговского распределения

loop_cnt

Счетчик цикла

N_array

Список зничений объема выборки при которых производились расчеты

интенсивности и коэффициента вариации потока

 

3

Код функции erlang_model(k, lmbda, N) моделирующей Эрланговский поток в соответствии с листингом 2.

Листинг 2 – Функция создание набора данных выборки для построения графика

def erlang_model(k, lmbda, N=10000):

'''Функция моделирования Эрланговского распределения'''

#Текущая отценка интенсивности и коэффициента вариации потока lmbda_old, nu_old = 1, 1

#Списки оценок интенсивности и коэффициента

#вариации потока для разных N

lmbda_list, nu_list = [], []

#Список значений выборки эрланговского распределения u_list = []

#Счетчик цикла

loop_cnt = 0

#Список зничений объема выборки при которых производились

#расчеты интенсивности и коэффициента вариации потока

N_array = [] while True:

#Добавляем N случайных значений эрланговского закона распределения u_list.extend(random_erlang_val(k, lmbda, N * 2**loop_cnt))

#Добавляем значение нового объема выборки

N_array.append(len(u_list))

#Оценка Мат. ожидания и Дисперсии me = np.mean(u_list)

sigma = np.std(u_list)

#Оценка новых значений интенсивности и коэффициента вариации потока lmbda_new = 1/me

nu_new = sigma/me

#Добавление новых отценок в списки

lmbda_list.append(lmbda_new) nu_list.append(nu_new)

# Проверка достаточности выборки

if abs((lmbda_new - lmbda_old) / lmbda_old) <=0.01 \ and abs((nu_new - nu_old) / nu_old) <= 0.01: break

# Перенос новых оценок на место старых lmbda_old = lmbda_new

nu_old = nu_new

loop_cnt += 1 if len(u_list) != N else 0

# Построение графика по сформированному распределению ploting_erlang_distribution(k, lmbda, data=u_list, add_hist=True)

#Построение графика зависимости оценок

#интенсивности и коэффициента вариации потока

ploting_lambda_nu(k, lmbda, lmbda_list, nu_list, N_array) return u_list, lmbda_list, nu_list

4

График плотности вероятности, построенный по смоделированному Эрлановскому потоку в соответствии с рисунком 3.

3. Графики зависимости оценок интенсивности и коэффициента вариации от объема выборки в соответствии с рисунком 4. На графиках уровнем отметили теоретические значения эти величин.

Рисунок 2 – Графики зависимости оценок интенсивности и коэффициента вариации от N

5

Вывод

Входе данной лабораторной работы мы познакомились с основных характеристик входных потоков заявок, а также базовых принципов моделирования СМО по событиям.

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

Полученные графики приведены в работе, а их анализ показал, что объем выборки для моделирования эрланговского распределения очень важен так как при малом количестве значений высока ошибка, а метрики интенсивности и коэффициента вариации далеки от теоретически рассчитанных для заданных параметров порядка потока k и коэффициента lambda значений.

6

ПРИЛОЖЕНИЕ А. Код программы

from matplotlib import pyplot as plt import numpy as np

def random_erlang_val(k, lmbda, N=10000):

'''Функция создающая случайное число распределенное по закону Эрланговского распределения'''

f = lambda : -1/lmbda * sum(np.log(np.random.uniform(0,1)) for i in range(k))

return [f() for n in range(N)]

def slicearray(array, intervals_cnt = 10):

'''Функция для разбивки списка на интервалы и подсчета кол. попаданий'''

interval=[] # Список интервалов entries = [] # Список кол-ва вхождений x_min, x_max = min(array), max(array)

delta = (x_max - x_min) / intervals_cnt

#Заполняем список интервалов

for x in range (intervals_cnt+1): interval.append(x_min + delta * x)

#Заполняем список кол-ва вхождений for i in range(intervals_cnt):

entries.append(sum(True for x in array if interval[i] < x <=

interval[i+1]))

return interval, entries, x_min, x_max, delta

def ploting_erlang_distribution(k, lmbda, data = [], N=10000, iner_cnt = 50, add_hist=False):

'''Построение графика плотности Эрланговского распределения'''

plt.figure(figsize=(9,7))

#Проверка переданны ли дынные для построения гистограммы if not data: data = random_erlang_val(k, lmbda, N)

else: N = len(data)

#Определение интервалов и их длительности, min/max значений для построения гистограммы

intervals, entries, x_min, x_max, delta = slicearray(data, iner_cnt)

#Проверка добавлять гистограмму или нет

if add_hist:

# Подсчет весов столбцов гистограммы

weights = [cnt / (N * delta) for cnt in entries] plt.hist(intervals[:-1], intervals, weights = weights,

label='Рассчитанное значение')

#Функция плотности вероятности эрланговского распределения для заданных k

иlambda

f = lambda x : ((lmbda**k) * (x**(k-1)) * np.exp(-lmbda*x)) / np.math.factorial(k-1)

# Генерируем список значений x для построения графика

x = np.linspace(0 if x_min<=1 else x_min-1, x_max+1, 100)

plt.plot(x, f(x), label='График плотности вероятности\nЭрланговского распределения\nдля k={}, lambda={}'.format(k, lmbda), color='red')

plt.title("График плотности вероятности\nЭрланговского распределения", fontsize=16)

plt.xlabel("x")

plt.ylabel("y")

plt.legend()

plt.show()

def ploting_lambda_nu(k, lmbda, lmbda_list, nu_list, N_array):

'''Ф-ция построения графиков зависимости оценок интенсивности и

7

коэффициента вариации от объема выборки заданного потока'''

#Расчет теоретических значений lambda_t = lmbda / k

nu_t = 1 / np.sqrt(k)

#Создаем объекты графиков

fig, axis = plt.subplots(1, 2, figsize=(14, 7))

fig.suptitle('Статистика для Эрланговского распределения с k={} и lambda={}'.format(k, lmbda), fontsize=16)

# Строим график зависимости оценок интенсивности от объема выборки axis[0].axhline(lambda_t, color='red', label='Теоретическое значение') axis[0].plot(N_array, lmbda_list, label='Рассчитанное значение') axis[0].set_title('График зависимости\nоценок интенсивности от объема

выборки')

axis[0].set_xlabel('Размер выборки') axis[0].set_ylabel('Оценка интенсивности') axis[0].legend()

# Строим график зависимости оценок коэффициента вариации от объема выборки axis[1].axhline(nu_t, color='red', label='Теоретическое значение') axis[1].plot(N_array, nu_list, label='Рассчитанное значение') axis[1].set_title('График зависимости\nоценок коэффициента вариации от

объема выборки') axis[1].set_xlabel('Размер выборки')

axis[1].set_ylabel('Оценка коэффициента вариации') axis[1].legend()

plt.show()

def erlang_model(k, lmbda, N=10000):

'''Функция моделирования Эрланговского распределения'''

#Текущая отценка интенсивности и коэффициента вариации потока lmbda_old, nu_old = 1, 1

#Списки оценок интенсивности и коэффициента вариации потока для разных N lmbda_list, nu_list = [], []

#Список значений выборки эрланговского распределения

u_list = []

#Счетчик цикла loop_cnt = 0

#Список зничений объема выборки при которых производились

#расчеты интенсивности и коэффициента вариации потока

N_array = [] while True:

#Добавляем N случайных значений эрланговского закона распределения u_list.extend(random_erlang_val(k, lmbda, N * 2**loop_cnt))

#Добавляем значение нового объема выборки

N_array.append(len(u_list))

#Оценка Мат. ожидания и Дисперсии me = np.mean(u_list)

sigma = np.std(u_list)

#Оценка новых значений интенсивности и коэффициента вариации потока lmbda_new = 1/me

nu_new = sigma/me

#Добавление новых отценок в списки

lmbda_list.append(lmbda_new) nu_list.append(nu_new)

# Проверка достаточности выборки

if abs((lmbda_new - lmbda_old) / lmbda_old) <= 0.01 and abs((nu_new - nu_old) / nu_old) <= 0.01:

break

# Перенос новых оценок на место старых lmbda_old = lmbda_new

nu_old = nu_new

loop_cnt += 1 if len(u_list) != N else 0

# Построение графика по сформированному распределению ploting_erlang_distribution(k, lmbda, data=u_list, add_hist=True)

8

# Построение графика зависимости оценок интенсивности и коэффициента вариации потока

ploting_lambda_nu(k, lmbda, lmbda_list, nu_list, N_array) return u_list, lmbda_list, nu_list

def main():

k, lmbda = 2, 10 ploting_erlang_distribution(k, lmbda, N=10000) erlang_model(k, lmbda, N=1)

return 0

if __name__ == "__main__": main()

9

Соседние файлы в папке ЛР3