Лаба 2 / Отчет_лаба2
.docxГУАП
КАФЕДРА ПИ
ОТЧЕТ ЗАЩИЩЕН С ОЦЕНКОЙ
ПРЕПОДАВАТЕЛЬ
ст. преподаватель |
|
|
|
М. Н. Шелест |
должность, уч. степень, звание |
|
подпись, дата |
|
инициалы, фамилия |
ОТЧЕТ О ЛАБОРАТОРНОЙ РАБОТЕ № 2 |
ДАТЧИК СЛУЧАЙНЫХ ЧИСЕЛ. ПОСТРОЕНИЕ ГИСТОГРАММ |
по курсу: Имитационное моделирование |
|
РАБОТУ ВЫПОЛНИЛ
СТУДЕНТ ГР. № |
|
|
|
|
|
|
|
|
подпись, дата |
|
инициалы, фамилия |
Санкт-Петербург 2023
Цель работы
Изучение алгоритмов получения на ЭВМ чисел с заданным законом распределения и построение гистограмм.
Вариант задания
Вариант №22
Закон распределения: Нормальный
Параметры закона:
График моделируемого закона распределения
В начале выполнения данной лабораторной работы необходимо выяснить, как выглядит моделируемый закон распределения. Формула моделируемого закона показана на рисунке 1.
Рисунок 1 – Формула моделируемого закона
Далее, на рисунке 2 показана функция распределения моделируемого закона.
Рисунок 2 – Функция распределения закона
Описание разработанной программы
Были созданы 2 подпрограммы: реализация моделируемого закона распределения и построения гистограммы выборки.
Рассмотрим первую из них. Принцип работы данной программы состоит в следующем: пользователь вводит параметры необходимого нормального распределения (мат ожидание, дисперсию и количество чисел), затем происходит генерация N случайных чисел, распределённых нормально. Далее, благодаря преобразованию Бокса-Мюллера создаются числа, распределённые нормально. Список используемых переменных данной программы представлен в таблице 1, а в листинге 1 – код созданной подпрограммы.
Таблица 1. Список используемых переменных
Имя переменной |
Тип данных |
Описание переменной |
Uni_nums |
Массив дробных чисел |
Массив равномерно распределённых точек |
Norm_nums |
Массив дробных чисел |
Массив нормально распределённых точек |
Z0 |
Дробное число |
Нормально распределённое дробное число |
Z1 |
Дробное число |
Аналогично |
Листинг 1. Программа моделирования случайной величины
def normal(loc: float = ..., scale: float = ..., size: float = ...) -> float: uni_nums = np.random.uniform(size=size) norm_nums = [] for i in range(0, len(uni_nums), 2): z0 = ((np.sqrt(-2*np.log(uni_nums[i])) * np.cos(2*np.pi*uni_nums[i+1])) * scale) + loc z1 = ((np.sqrt(-2*np.log(uni_nums[i])) * np.sin(2*np.pi*uni_nums[i+1])) * scale) + loc norm_nums.append(z0) norm_nums.append(z1) return norm_nums |
Далее, рассмотрим вторую из созданных подпрограмм, а именно программу создания экспериментальной гистограммы. Логика программы состоит в следующем: сначала генерируется случайная величина, распределённая нормально. Затем, это число добавляется в массив случайных чисел. Затем, смотрим, к какому интервалу принадлежит данное число. Если оно попадает в какой-то интервал, то к количеству чисел в данном интервале прибавляется единица. Если же не попадает, то происходит расчет ошибки непопадания чисел в границы интервалов. Если данное число больше чем порог, то происходит перерасчет границ интервалов, а также количества чисел в каждом интервале. Список используемых переменных данной подпрограммы показан в таблице 2, а код созданной программы – листинг 2.
Таблица 2. Список используемых переменных
Имя переменной |
Тип данных |
Описание переменной |
nums |
Массив дробных чисел |
Массив нормально распределённых точек |
X_min |
Дробное число |
Минимально сгенерированное число |
X_max |
Дробное число |
Максимально сгенерированное число |
delta |
Дробное число |
Разница между центрами интервалов |
N |
Целое число |
Количество чисел в массиве nums |
Amount_of_parts |
Целое число |
Количество интервалов |
Mean |
Массив дробных чисел |
Массив математических ожиданий |
Var |
Массив дробных чисел |
Массив дисперсий |
sizes |
Массив целых чисел |
Массив количества чисел в массиве nums |
p |
Дробное число |
% чисел, не попавших в интервалы |
ids |
Массив целых чисел |
Массив принадлежностей к интервалам |
borders |
Массив дробных чисел |
Массив границ интервалов |
Листинг 2. Программа построение экспериментальной гистограммы
def hist(show_hist: bool, get_mean_and_var: bool = False): # 1 nums = [] x_min, x_max, delta, N, amount_of_parts = 0, 0, 0, 0, 10 borders, N_i = np.array([]), [0] * amount_of_parts if get_mean_and_var: mean, var, sizes = [], [], []
while min(N_i[0:amount_of_parts-1]) != 100: # 3 (формирование случайного число и добавление его к выборке) alpha, _ = normal(0.5, 0.1, 2) nums.append(alpha) N = len(nums)
# 4 (распределение чисел) ids = np.searchsorted(borders, alpha) if ids < len(borders) and alpha > x_min: N_i[ids-1] += 1
# 5 (подсчет вероятности ошибки) p = (N - np.sum(N_i))/N
# 6 (изменение размеров) if p >= 0.01: x_min, x_max = min(nums), max(nums) delta = (x_max - x_min)/(amount_of_parts-1) borders = np.linspace(x_min, x_max, amount_of_parts, True) ids = np.searchsorted(borders, nums) N_i = [0] * amount_of_parts for id in ids: N_i[id] += 1
# Расчет мат ожидания и дисперсии выборки if get_mean_and_var: mean.append(np.mean(nums)) var.append(np.var(nums)*(amount_of_parts)) sizes.append(N)
# 8 (Формирование вектора Y) y = [n/(N*delta) for n in N_i] x = [] x.append(x_min + delta/2) for i in range(amount_of_parts-1): x.append(x[i] + delta)
# Построение гистограммы if show_hist: x_axis = np.linspace(x_min, x_max, 100) plt.figure(1) plt.bar(x, y, width=delta) plt.plot(x_axis, norm.pdf(x_axis, loc=0.5, scale=0.1), color='red') plt.title('Гистограмма нормального распределения')
if get_mean_and_var: plt.figure(2) plt.title('График зависимости мат ожидания от количества') plt.plot(sizes, mean) plt.plot(sizes, [0.5]*len(sizes))
plt.figure(3) plt.title('График зависимости дисперсии от количества') plt.plot(sizes, var) plt.plot(sizes, [0.1]*len(sizes))
plt.show() return N_i |
Табличное представление результатов анализа
Далее, после завершения создания экспериментальной гистограммы, необходимо заполнить таблицу распределения элементов выборки по квантам гистограммы. На рисунке 3 показана заполненная таблица.
Рисунок 3 – Таблица распределения элементов
Гистограмма сформированной выборки
После таблицы распределения, необходимо на её основе построить гистограмму распределения сформированной выборки. На рисунке 4 показана созданная гистограмма вместе с теоретическим законом распределения.
Рисунок 4 – Экспериментальная гистограмма
Графики зависимости
Помимо вышеприведённой гистограммы, необходимо построить графики зависимости оценки математического ожидания и дисперсии от объема выборки. Данные графики приведены на рисунках 5-6 соответственно.
Рисунок 5 – График зависимости математического ожидания от объема выборки
Рисунок 6 – График зависимости дисперсии от объема выборки
Выводы
Таким образом, подводя итог ко всем выше проделанным операциям, можно сделать вывод о том, что в ходе выполнения данной лабораторной работы было произведено преобразование из случайной величины, распределённой равномерно, к случайной величине, распределённой нормально с заданными параметрами распределения. Также, была создана программа для создания экспериментальной гистограммы. На ней видно, что распределение случайной величины является нормальным.