
Добавил:
vadikbee
ИВТ (советую зайти в "Несортированное")
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз:
Предмет:
Файл:лаб 4 / новая (готовая) / main
.pyimport numpy as np
import matplotlib.pyplot as plt
from scipy import signal
# Классы для представления типовых звеньев
class System:
def __init__(self, transfer_function, name):
self.transfer_function = transfer_function
self.name = name
def bode_plot(self, ax_magnitude, ax_phase):
"""
Строит графики ЛАЧХ (амплитудной частотной характеристики) и ЛФЧХ (фазовой частотной характеристики).
Добавляет подписи для каждого графика.
"""
w, mag, phase = signal.bode(self.transfer_function)
ax_magnitude.semilogx(w, mag, label=self.name) # Добавляем подпись к графику ЛАЧХ
ax_phase.semilogx(w, phase, label=self.name) # Добавляем подпись к графику ЛФЧХ
# Настройка графиков
ax_magnitude.set_ylabel('Амплитуда (дБ)')
ax_phase.set_ylabel('Фаза (градусы)')
ax_magnitude.grid(True, which="both")
ax_phase.grid(True, which="both")
# Классы для каждого типа звена
class Aperiodic(System):
def __init__(self, T):
transfer_function = signal.TransferFunction([1], [T, 1])
super().__init__(transfer_function, "Апериодическое звено")
class Integrator(System):
def __init__(self):
transfer_function = signal.TransferFunction([1], [1, 0])
super().__init__(transfer_function, "Интегрирующее звено")
class Differentiator(System):
def __init__(self):
transfer_function = signal.TransferFunction([1, 0], [1])
super().__init__(transfer_function, "Дифференцирующее звено")
class SecondOrderSystem(System):
def __init__(self, omega_n, zeta):
transfer_function = signal.TransferFunction([omega_n ** 2], [1, 2 * zeta * omega_n, omega_n ** 2])
super().__init__(transfer_function, "Колебательное звено")
# Основная функция для построения графиков ЛАЧХ и ЛФЧХ
def create_and_plot_systems(T_aperiodic, omega_n, zeta):
systems = [
Aperiodic(T_aperiodic),
Integrator(),
Differentiator(),
SecondOrderSystem(omega_n, zeta)
]
# Подготовка графиков
fig, axes = plt.subplots(2, 1, figsize=(12, 10), sharex=True)
fig.suptitle('ЛАЧХ и ЛФЧХ для типовых звеньев', fontsize=16)
ax_magnitude, ax_phase = axes[0], axes[1]
# Построение ЛАЧХ и ЛФЧХ для каждой системы
for sys in systems:
sys.bode_plot(ax_magnitude, ax_phase)
# Настройка оси X
ax_phase.set_xlabel('Частота (рад/с)')
# Добавляем легенду на графики
ax_magnitude.legend()
ax_phase.legend()
plt.tight_layout(rect=[0, 0.03, 1, 0.95])
plt.show()
# Построение кусочно-непрерывной ЛАЧХ
plot_linear_bode()
# Функция для построения кусочной ЛАЧХ
def plot_linear_bode():
frequencies = np.logspace(-2, 2, 100)
linear_magnitude =((0.5*frequencies**3)*(0.2*frequencies+1)) / ((0.1*frequencies+1)**2 * (9*frequencies**2+0.6*frequencies+1)**2)
plt.figure()
plt.semilogx(frequencies, linear_magnitude, label="Кусочно-непрерывная ЛАЧХ")
plt.xlabel("Частота (рад/с)")
plt.ylabel("Амплитуда (дБ)")
plt.title("ЛАЧХ с кусочной аппроксимацией")
plt.legend()
plt.grid(True, which="both")
plt.show()
# Задание параметров системы
T_aperiodic = 1.0 # Параметр апериодического звена
omega_n = 1.0 # Собственная частота колебательного звена
zeta = 0.5 # Коэффициент демпфирования
# Визуализация всех графиков
create_and_plot_systems(T_aperiodic, omega_n, zeta)
Соседние файлы в папке новая (готовая)