lab3
.docx
Цель работы
Исследование основных характеристик входных потоков заявок, а также базовых принципов моделирования СМО по событиям.
Вариант 16
Рисунок 1 – Вариант задания
Во втором столбце – порядок эрланговского потока, в третьем – параметр λ.
Ход работы
Формула эрланговского потока записывается как:
f(x;k; λ) =
График эрланговского распределения по варианту представлен на рисунке 2 при k=4 и λ=16.
Рисунок 2 – График эрланговской функции при заданных k, λ
Генерируется случайные числа для эрланговского распределения N раз. Моделируем эрланговский поток, где вычисляется его оценки интенсивности и коэффициента вариации в зависимости от объема выборки. На рисунке 3-4 представлены графики зависимости этих оценок в зависимости N = 1000, при этом ошибка меньше 1%.
Рисунок 3 – График сравнения оценки интенсивности с теоретическим значением
Рисунок 4 - График сравнения оценки коэффициента вариации с теоретическим значением
Вывод
В ходе данной лабораторной работы я познакомился с основными характеристиками потоков заявок, а также с моделью работы СМО.
Смоделировав работу СМО с помощью функции генерации случайных значения, я выяснил, что с увеличением объема выборки этих чисел интенсивность потока СМО и коэффицент вариации стремятся к теоретическим значениям.
В ходе работы проблем не возникло.
Приложение
import random as rd
import matplotlib.pyplot as plt
import numpy as np
import math
# График эрланговской функции
def func():
f_exp = lambda lmd, x: -(1 / lmd) * math.log(x)
f_erlang = lambda k_, lmd, x: sum([f_exp(lmd, x) for _ in range(k_)])
k_, lmb = 4, 16
x = [i+1 for i in range(1, 100)]
values = []
for i in range(len(x)):
values.append(f_erlang(k_, lmb, 1))
plt.plot(x, [f_erlang(4,16, x[i]) for i in range(len(x))])
plt.title('График эрлановской функции')
plt.show()
# Функция экспоненицальная
f_exp = lambda lmd: -(1 / lmd) * math.log(np.random.random())
# Функция эрланговская
f_erlang = lambda k_, lmd: sum([f_exp(lmb) for _ in range(k_)])
k_, lmb = 4, 16
teor_lambda = lmb / k_
teor_nu = 1 / (k_**0.5)
def modeling(N):
tc = 0
k = 0
list_uk = []
list_lambda = []
list_nu = []
for i in range(N):
list_uk.append(f_erlang(k_, lmb))
tc += list_uk[-1]
m = np.mean(list_uk)
sigma = (np.var(list_uk))**0.5
lamba = 1 / m
nu = sigma/m
list_lambda.append(lamba)
list_nu.append(nu)
return list_lambda, list_nu
def main():
func()
N = 1000
lambda_old = 10000000
nu_old = 10000000
list_lambda, list_nu = [0], [0]
while (abs((list_lambda[-1] - lambda_old)/lambda_old) > 0.01 or
abs((list_nu[-1] - nu_old)/nu_old)) > 0.01:
list_lambda, list_nu = modeling(N)
lambda_old = list_lambda[-1]
nu_old = list_nu[-1]
N = 2*N
print('Ошибка удовлетворительная')
x = [i for i in range(len(list_lambda))]
plt.plot(x, list_lambda, label='Рассчитанное значение')
plt.plot(x, [teor_lambda for i in range(len(list_lambda))], label='Теоретическое значение')
plt.title('Интенсивность потока')
plt.legend()
plt.show()
plt.plot(x, list_nu, label='Рассчитанное значение')
plt.plot(x, [teor_nu for i in range(len(list_lambda))], label='Теоретическое значение')
plt.title('Коэффицент вариации')
plt.legend()
plt.show()
main()