Ім'я файлу: 1.docx
Розширення: docx
Розмір: 295кб.
Дата: 02.12.2022
скачати

НАЦІОНАЛЬНИЙ АВІАЦІЙНИЙ УНІВЕРСИТЕТ

Кафедра комп'ютеризованих систем управління

Лабораторна робота № 1


з дисципліни «Математичні методи моделювання та оптимізації систем і процесів»

Виконав: Козьмін Є.В.

Група: СП-535

Перевірив: Супрун О.М.

Київ 2022

Тема: Моделювання випадкових подій та їх потоків.

Мета: Набуття практичних навичок із моделювання випадкових подій та їх потоків.

Хід роботи

  1. Згенеруйте випадкові рівномірно розподілені числа від 0 до 1, використавши вбудований генератор випадкових чисел.

Використаємо функцію random() з бібліотеки random. Під час кожної ітерації циклу додаємо отримане випадкове значення в кінець масиву array_r.

for i in range(1000):

array_r.append(random.random())

  1. Отримайте значення zі для інтервалів між викликами за формулою:



Під час кожної ітерації циклу додаємо отримане значення zi в кінець масиву array_z.

for i in range(1000):

lamda = 10 * (i + 1) / (i + 4)

array_z.append(- np.log(array_r[i]) / lamda)

  1. На проміжку [ Tmin, Tmax], Tmin = 0, отримайте послідовність tk моментів надходження викликів.

Під час кожної ітерації циклу обчислюємо значення z та додаємо його в кінець масиву array_t_k.

for i in range(1000):

z = z + array_z[i]

array_t_k.append(z)

  1. Для кожного проміжку визначте значення 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



  1. Побудуйте таблицю статистичного розподілу випадкової величини 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



  1. Визначити модельне значення параметра потоку «лямбда» за такою формулою:



Для знаходження суми zi використаємо вбудовану функцію sum(), яка обчислює суму всіх елементів масиву.

z_ser = sum(array_z) / 1000

lamda_ser = 1 / z_ser



  1. Для модельного «лямбда» та заданого «лямбда» значень параметрів потоку визначте імовірність 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))



  1. В одній системі координат побудуйте графіки 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. Змоделюйте два найпростіших потоки, скориставшись для кожного з них методикою п.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

  1. Отримайте сумарний потік, складаючи 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)

  1. Побудуйте в одній системі координат графіки 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() # відображення вікна з графіками



  1. Для сумарного потоку визначте модельне значення лямбда(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 # лямбда сумарного потоку

  1. Порівняйте отримані значення лямбда.

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))
скачати

© Усі права захищені
написати до нас