Файл: Отчет защищен с оценкой преподаватель ассистент.docx

ВУЗ: Не указан

Категория: Отчеты по практике

Дисциплина: Не указана

Добавлен: 28.03.2024

Просмотров: 16

Скачиваний: 0

ВНИМАНИЕ! Если данный файл нарушает Ваши авторские права, то обязательно сообщите нам.


        P_come_lambda[l][i][j]=lambd_list[l] ** (K) * math.e ** -lambd_list[l] / math.factorial(K)

      elif j==i+1:

        K=0

        P_come_lambda[l][i][j] = lambd_list[l] ** (K) * math.e ** -lambd_list[l] / math.factorial(K) * (math.factorial(j) / math.factorial(j-1)) * (1/j) *(1-1/j) ** (j-1)

      elif j
        K=i-j+1

        P_come_lambda[l][i][j] = lambd_list[l] ** (K) * math.e ** -lambd_list[l] / math.factorial(K) * (math.factorial(j) / math.factorial(j-1)) * (1/j) *(1-1/j) ** (j-1)

        K=i-j # ни 1 абонент не передал сообщение

        P_come_lambda[l][i][j]+=lambd_list[l] ** (K) * math.e ** -lambd_list[l] / math.factorial(K) * (1 - math.factorial(j) / math.factorial(j-1) * (1/j) *(1-1/j) ** (j-1))

      elif j==i:

        K=1 # 1 абонент передал сообщение, а 1 абонент пришёл

        P_come_lambda[l][i][j] = lambd_list[l] ** (K) * math.e ** -lambd_list[l] / math.factorial(K) * (math.factorial(j) / math.factorial(j-1)) * (1/j) *(1-1/j) ** (j-1)

        K=0 # ни 1 абонент не передал сообщение и никто не пришёл

        P_come_lambda[l][i][j] += lambd_list[l] ** (K) * math.e ** -lambd_list[l] / math.factorial(K) * (1 - math.factorial(j) / math.factorial(j-1) * (1/j) *(1-1/j) ** (j-1))

      else:

        P_come_lambda[l][i][j]=0
for l in range(len(lambd_list)): #для каждой лямбды

  for i in range(k): #для каждого уравнения

    for j in range(k): # номер слагаемого с П

      if i==j:

        P_come_lambda[l][i][j]-=1
for l in range(len(lambd_list)): #для каждой лямбды

  for i in range(k): #для каждого уравнения

    for j in range(k): # номер слагаемого с П

      if i==k-1:

        P_come_lambda[l][i][j]=1
v_last=[[[] for i in range(k)] for l in range(len(lambd_list))]

for l in range(len(lambd_list)):

  for i in range(k):

    v_last[l][i]=0

    if i==k-1:

        v_last[l][i]=1
final=[]

for l in range(len(lambd_list)):

  final.append(np.linalg.solve(P_come_lambda[l],v_last[l]))
#среднее количество абонентов

N_avg2 = [[] for l in range(len(lambd_list))]

for l in range(len(lambd_list)):

  summ = 0

  for j in range(k):

    summ+=final[l][j]*j

    N_avg2[l]=summ

  print(N_avg2[l])

fig = plt.figure() # построения графика зависимости N от λ

ax = fig.add_subplot(111)

ax.set_ylim(0, 10) # ограничение среднего количества абонентов до 20

ax.set_ylabel("Среднее количество абонентов в системе, N")

ax.set_xlabel("Интенсивность входного потока (λ)")

ax.plot(lambd_list,N_avg2, label='Решением систем уравнений')

ax.plot(lambd_list,N_avg, label='Подсчет кол-ва абонентов в слоте k')

plt.legend()

plt.grid()

k=100

from scipy.stats import poisson

from scipy.stats import binom

P_come_lambda = [[[[] for j in range(k)] for i in range(k)] for l in range(len(lambd_list))] # количество абонентов, которое пришло в слоте k

for l in range(len(lambd_list)):

  for i in range(k): #для каждого уравнения, состояние, в которое осуществляется переход

    for j in range(k): # номер слагаемого с П; состояние, из которого осуществляется переход

      if i==0 and j<2: #верно


       K=0

       P_come_lambda[l][i][j]=poisson.pmf(k=K, mu=lambd_list[l])

      elif j==0 or j==1: #верно

        K=i

        P_come_lambda[l][i][j]=lambd_list[l] ** (K) * math.e ** -lambd_list[l] / math.factorial(K)

      elif j==i+1:

        K=0

        P_come_lambda[l][i][j] = lambd_list[l] ** (K) * math.e ** -lambd_list[l] / math.factorial(K) * (math.factorial(j) / math.factorial(j-1)) * (1/j) *(1-1/j) ** (j-1)

      elif j
        K=i-j+1

        P_come_lambda[l][i][j] = lambd_list[l] ** (K) * math.e ** -lambd_list[l] / math.factorial(K) * (math.factorial(j) / math.factorial(j-1)) * (1/j) *(1-1/j) ** (j-1)

        K=i-j # ни 1 абонент не передал сообщение

        P_come_lambda[l][i][j]+=lambd_list[l] ** (K) * math.e ** -lambd_list[l] / math.factorial(K) * (1 - math.factorial(j) / math.factorial(j-1) * (1/j) *(1-1/j) ** (j-1))

      elif j==i:

        K=1 # 1 абонент передал сообщение, а 1 абонент пришёл

        P_come_lambda[l][i][j] = lambd_list[l] ** (K) * math.e ** -lambd_list[l] / math.factorial(K) * (math.factorial(j) / math.factorial(j-1)) * (1/j) *(1-1/j) ** (j-1)

        K=0 # ни 1 абонент не передал сообщение и никто не пришёл

        P_come_lambda[l][i][j] += lambd_list[l] ** (K) * math.e ** -lambd_list[l] / math.factorial(K) * (1 - math.factorial(j) / math.factorial(j-1) * (1/j) *(1-1/j) ** (j-1))

      else:

        P_come_lambda[l][i][j]=0
for l in range(len(lambd_list)): #для каждой лямбды

  for i in range(k): #для каждого уравнения

    for j in range(k): # номер слагаемого с П

      if i==j:

        P_come_lambda[l][i][j]-=1
for l in range(len(lambd_list)): #для каждой лямбды

  for i in range(k): #для каждого уравнения

    for j in range(k): # номер слагаемого с П

      if i==k-1:

        P_come_lambda[l][i][j]=1
v_last=[[[] for i in range(k)] for l in range(len(lambd_list))]

for l in range(len(lambd_list)):

  for i in range(k):

    v_last[l][i]=0

    if i==k-1:

        v_last[l][i]=1
final=[]

for l in range(len(lambd_list)):

  final.append(np.linalg.solve(P_come_lambda[l],v_last[l]))
#среднее количество абонентов

N_avg3 = [[] for l in range(len(lambd_list))]

for l in range(len(lambd_list)):

  summ = 0

  for j in range(k):

    summ+=final[l][j]*j

    N_avg3[l]=summ

  print(N_avg3[l])

fig = plt.figure() # построения графика зависимости N от λ

ax = fig.add_subplot(111)

ax.set_ylim(0, 10) # ограничение среднего количества абонентов до 20

ax.set_ylabel("Среднее количество абонентов в системе, N")

ax.set_xlabel("Интенсивность входного потока (λ)")

ax.plot(lambd_list,N_avg3, label='Решением систем уравнений')

ax.plot(lambd_list,N_avg, label='Подсчет кол-ва абонентов в слоте k')

plt.legend()

plt.grid()

k=1000

from scipy.stats import poisson

from scipy.stats import binom

P_come_lambda = [[[[] for j in range(k)] for i in range(k)] for l in range(len(lambd_list))] # количество абонентов, которое пришло в слоте k

for l in range(len(lambd_list)):

  for i in range(k): #для каждого уравнения, состояние, в которое осуществляется переход

    for j in range(k): # номер слагаемого с П; состояние, из которого осуществляется переход


      if i==0 and j<2: #верно

       K=0

       P_come_lambda[l][i][j]=poisson.pmf(k=K, mu=lambd_list[l])

      elif j==0 or j==1: #верно

        K=i

        P_come_lambda[l][i][j]=poisson.pmf(k=K, mu=lambd_list[l])

      elif j==i+1:

        K=0

        P_come_lambda[l][i][j] = poisson.pmf(k=K, mu=lambd_list[l]) * (j) * (1/j) *(1-1/j) ** (j-1)

      elif j
        K=i-j+1

        P_come_lambda[l][i][j] = poisson.pmf(k=K, mu=lambd_list[l]) * (j) * (1/j) *(1-1/j) ** (j-1)

        K=i-j # ни 1 абонент не передал сообщение

        P_come_lambda[l][i][j]+=poisson.pmf(k=K, mu=lambd_list[l]) * (1 - j * (1/j) *(1-1/j) ** (j-1))

      elif j==i:

        K=1 # 1 абонент передал сообщение, а 1 абонент пришёл

        P_come_lambda[l][i][j] = poisson.pmf(k=K, mu=lambd_list[l]) * (j) * (1/j) *(1-1/j) ** (j-1)

        K=0 # ни 1 абонент не передал сообщение и никто не пришёл

        P_come_lambda[l][i][j] += poisson.pmf(k=K, mu=lambd_list[l]) * (1 - j * (1/j) *(1-1/j) ** (j-1))

      else:

        P_come_lambda[l][i][j]=0
for l in range(len(lambd_list)): #для каждой лямбды

  for i in range(k): #для каждого уравнения

    for j in range(k): # номер слагаемого с П

      if i==j:

        P_come_lambda[l][i][j]-=1
for l in range(len(lambd_list)): #для каждой лямбды

  for i in range(k): #для каждого уравнения

    for j in range(k): # номер слагаемого с П

      if i==k-1:

        P_come_lambda[l][i][j]=1
v_last=[[[] for i in range(k)] for l in range(len(lambd_list))]

for l in range(len(lambd_list)):

  for i in range(k):

    v_last[l][i]=0

    if i==k-1:

        v_last[l][i]=1

print(v_last[0])
final=[]

for l in range(len(lambd_list)):

  final.append(np.linalg.solve(P_come_lambda[l],v_last[l]))
#среднее количество абонентов

N_avg4 = [[] for l in range(len(lambd_list))]

for l in range(len(lambd_list)):

  summ = 0

  for j in range(k):

    summ+=final[l][j]*j

    N_avg4[l]=summ

  print(N_avg4[l])

fig = plt.figure() # построения графика зависимости N от λ

ax = fig.add_subplot(111)

ax.set_ylabel("Среднее количество абонентов в системе, N")

ax.set_xlabel("Интенсивность входного потока (λ)")

ax.plot(lambd_list,N_avg4,  label='Решением систем уравнений')

ax.plot(lambd_list,N_avg, label='Подсчет кол-ва абонентов в слоте k')

plt.legend()

plt.grid()

plt.ylim([0, 50])
ПРИЛОЖЕНИЕ Б

Листинг дополнительного задания

import math
import matplotlib.pyplot as plt
import numpy as np
from scipy.stats import norm
# вычисление эмпирической функции
# sample - массив значений, y - аргумент функции
def empirical_distribution(sample, y):
counter = 0

for x in sample:
if x < y:
counter += 1
return counter / len(sample)


def generate_normal(mu, sigma, size):
# сортировка вставкой
def insertion_sort(a):
for i in range(1, len(a)):
value = a[i] # временная переменная для сравнения чисел
j = i - 1
while j >= 0 and value < a[j]:
a[j + 1] = a[j]
j -= 1
a[j + 1] = value
return a

a = np.random.normal(loc=mu, scale=sigma, size=size)
return insertion_sort(a)


def kolmogorov_check(real, mu, sigma):
empirical_real = {}
empirical_teor = {}
D = 0
step = 0.1
x = mu - 3*sigma #правило трех сигм
right = mu + 3*sigma
while x < right:
# считаем эмпирическую функцию для реального распределения (для выборки)
emp_r = empirical_distribution(real, x)
empirical_real[x] = emp_r
# считаем для теоретического
emp_t = norm.cdf(x, mu, sigma)
empirical_teor[x] = emp_t
dif = abs(emp_r - emp_t)
if dif > D:
D = dif
x += step
x = right
# выполняем алгоритм ещё раз для правой границы (так как она не вошла при рассчёте в цикле)
# считаем эмпирическую функцию для реального распределения (для выборки)
emp_r = empirical_distribution(real, x)
empirical_real[x] = emp_r
# считаем для теоретического
emp_t = norm.cdf(x, mu, sigma)
empirical_teor[x] = emp_t
dif = abs(emp_r - emp_t)
if dif > D:
D = dif
return D, empirical_real, empirical_teor


def draw_empirical(real: dict, teor: dict):
plt.figure()
plt.plot(real.keys(), real.values(), color='green', label='real empirical function')
plt.plot(teor.keys(), teor.values(), color='red', label='teor function')
plt.legend()
plt.show()
return


if __name__ == '__main__':
# параметры нормального распределения
# мат ожидание
m = 10
# ско
sigma = 1
# дисперсия
dsp = sigma * sigma
# размер выборки
size = 100
# генерируем выборку с нормальным распределением
real_array = generate_normal(m, sigma, size)
D, emp_real, emp_teor = kolmogorov_check(real_array, m, sigma)
print(D)
draw_empirical(emp_real, emp_teor)