Добавил:
ИВТ (советую зайти в "Несортированное") Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

3 лаба / НАААААААА 333

.txt
Скачиваний:
2
Добавлен:
25.03.2025
Размер:
3.52 Кб
Скачать
import numpy as np
import matplotlib.pyplot as plt
from scipy import signal

# Параметры объекта управления
numerator = [10]
denominator = [1, 6, 5]  # (s+1)(s+5) = s² + 6s + 5
sys = signal.TransferFunction(numerator, denominator)

# Требуемые параметры
tp = 0.05       # Время регулирования
sigma = 5       # Перерегулирование (%)

# Расчет желаемых полюсов
zeta = np.cos(np.deg2rad(46))       # Для 5% перерегулирования
wn = 3/(tp * zeta)                  # Собственная частота
desired_poles = [-zeta*wn + 1j*wn*np.sqrt(1-zeta**2),
                 -zeta*wn - 1j*wn*np.sqrt(1-zeta**2)]

# Преобразование в пространство состояний
A = [[-6, -5], [1, 0]]  # Матрица из коэффициентов знаменателя
B = [[1], [0]]           # Вектор управления
C = [0, 10]              # Вектор выхода
D = [0]

# Ручной расчет коэффициентов регулятора
k1 = 2 * zeta * wn - 6
k2 = wn**2 - 5
K = np.array([k1, k2])

# Матрицы замкнутой системы
A_closed = np.array(A) - np.dot(B, K.reshape(1, -1))
B_closed = np.array(B) * 5
C_closed = np.array(C).reshape(1, -1)
D_closed = np.array(D)

# Создание объекта StateSpace
sys_closed = signal.StateSpace(A_closed, B_closed, C_closed, D_closed)

# Построение графиков
plt.figure(figsize=(14, 8))

# Переходная характеристика (увеличенный временной интервал)
t, y = signal.step(sys_closed, T=np.linspace(0, 0.3, 3000))  # Было 0.1 → стало 0.3 сек

# Установившееся значение (последнее значение переходной характеристики)
steady_state_value = y[-1]

# Границы перерегулирования (5% от установившегося значения)
overshoot_upper = steady_state_value * (1 + sigma / 100)
overshoot_lower = steady_state_value * (1 - sigma / 100)

plt.subplot(2, 2, (1,3))
plt.plot(t, y, 'b', linewidth=2, label='Переходная характеристика')
plt.axhline(y=overshoot_upper, color='r', linestyle='--', linewidth=1.5, label='+5% перерегулирования')
plt.axhline(y=overshoot_lower, color='r', linestyle='--', linewidth=1.5, label='-5% перерегулирования')
plt.axhline(y=steady_state_value, color='k', linestyle='-', linewidth=1, label='Установившееся значение')
plt.title('Переходная характеристика', fontsize=12)
plt.xlabel('Время, с', fontsize=10)
plt.ylabel('Амплитуда', fontsize=10)
plt.grid(True, alpha=0.3)
plt.xlim(0, 0.3)  # Устанавливаем явные границы оси
plt.legend(loc='upper right', fontsize=8)

# АЧХ и ФЧХ
w, mag, phase = signal.bode(sys_closed, n=1000)
plt.subplot(2, 2, 2)
plt.semilogx(w, mag, 'r', linewidth=2)
plt.title('АЧХ', fontsize=12)
plt.ylabel('Амплитуда, дБ', fontsize=10)
plt.grid(True, alpha=0.3)

plt.subplot(2, 2, 4)
plt.semilogx(w, phase, 'g', linewidth=2)
plt.title('ФЧХ', fontsize=12)
plt.ylabel('Фаза, градусы', fontsize=10)
plt.xlabel('Частота, рад/с', fontsize=10)
plt.grid(True, alpha=0.3)

plt.tight_layout()
plt.show()