НАЦІОНАЛЬНИЙ АВІАЦІЙНИЙ УНІВЕРСИТЕТ Кафедра комп'ютеризованих систем управління Лабораторна робота № 1з дисципліни «Математичні методи моделювання та оптимізації систем і процесів» Виконав: Козьмін Є.В. Група: СП-535 Перевірив: Супрун О.М. Київ 2022 Тема: Моделювання випадкових подій та їх потоків. Мета: Набуття практичних навичок із моделювання випадкових подій та їх потоків. Хід роботи Згенеруйте випадкові рівномірно розподілені числа від 0 до 1, використавши вбудований генератор випадкових чисел. Використаємо функцію random() з бібліотеки random. Під час кожної ітерації циклу додаємо отримане випадкове значення в кінець масиву array_r. for i in range(1000): array_r.append(random.random()) Отримайте значення zі для інтервалів між викликами за формулою: Під час кожної ітерації циклу додаємо отримане значення zi в кінець масиву array_z. for i in range(1000): lamda = 10 * (i + 1) / (i + 4) array_z.append(- np.log(array_r[i]) / lamda) На проміжку [ Tmin, Tmax], Tmin = 0, отримайте послідовність tk моментів надходження викликів. Під час кожної ітерації циклу обчислюємо значення z та додаємо його в кінець масиву array_t_k. for i in range(1000): z = z + array_z[i] array_t_k.append(z) Для кожного проміжку визначте значення xj(t), j = 1, 2, ... – кількість викликів, що потрапили у проміжок часу довжиною t = 1 хв. Під час кожної ітерації циклу обчислюємо суму однакових сусідніх елементів x та додаємо її в кінець масиву array_x. for i in range(1000 - 1): if (array_t_k[i] // 1) == (array_t_k[i + 1] // 1): x = x + 1 if ((array_t_k[i] // 1) < (array_t_k[i + 1] // 1)) or (i == 1000 - 2): x = x + 1 array_x.append(x) x = 0 Побудуйте таблицю статистичного розподілу випадкової величини xj(t). Спершу створюємо відсортований масив array_x_sort зі значеннями xj(t). for i in range(len(array_x)): array_x_sort.append(array_x[i]) array_x_sort.sort() Далі під час кожної ітерації циклу обчислюємо суму однакових сусідніх елементів xj(t) та додаємо її в кінець масиву array_n. for i in range(len(array_x) - 1): if (array_x_sort[i] // 1) == (array_x_sort[i + 1] // 1): x = x + 1 if ((array_x_sort[i] // 1) < (array_x_sort[i + 1] // 1)) or (i == len(array_x) - 2): x = x + 1 array_n.append(x) x = 0 Визначити модельне значення параметра потоку «лямбда» за такою формулою: Для знаходження суми zi використаємо вбудовану функцію sum(), яка обчислює суму всіх елементів масиву. z_ser = sum(array_z) / 1000 lamda_ser = 1 / z_ser Для модельного «лямбда» та заданого «лямбда» значень параметрів потоку визначте імовірність P0(t) відсутності викликів за проміжок t = 1 хв. Для найпростішого потоку ймовірність надходження i викликів за час t дорівнює: Модельне значення ймовірності надходження «i» викликів за час t дорівнює: Спершу обчислюємо ймовірність надходження викликів за 1 хв. Для знаходження експоненти та факторіала деякого числа використовуємо функції e() та factorial() з бібліотеки math. Під час кожної ітерації циклу обчислюємо значення ймовірності Pi(1) за відповідною формулою та додаємо його в кінець масиву array_p. for i in range(len(array_n)): array_p.append(((lamda ** i) * math.e ** (-lamda)) / (math.factorial(i))) Далі знаходимо значення модальної ймовірності надходження викліків за 1 хв. for i in range(len(array_n)): array_p_ser.append(array_n[i] / sum(array_n)) В одній системі координат побудуйте графіки f1 = Pi(t) та f2 = Pmod,i(t). Для побудови графіків використаємо бібліотеку візуалізації даних на мові програмування Python – matplotlib. fig = plt.figure() # створення графічного вікна plt.title('Графіки P(t)') # назва графіка plt.xlabel('t') # підпис осі X plt.ylabel('P') # підпис осі Y x_p = np.arange(0, len(array_p), 1) # масив значень X від 0 до len(array_p) з інтервалом 1 y_p = np.array(array_p) # масив значень Y x_p_ser = np.arange(0, len(array_p_ser), 1) # масив значень X від 0 до len(array_p_ser) з інтервалом 1 y_p_ser = np.array(array_p_ser) # масив значень Y plt.plot(x_p, y_p, 'red', x_p_ser, y_p_ser, 'blue') # додання масивів координат на графік plt.grid(True) # відображення сітки plt.show() # відображення вікна з графіками Змоделюйте два найпростіших потоки, скориставшись для кожного з них методикою п.1-5: Спершу обчислюємо значення zі для інтервалів між викликами. for i in range(1000): lamda_2 = 15 * (i + 1) / (i + 4) array_z_2.append(- np.log(array_r[i]) / lamda_2) Далі знаходимо послідовність tk моментів надходження викликів. for i in range(1000): z_2 = z_2 + array_z_2[i] array_t_k_2.append(z_2) Визначаємо кількість викликів xj(t), що потрапили у проміжок часу довжиною t = 1 хв. x = 0 for i in range(1000 - 1): if (array_t_k_2[i] // 1) == (array_t_k_2[i + 1] // 1): x = x + 1 if ((array_t_k_2[i] // 1) < (array_t_k_2[i + 1] // 1)) or (i == 1000 - 2): x = x + 1 array_x_2.append(x) x = 0 Отримайте сумарний потік, складаючи x(t) відповідних інтервалів. Під час кожної ітерації обчислюємо суму x(t) відповідних інтервалів. Якщо деякий потік більше іншого, то додаємо x(t) більшого потоку в масив сумарного потоку array_x_sum. array_x_sum = [] for i in range(len(array_x)): if i < len(array_x_2): array_x_sum.append(array_x[i] + array_x_2[i]) else: array_x_sum.append(array_x[i] + 0) Побудуйте в одній системі координат графіки f1 = x1(n), f2 = x2(n), f3 = x(n), де n – номер інтервалу, x1, x2, x3 – кількість викликів, що потрапили до інтервалу для першого, другого і сумарного потоків відповідно. fig2 = plt.figure() # створення графічного вікна plt.title('Графіки x(n)') # назва графіка plt.xlabel('n') # підпис осі X plt.ylabel('x') # підпис осі Y x_1 = np.arange(0, len(array_x), 1) # масив значень X1 від 0 до len(array_x) з інтервалом 1 y_1 = np.array(array_x) # масив значень Y для X1 x_2 = np.arange(0, len(array_x_2), 1) # масив значень X2 від 0 до len(array_x_2) з інтервалом 1 y_2 = np.array(array_x_2) # масив значень Y для X2 x = np.arange(0, len(array_x_sum), 1) # масив значень X3 від 0 до len(array_x_sum) з інтервалом 1 y = np.array(array_x_sum) # масив значень Y для X3 plt.plot(x_1, y_1, 'red', x_2, y_2, 'green', x, y, 'blue') # додання масивів координат на графік plt.grid(True) # відображення сітки plt.show() # відображення вікна з графіками Для сумарного потоку визначте модельне значення лямбда(sum), використавши методику п. 6. z_ser = sum(array_x) / 1000 lamda_ser = 1 / z_ser # лямбда першого потоку z_ser_2 = sum(array_x_2) / 1000 lamda_ser_2 = 1 / z_ser_2 # лямбда другого потоку z_ser_sum = sum(array_x_sum) / 1000 lamda_ser_sum = 1 / z_ser_sum # лямбда сумарного потоку Порівняйте отримані значення лямбда. print('Модельне значення лямда(x1) = ' + str(lamda_ser)) print('Модельне значення лямда(x2) = ' + str(lamda_ser_2)) print('Модельне значення лямда(x1+x2) = ' + str(lamda_ser_sum)) На основі отриманих результатів можна зробити висновок, що модальне значення лямбда сумарного потоку менше в порівнянні з першим та другим. Висновок: в ході виконання лабораторної роботи №1 було отримано практичні навички із моделювання випадкових подій та їх потоків. Також було розроблено і реалізовано програму моделювання потоку випадкових подій за допомогою інтегрованої середи розробки(IDE) для програмування на мові Python – PyCharm. На основі результатів роботи програми було виконано статистичне оброблення отриманих даних, досліджено та проаналізовано властивості сумарного потоку двох найпростіших потоків подій. Також було побудовано графіки f1 = x1(n), f2 = x2(n), f3 = x(n), та f1 = P(t) і f2 = Pmod(t) за допомогою бібліотеки matplotlib. Додаток А. Лістинг файлу «main.py» import random import math import numpy as np import matplotlib.pyplot as plt array_r = [] array_z = [] lamda = 0 z = 0 x = 0 t_min = 0 array_t_k = [] array_x = [] array_x_sort = [] array_n = [] z_ser = 0 lamda_ser = 0 array_p = [] array_p_ser = [] counter = 0 # task 1 for i in range(1000): array_r.append(random.random()) # task 2 for i in range(1000): lamda = 10 * (i + 1) / (i + 4) array_z.append(- np.log(array_r[i]) / lamda) # task 3 for i in range(1000): z = z + array_z[i] array_t_k.append(z) # task 5.2 for i in range(1000 - 1): if (array_t_k[i] // 1) == (array_t_k[i + 1] // 1): x = x + 1 if ((array_t_k[i] // 1) < (array_t_k[i + 1] // 1)) or (i == 1000 - 2): x = x + 1 array_x.append(x) x = 0 # task 5.3 for i in range(len(array_x)): array_x_sort.append(array_x[i]) array_x_sort.sort() for i in range(len(array_x) - 1): if (array_x_sort[i] // 1) == (array_x_sort[i + 1] // 1): x = x + 1 if ((array_x_sort[i] // 1) < (array_x_sort[i + 1] // 1)) or (i == len(array_x) - 2): x = x + 1 array_n.append(x) x = 0 # task 6 z_ser = sum(array_z) / 1000 lamda_ser = 1 / z_ser # print('Zсер = ' + str(z_ser)) # print('Лямбда = ' + str(lamda_ser)) # task 7.1-7.3 for i in range(len(array_n)): array_p.append(((lamda ** i) * math.e ** (-lamda)) / (math.factorial(i))) for i in range(len(array_n)): array_p_ser.append(array_n[i] / sum(array_n)) for i in range(len(array_p_ser)): if counter == 4: print() counter = 0 print(array_p_ser[i], end=' ') counter = counter + 1 print() # task 7.4 fig = plt.figure() plt.title('Графіки P(t)') plt.xlabel('t') plt.ylabel('P') x_p = np.arange(0, len(array_p), 1) y_p = np.array(array_p) x_p_ser = np.arange(0, len(array_p_ser), 1) y_p_ser = np.array(array_p_ser) plt.plot(x_p, y_p, 'red', x_p_ser, y_p_ser, 'blue') plt.grid(True) plt.show() # task 8 array_r_2 = [] lamda_2 = 0 array_z_2 = [] z_2 = 0 array_t_k_2 = [] array_x_2 = [] for i in range(1000): lamda_2 = 15 * (i + 1) / (i + 4) array_z_2.append(- np.log(array_r[i]) / lamda_2) for i in range(1000): z_2 = z_2 + array_z_2[i] array_t_k_2.append(z_2) x = 0 for i in range(1000 - 1): if (array_t_k_2[i] // 1) == (array_t_k_2[i + 1] // 1): x = x + 1 if ((array_t_k_2[i] // 1) < (array_t_k_2[i + 1] // 1)) or (i == 1000 - 2): x = x + 1 array_x_2.append(x) x = 0 # task 9 array_x_sum = [] for i in range(len(array_x)): if i < len(array_x_2): array_x_sum.append(array_x[i] + array_x_2[i]) else: array_x_sum.append(array_x[i] + 0) # task 10 fig2 = plt.figure() plt.title('Графіки x(n)') plt.xlabel('n') plt.ylabel('x') x_1 = np.arange(0, len(array_x), 1) y_1 = np.array(array_x) x_2 = np.arange(0, len(array_x_2), 1) y_2 = np.array(array_x_2) x = np.arange(0, len(array_x_sum), 1) y = np.array(array_x_sum) plt.plot(x_1, y_1, 'red', x_2, y_2, 'green', x, y, 'blue') plt.grid(True) plt.show() # task 11 z_ser = sum(array_x) / 1000 lamda_ser = 1 / z_ser z_ser_2 = sum(array_x_2) / 1000 lamda_ser_2 = 1 / z_ser_2 z_ser_sum = sum(array_x_sum) / 1000 lamda_ser_sum = 1 / z_ser_sum # task 12 print('Модельне значення лямбда(x1) = ' + str(lamda_ser)) print('Модельне значення лямбда(x2) = ' + str(lamda_ser_2)) print('Модельне значення лямбда(x1+x2) = ' + str(lamda_ser_sum)) |