
Добавил:
vadikbee
ИВТ (советую зайти в "Несортированное")
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз:
Предмет:
Файл:4 лаб / НААААААААААА 4444444
.txtimport numpy as np
import matplotlib.pyplot as plt
from matplotlib import gridspec
# Конфигурация системы
BUFFER_MIN = 7.75 # МБ
BUFFER_MAX = 8.25 # МБ
BUFFER_INIT = 7.9 # МБ
Q_MAIN_MIN = 100 # МБ/ч
Q_MAIN_MAX = 900 # МБ/ч
Q_EXTRA = 500 # МБ/ч
SIMULATION_TIME = 3600 # 1 час в секундах
DT = 1 # Шаг моделирования (1 сек)
# Инициализация массивов
time = np.arange(0, SIMULATION_TIME, DT)
V = np.full_like(time, BUFFER_INIT, dtype=float) # Уровень буфера
Q_main = np.zeros_like(time) # Производительность основного источника
G = np.zeros_like(time) # Выходной поток
extra_on = np.zeros_like(time) # Состояние доп. источника
# Начальные условия
Q_main[0] = 600 # Начальная производительность основного источника
last_extra_on = -3600 # Время последнего включения
# Моделирование системы
for i in range(1, len(time)):
# Расчет выходного потока
G[i] = 700 + 500 * np.sin(0.0004 * time[i])
# Управление основным источником
if Q_main[i-1] < Q_MAIN_MAX:
Q_main[i] = Q_main[i-1] + (Q_MAIN_MAX - Q_MAIN_MIN)/40 * DT
else:
Q_main[i] = Q_MAIN_MAX
# Управление дополнительным источником
if (V[i-1] < BUFFER_MIN) and ((time[i] - last_extra_on) > 1200):
extra_on[i] = 1
last_extra_on = time[i]
else:
extra_on[i] = 0
# Расчет уровня буфера
dV = (Q_main[i]/3600 + extra_on[i]*Q_EXTRA/3600 - G[i]/3600) * DT
V[i] = np.clip(V[i-1] + dV, 0, 10) # Ограничение 0-10 МБ
# Постобработка данных
extra_activations = time[extra_on == 1]
buffer_violations = np.where((V < BUFFER_MIN) | (V > BUFFER_MAX))[0]
# Создание комплексного графика
plt.figure(figsize=(16, 12))
gs = gridspec.GridSpec(4, 1, height_ratios=[2, 1, 1, 1])
# График 1: Уровень буфера
ax1 = plt.subplot(gs[0])
ax1.plot(time/3600, V, lw=1.5, color='navy', label='Уровень буфера')
ax1.fill_between(time/3600, BUFFER_MIN, BUFFER_MAX, color='lightgreen', alpha=0.3, label='Рабочая зона')
ax1.axhline(BUFFER_MIN, color='red', ls='--', lw=1, label='Допустимые границы')
ax1.axhline(BUFFER_MAX, color='red', ls='--', lw=1)
ax1.set_title('Динамика уровня информации в буфере', fontsize=12, pad=15)
ax1.set_ylabel('Объем, МБ', fontsize=10)
ax1.grid(True, alpha=0.3)
ax1.legend(loc='upper right')
# График 2: Производительность источников
ax2 = plt.subplot(gs[1])
ax2.plot(time/3600, Q_main, lw=1.5, color='darkorange', label='Основной источник')
ax2.stem(extra_activations/3600, np.full_like(extra_activations, Q_EXTRA),
linefmt='C3--', markerfmt='C3o', basefmt=' ', label='Доп. источник')
ax2.set_title('Производительность источников информации', fontsize=12, pad=15)
ax2.set_ylabel('МБ/ч', fontsize=10)
ax2.set_ylim(0, 1200)
ax2.grid(True, alpha=0.3)
ax2.legend()
# График 3: Выходной поток
ax3 = plt.subplot(gs[2])
ax3.plot(time/3600, G, lw=1.5, color='purple', label='Выходной поток G(t)')
ax3.set_title('Динамика выходного потока информации', fontsize=12, pad=15)
ax3.set_ylabel('МБ/ч', fontsize=10)
ax3.grid(True, alpha=0.3)
ax3.legend()
# График 4: Ошибка регулирования
ax4 = plt.subplot(gs[3])
error = V - BUFFER_INIT
ax4.plot(time/3600, error, lw=1, color='darkcyan', label='Ошибка регулирования')
ax4.fill_between(time/3600, error, 0, where=(error>=0),
color='lime', alpha=0.2, interpolate=True)
ax4.fill_between(time/3600, error, 0, where=(error<0),
color='red', alpha=0.2, interpolate=True)
ax4.set_title('Ошибка регулирования уровня', fontsize=12, pad=15)
ax4.set_xlabel('Время, часы', fontsize=10)
ax4.set_ylabel('Отклонение, МБ', fontsize=10)
ax4.grid(True, alpha=0.3)
ax4.legend()
# Аннотации для критических событий
for t in extra_activations/3600:
ax1.annotate('Включение доп.источника', xy=(t, BUFFER_MIN),
xytext=(t+0.05, BUFFER_MIN-0.1), arrowprops=dict(arrowstyle='->'))
plt.tight_layout()
plt.show()
# Статистика
print(f'''Анализ работы системы:
1. Количество включений доп.источника: {len(extra_activations)}
2. Максимальный уровень: {np.max(V):.2f} МБ
3. Минимальный уровень: {np.min(V):.2f} МБ
4. Время нарушения границ: {len(buffer_violations)*DT} сек
5. Средняя ошибка: {np.mean(error):.4f} МБ''')