
Приложение а «Полный код»
import numpy as np
import matplotlib.pyplot as plt
# константы
SLOTS = 10 ** 4 # количество слотов
T_rb = 0.5 * (10 ** -3) # длительность слота (сек)
T = 300 # температура
V = 2 ** 13 # объем данных в 1 пакете (1 Кб)
R = 2500 # радиус БС
Ptx = 10 # мощность излучения станции
f0 = 900 # частота
kn = 2 # коэффициент шума приемника
DF = 0.18 # полоса пропускания канала связи
k = 1.38 * 10 ** -23 # постоянная Больцмана
Pn = DF * T * k * kn # мощность шума
abonents = [2, 8, 16, 64] # количество абонентов
H = 30 # высота БС
S = 0 # параметр формулы - маленький город
h_s = 2 # высота точки приёма
lambd_list = np.arange(1, 141, 5) # значения интенсивности входного потока
p_list = 1 / (lambd_list * T_rb + 1) # вероятность передачи пакетов
def modeling():
# цикл по количеству пользователей в системе
for user_n in abonents:
# генерация расстояний до абонентов
dist = np.sqrt(np.random.uniform(0, R ** 2, user_n))
# расчет параметров затухания по Окамура-Хата
alpha = (1.1 * np.log10(f0) - 0.7) * h_s - (1.56 * np.log10(f0) - 0.8)
L_db_list = 10 ** ((46.3 + 33.9 * np.log10(f0) - 13.82 * np.log10(H) - alpha +
(44.9 - 6.55 * np.log10(h_s)) * np.log10(dist) + S) / 10)
buffer_volume = [] # для хранения среднего объема данных в буфере
# цикл по значениям интенсивности входного потока
for p, lambd in zip(p_list, lambd_list):
buffer = np.zeros(user_n) # инициализация буфера для каждого абонента
total_data = 0 # суммарный объем данных в буфере
# цикл по количеству моделируемых слотов
for slot in range(SLOTS):
# Расчёт L_i[k] - затухание сигнала
L_db = L_db_list + np.random.normal(0, 1, user_n)
Prx = Ptx / L_db
SNR = Prx / Pn
# расчёт C_i[k] - пропускная способность абонентов
C = DF * np.log2(1 + SNR)
# расчёт V_i[k] - объем передаваемых данных
V_i = C * T_rb
# генерация пакетов данных
packets = (np.random.geometric(p, user_n) - 1) * V
# расчёт D_i[k] - обновление буфера
buffer = np.maximum(0, buffer - V_i) + packets
total_data += sum(buffer)
# расчёт среднего суммарного объема данных в буфере БС
buffer_volume.append(total_data / SLOTS)
print(f'Абонентов = {user_n}, lam = {lambd}, Объём данных = {buffer_volume[-1]}')
# построение графика
plt.plot(lambd_list, buffer_volume, label=f'Абонентов = {user_n}')
plt.xlabel('Интенсивность входного потока (пакет/сек)')
plt.ylabel('Средний суммарный объём данных в буфере (бит)')
plt.legend()
plt.grid()
plt.show()
# Запуск моделирования
modeling()