МИНОБРНАУКИ РОССИИ САНКТ-ПЕТЕРБУРГСКИЙ ГОСУДАРСТВЕННЫЙ ЭЛЕКТРОТЕХНИЧЕСКИЙ УНИВЕРСИТЕТ «ЛЭТИ» ИМ. В.И. УЛЬЯНОВА (ЛЕНИНА) Кафедра ИС ОТЧЕТ По лабораторной работе №3 (вариант 11) по дисциплине «Моделирование систем массового обслуживания» Тема: «Моделирование непрерывной случайной величины» Студенты гр. 9374 _______________ Гаврилов С.А. Преподаватель _______________ Татарникова Т.М. Санкт-Петербург 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. Экспоненциальное распределение. Теоретическое математическое ожидание 𝑀 = 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 мало отличаются. С ростом объема выборки эмпирические значения стремятся к теоретическим. 6. Показательное распределение 𝜆 = 1. ⋀ 𝑀 = 1, 𝑀 = 0.586 ⋀ 𝐷 = 1, 𝐷 = 0.917 Эмпирические и теоретические 𝑀 и 𝐷 мало отличаются. С ростом объема выборки эмпирические значения стремятся к теоретическим. ПРИЛОЖЕНИЕ ЗНАЧЕНИЯ 𝒙𝒊 1.26254815e-06 7.83634769e-01 1.56726828e+00 2.35090178e+00 3.13453529e+00 3.91816880e+00 4.70180230e+00 5.48543581e+00 6.26906932e+00 7.05270282e+00 7.83633633e+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])) Код геометрическое распределения Файл “degree.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))