Добавлен: 28.03.2024
Просмотров: 29
Скачиваний: 1
ВНИМАНИЕ! Если данный файл нарушает Ваши авторские права, то обязательно сообщите нам.
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)