Uploaded by Рубцов Владислав

93 Грунин lr 3

advertisement
МИНОБРНАУКИ РОССИИ
САНКТ-ПЕТЕРБУРГСКИЙ ГОСУДАРСТВЕННЫЙ
ЭЛЕКТРОТЕХНИЧЕСКИЙ УНИВЕРСИТЕТ
«ЛЭТИ» ИМ. В.И. УЛЬЯНОВА (ЛЕНИНА)
Кафедра ИС
ОТЧЕТ
По лабораторной работе №3 (вариант 2)
по дисциплине «Моделирование систем массового обслуживания»
Тема: «Моделирование непрерывной случайной величины»
Студенты гр.
_______________
Преподаватель
_______________
Санкт-Петербург
2022
Татарникова Т.М.
Цель работы.
Выполнить программную реализацию генератора непрерывной
случайной величины с заданным законом распределения.
Постановка задачи
Реализуется генератор непрерывной случайной величины на основе
базовой случайной величины для пяти видов распределений:
 экспоненциальное
 равномерное
 Эрланга порядка K
 нормальное
 Вейбулла
Порядок выполнения работы
1. Построить на основе базовой случайной величины пять видов
распределений:
 экспоненциальное по формуле (4.9)
 равномерное по формуле (4.10)
 Эрланга порядка K по формуле (4.11)
 нормальное по формуле (4.14)
 в соответствии с вариантом задания.
2. Для всех генераторов непрерывной случайной величины
построить
гистограмму распределения вероятностей случайной величины.
3. Найти теоретические значения математического ожидания M и
дисперсии D по формулам (П2.1) и (П2.2) соответственно для
всех видов
распределений непрерывной случайной величины. Сравнить
⋀
⋀
полученные значения 𝑀 и 𝐷 с эмпирическими 𝑀 и 𝐷.
Выполнение работы
Размер выборки - 5000
3. Результаты эмпирических и теоретических значений M и D
Гистограммы распределений случайных величин
1. Экспоненциальное распределение 𝜆 = 1.
2. Равномерное распределение на интервале [0, 5]
3. Эрланга порядка K = 3, 𝜆 = 1
4. Нормальное 𝜆 = 1, 𝜎 = 0
5. Вейбулла 𝜆 = 1, 𝑘 = 1.5
Сравнение теоретического и математического ожиданий распределений
1. Экспоненциальное распределение.
Теоретическое математическое ожидание 𝑀 = 1
⋀
Эмпирическое математическое ожидание 𝑀 =0.5946
Теоретическая дисперсия 𝐷 = 1
⋀
Эмпирическая дисперсия 𝐷 = 0.9
Эмпирические и теоретические 𝑀 средне отличаются, D мало
отличаются. С ростом объема выборки эмпирические значения
стремятся к теоретическим.
2. Равномерное распределение на интервале [0, 5]
⋀
𝑀 = 2.5 ,
𝑀 = 2.26
⋀
𝐷 = 2.08333,
𝐷 = 2.0377
Эмпирические и теоретические 𝑀 и 𝐷 мало отличаются. С ростом
объема выборки эмпирические значения стремятся к теоретическим.
3. Эрланга порядка K = 3, 𝜆 = 1
⋀
𝑀 =3,
𝑀 = 2.453
⋀
𝐷 = 3,
𝐷 = 2.73
Эмпирические и теоретические 𝑀 средне отличаются, D мало
отличаются. С ростом объема выборки эмпирические значения
стремятся к теоретическим.
4. Нормальное 𝜆 = 1, 𝜎 = 0
⋀
𝑀 =0,
𝑀 = −0.305
𝐷 = 1,
𝐷 = 1.0088
⋀
Эмпирические и теоретические 𝑀 средне отличаются, D мало отличаются.
С ростом объема выборки эмпирические значения стремятся к
теоретическим.
5. Вейбулла 𝜆 = 1, 𝑘 = 1.5
⋀
𝑀 = 0.9 , 𝑀 = 0.65
⋀
𝐷 = 0.375,
𝐷 = 0.394
Эмпирические и теоретические 𝑀 и 𝐷 мало отличаются. С ростом
объема выборки эмпирические значения стремятся к теоретическим.
ПРИЛОЖЕНИЕ ЗНАЧЕНИЯ 𝒙𝒊
[4.03947367e-03 4.45657203e-01 8.87274932e-01 1.32889266e+00
1.77051039e+00 2.21212812e+00 2.65374585e+00 3.09536358e+00
3.53698131e+00 3.97859904e+00 4.42021676e+00]
ПРИЛОЖЕНИЕ ИСХОДНЫЙ КОД
Код равномерного распределения
Файл “evenly.py”
import numpy as np
from numpy import random
import matplotlib.pyplot as plt
SIZE = 5000
A = 0
B = 5
z = random.rand(SIZE)
x = A + z * (B - A)
n = np.zeros(10)
step = (B - A) / 10
m = np.arange(step + A, B + 0.1, step)
v = n
for k in x:
for i, j in zip(m, range(len(m))):
if k < i:
v[j] += 1
break
print(v)
t = np.arange(A, B, step)
# N = plt.hist(x, 10, width= 0.1, density=True)
N = plt.bar(t + 0.2, v / SIZE, width=0.4)
plt.xticks(np.arange(A, B + 0.1, step))
plt.plot([A, B], [0.1, 0.1], color='red')
plt.title("Равномерное распределение", size=18)
print(sum(v) / SIZE)
p = v / SIZE
plt.show()
print(t)
M = sum(p * t)
print("M", A + (B - A) / 2, M)
print("D", (B - A) ** 2 / 12, sum(((t - M) ** 2) * p))
Код экспоненциального распределения
Файл “exponential.py”
import math
import numpy as np
from numpy import random
import matplotlib.pyplot as plt
from scipy import stats
SIZE = 5000
z = np.random.rand(SIZE)
# Экспоненциальное
A = 0
B = 10
bars = 10
z = random.rand(SIZE)
x = -np.log(z)
n = np.zeros(bars)
step = (B - A) / bars
m = np.arange(step + A, B + 0.1, step)
v = n
for k in x:
for i, j in zip(m, range(len(m))):
if k < i:
v[j] += 1
break
print("распр", np.round(v))
t = np.arange(A, B, step)
# N = plt.hist(x, 10, width= 0.1, density=True)
# plt.bar(t + 0.2, v / SIZE, width=0.4)
p = plt.hist(x, bins=10,density=True, width = 0.4)
plt.xticks(p[1])
print(p[1])
# plt.xticks(np.arange(A, B + 0.1, step))
# plt.plot([A, B], [0.1, 0.1], color='red')
plt.title("Экспоненциальное распределение", size=18)
print(sum(v) / SIZE)
p = v / SIZE
plt.show()
print(t)
M = sum(p * t)
print("M", 1, M)
print("D", 1, sum(((t - M) ** 2) * p))
Код распределения Эрланга
Файл “erlang.py”
import math
import numpy as np
from numpy import random
import matplotlib.pyplot as plt
from scipy import stats
SIZE = 5000
z = np.random.rand(SIZE)
z1 = np.random.rand(SIZE)
z2 = np.random.rand(SIZE)
# Эрланга k = 3
A = 0
B = 10
bars = 10
z = random.rand(SIZE)
x = -np.log(z) + -np.log(z1) + -np.log(z2)
n = np.zeros(bars)
step = (B - A) / bars
m = np.arange(step + A, B + 0.1, step)
v = n
for k in x:
for i, j in zip(m, range(len(m))):
if k < i:
v[j] += 1
break
print("распр", np.round(v))
t = np.arange(A, B, step)
# N = plt.hist(x, 10, width= 0.1, density=True)
# plt.bar(t + 0.2, v / SIZE, width=0.4)
p = plt.hist(x, bins=10,density=True, width = 0.4)
plt.xticks(p[1])
print(p[1])
# plt.xticks(np.arange(A, B + 0.1, step))
# plt.plot([A, B], [0.1, 0.1], color='red')
plt.title("Распределение Эрланга k = 3", size=18)
print(sum(v) / SIZE)
p = v / SIZE
plt.show()
print(t)
M = sum(p * t)
print("M", 3/1, M)
print("D", 3/1, sum(((t - M) ** 2) * p))
Код нормального распределения
Файл “normal.py”
import math
import numpy as np
from numpy import random
import matplotlib.pyplot as plt
from scipy import stats
SIZE = 5000
z = np.random.rand(SIZE)
z1 = np.random.rand(SIZE)
z2 = np.random.rand(SIZE)
# Эрланга k = 3
A = -3
B = 3
bars = 10
z = random.rand(SIZE)
x = np.sqrt(-2 * np.log(z)) * np.sin(2 * np.pi * z1)
n = np.zeros(bars)
step = (B - A) / bars
m = np.arange(step + A, B + 0.1, step)
v = n
for k in x:
for i, j in zip(m, range(len(m))):
if k < i:
v[j] += 1
break
print("распр", np.round(v))
t = np.arange(A, B, step)
# N = plt.hist(x, 10, width= 0.1, density=True)
# plt.bar(t + 0.2, v / SIZE, width=0.4)
p1 = plt.hist(x, bins=10,density=True, width = 0.4)
plt.xticks(p1[1])
print(p1[1])
# plt.xticks(np.arange(A, B + 0.1, step))
# plt.plot([A, B], [0.1, 0.1], color='red')
plt.title("Нормальное распределение", size=18)
print(sum(v) / SIZE)
p = v / SIZE
plt.show()
print(t)
M = sum(p * t)
print("M", 3/1, M)
print("D", 3/1, sum(((t - M) ** 2) * p))
print(sum(p1[0]*p1[1][:10]))
Код распределения Вейбулла
Файл “vb.py”
import math
import numpy as np
from numpy import random
import matplotlib.pyplot as plt
from scipy.stats import gamma
from scipy import stats
SIZE = 5000
z = np.random.rand(SIZE)
# Экспоненциальное
A = 0
B = 5
bars = 10
alpha = 1.5
beta = 1
z = random.rand(SIZE)
x = beta*np.log(1/(1 - z))**(1/alpha)
n = np.zeros(bars)
step = (B - A) / bars
m = np.arange(step + A, B + 0.1, step)
v = n
for k in x:
for i, j in zip(m, range(len(m))):
if k < i:
v[j] += 1
break
print("распр", np.round(v))
t = np.arange(A, B, step)
# N = plt.hist(x, 10, width= 0.1, density=True)
# plt.bar(t + 0.2, v / SIZE, width=0.4)
p = plt.hist(x, bins=10,density=True, width = 0.4)
plt.xticks(p[1])
print(p[1])
# plt.xticks(np.arange(A, B + 0.1, step))
# plt.plot([A, B], [0.1, 0.1], color='red')
plt.title("Распределение Вейбулла", size=18)
print(sum(v) / SIZE)
p = v / SIZE
plt.show()
print(t)
M = sum(p * t)
mt = 1/beta* math.gamma(1 + 1/alpha)
print("M", mt, M)
print("D", 1/beta**2 * (math.gamma(1 + 2/alpha) - math.gamma(1
+ 1/alpha)**2), sum(((t - M) ** 2) * p))
Download