Добавил:
ИВТ (советую зайти в "Несортированное") Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Скачиваний:
1
Добавлен:
11.12.2024
Размер:
4.33 Кб
Скачать
import 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)
Соседние файлы в папке новая (готовая)