Построение АФХ в Excel: от теории к практике с формулами и графиками

Амплитудно-фазочастотная характеристика (АФХ) — ключевой инструмент анализа динамических систем в автоматике, радиотехнике и обработке сигналов. Её построение вручную отнимает часы, но Microsoft Excel позволяет автоматизировать процесс с помощью формул, комплексных чисел и встроенных графиков. Эта статья не просто покажет, как нарисовать кривую на плоскости — она научит корректно рассчитывать АФХ для передаточных функций любого порядка, избегая типичных ошибок при работе с мнимыми числами и логарифмическими масштабами.

Мы разберём два подхода: ручной расчёт (для понимания математики) и автоматизированный (для реальных задач). Вы узнаете, как преобразовать передаточную функцию в частотную характеристику, визуализировать её на комплексной плоскости и даже экспортировать данные для дальнейшего анализа в MATLAB или Python. Особое внимание уделено нюансам настройки осей, выбору диапазона частот и интерпретации результатов — тому, что редко освещают в стандартных руководствах.

Что такое АФХ и почему её строят в Excel

АФХ (или Nyquist plot в западной литературе) отображает зависимость комплексного коэффициента передачи системы от частоты. На графике по оси X откладывается действительная часть (Re), по оси Y — мнимая часть (Im). Каждая точка кривой соответствует определённой частоте, а форма траектории помогает оценить:

  • 🔹 Устойчивость системы по критерию Найквиста (если годограф охватывает точку (-1,0), система неустойчива).
  • 🔹 Частоту среза — где амплитуда падает на 3 дБ.
  • 🔹 Фазовый запас — насколько система далека от границы устойчивости.

Excel подходит для построения АФХ благодаря:

  • 📊 Гибкости формул для работы с комплексными числами (через функции IMREAL, IMAGINARY).
  • 📈 Возможности создавать параметрические графики с динамической привязкой к данным.
  • 🔄 Автоматизации расчётов при изменении параметров системы (например, коэффициентов передаточной функции).
⚠️ Внимание: Excel не заменяет специализированные САПР (MATLAB, SciLab), но идеален для предварительного анализа, обучения или проверки ручных расчётов. Для систем выше 3-го порядка рекомендуется использовать скрипты на Python (библиотека control).

Подготовка данных: передаточная функция и диапазон частот

Прежде чем строить АФХ, нужно определить передаточную функцию системы. Например, для объекта второго порядка:

W(s) = K / (T²·s² + 2·ξ·T·s + 1), где:

  • 🔢 K — коэффициент усиления,
  • T — постоянная времени,
  • 🌊 ξ — коэффициент демпфирования.

В Excel эти параметры удобно разместить в отдельных ячейках (например, B2:B4), чтобы потом ссылаться на них в формулах. Далее выбираем диапазон частот (ω) — от 0.01 рад/с до 100 рад/с с логарифмическим шагом. Для этого:

Создать столбец ω с частотами от 0.01 до 100 рад/с|

Использовать формулу =10^(ЛОГ10(нач_частота) + (НОМЕР_СТРОКИ()-1)*шаг) для логарифмического масштаба|

Добавить столбец с мнимыми частотами (=КОМПЛЕКС(0;ω))|

Проверить, что количество точек не менее 100 для плавной кривой-->

Критическая ошибка новичков: использование линейного шага для ω приводит к скученности точек на низких частотах и разреженности на высоких, что искажает АФХ в критических зонах (например, около частоты среза).

ПараметрЗначениеЯчейка ExcelПримечание
Коэффициент усиления K10B2Безразмерная величина
Постоянная времени T0.5 сB3В секундах
Коэффициент демпфирования ξ0.7B4Для колебательного звена 0 < ξ < 1
Начальная частота ω_min0.01 рад/сB5Логарифмический масштаб
Конечная частота ω_max100 рад/сB6Должна превышать частоту среза

Апериодическое звено|

Колебательное звено|

Интегрирующее звено|

Дифференцирующее звено|

Другой тип-->

Расчёт комплексного коэффициента передачи

Для каждой частоты ω нужно вычислить значение передаточной функции W(jω). В Excel это делается через комплексные числа. Возьмём пример для колебательного звена:

Формула в Excel для числителя (ячейка C2):

=КОМПЛЕКС($B$2;0)

Для знаменателя (ячейка D2):

=($B$3^2  (B2^2)  (-1)) + КОМПЛЕКС(1; 2*$B$4*$B$3*B2)

где B2 — текущая частота ω.

Затем делим числитель на знаменатель (ячейка E2):

=ИМДЕЛ(C2; D2)

Теперь в столбцах F и G извлекаем действительную и мнимую части:

=ИМДЕЙСТВ(E2)  

=ИММНИМ(E2)

⚠️ Внимание: Функция ИМДЕЛ в Excel работает только с комплексными числами в алгебраической форме. Если ваша передаточная функция содержит e^(-jωτ) (запаздывание), используйте формулу Эйлера: =КОМПЛЕКС(COS(ω*τ); -SIN(ω*τ)).

Построение графика АФХ

Когда данные готовы, переходим к визуализации:

  1. Выделите столбцы с Re и Im (например, F2:F101 и G2:G101).
  2. Перейдите на вкладку Вставка → Точечная диаграмма → Точечная с гладкими кривыми.
  3. Уберите легенду и линии сетки (они мешают анализу).
  4. Добавьте горизонтальную и вертикальную оси, пересекающиеся в (0,0).
  5. Отметьте точку (-1,0) — это критическая точка Найквиста.

Для наглядности:

  • 🎨 Используйте красный цвет для кривой АФХ.
  • 🔴 Добавьте маркер на точку (-1,0) с подписью "Граница устойчивости".
  • 📌 Подпишите оси: "Re(W(jω))" и "Im(W(jω))".
Как добавить стрелки направления на график?

1. Вставьте фигурную стрелку из меню Вставка → Фигуры.

2. Поверните её вдоль кривой АФХ.

3. Скопируйте стрелку и расположите вдоль траектории с шагом 5-10 точек.

4. Группируйте стрелки (Формат → Группировать), чтобы они не сдвигались при изменении данных.

Пример графика АФХ в Excel с критической точкой Пример корректно построенной АФХ для колебательного звена (ξ=0.7). Кривая не охватывает точку (-1,0) — система устойчива.

Автоматизация расчётов с помощью VBA

Для систем выше 2-го порядка или при частом изменении параметров ручной расчёт становится утомительным. Macros (VBA) решает эту проблему. Ниже скрипт, который строит АФХ для произвольной передаточной функции:

Sub BuildNyquistPlot()

Dim ws As Worksheet

Set ws = ThisWorkbook.Sheets("АФХ")

' Очистка старых данных

ws.Range("A2:H1000").ClearContents

' Параметры системы (задаются в ячейках B2:B4)

Dim K As Double, T As Double, xi As Double

K = ws.Range("B2").Value

T = ws.Range("B3").Value

xi = ws.Range("B4").Value

' Диапазон частот

Dim w_min As Double, w_max As Double, rows As Integer

w_min = 0.01

w_max = 100

rows = 100

' Заполнение частот (логарифмический масштаб)

For i = 1 To rows

ws.Cells(i + 1, 1).Value = w_min * (w_max / w_min) ^ ((i - 1) / (rows - 1))

Next i

' Расчёт W(jω) = K / (T²(jω)² + 2ξT(jω) + 1)

For i = 1 To rows

Dim w As Double, jw As Complex, denominator As Complex, W As Complex

w = ws.Cells(i + 1, 1).Value

' jω = 0 + jω

jw = ComplexNumber(0, w)

' Знаменатель: T²(jω)² + 2ξT(jω) + 1

denominator = ComplexAdd(

ComplexAdd(

ComplexMult(ComplexNumber(T ^ 2, 0), ComplexMult(jw, jw)),

ComplexMult(ComplexNumber(2 xi T, 0), jw)

),

ComplexNumber(1, 0)

)

' W(jω) = K / denominator

W = ComplexDiv(ComplexNumber(K, 0), denominator)

' Запись Re и Im в ячейки

ws.Cells(i + 1, 2).Value = W.Real

ws.Cells(i + 1, 3).Value = W.Imaginary

Next i

' Построение графика

Dim chartObj As ChartObject

Set chartObj = ws.ChartObjects.Add(Left:=100, Width:=400, Top:=50, Height:=300)

With chartObj.Chart

.ChartType = xlXYScatterSmoothNoMarkers

.SeriesCollection.NewSeries

With .SeriesCollection(1)

.XValues = ws.Range("B2:B" & rows + 1)

.Values = ws.Range("C2:C" & rows + 1)

.Name = "АФХ"

End With

.Axes(xlCategory).MinimumScale = -2

.Axes(xlCategory).MaximumScale = 2

.Axes(xlValue).MinimumScale = -2

.Axes(xlValue).MaximumScale = 2

.HasTitle = True

.ChartTitle.Text = "Амплитудно-фазочастотная характеристика"

End With

End Sub

' Вспомогательные функции для работы с комплексными числами

Type Complex

Real As Double

Imaginary As Double

End Type

Function ComplexNumber(realPart As Double, imagPart As Double) As Complex

ComplexNumber.Real = realPart

ComplexNumber.Imaginary = imagPart

End Function

Function ComplexAdd(a As Complex, b As Complex) As Complex

ComplexAdd.Real = a.Real + b.Real

ComplexAdd.Imaginary = a.Imaginary + b.Imaginary

End Function

Function ComplexMult(a As Complex, b As Complex) As Complex

ComplexMult.Real = a.Real b.Real - a.Imaginary b.Imaginary

ComplexMult.Imaginary = a.Real b.Imaginary + a.Imaginary b.Real

End Function

Function ComplexDiv(a As Complex, b As Complex) As Complex

Dim denominator As Double

denominator = b.Real ^ 2 + b.Imaginary ^ 2

ComplexDiv.Real = (a.Real b.Real + a.Imaginary b.Imaginary) / denominator

ComplexDiv.Imaginary = (a.Imaginary b.Real - a.Real b.Imaginary) / denominator

End Function

Этот скрипт:

  • 🔄 Автоматически пересчитывает АФХ при изменении параметров в ячейках B2:B4.
  • 📈 Строит график с фиксированными пределами осей (-2..2), что удобно для анализа устойчивости.
  • ⚡ Использует логарифмический масштаб для частот.
⚠️ Внимание: Перед запуском макроса включите поддержку VBA в Файл → Параметры → Надстройки → Управление: Надстройки Excel → Перейти → Поставить галочку "Анализ VBA". Если макрос не работает, проверьте настройки безопасности в Центре управления безопасностью.

Анализ устойчивости по АФХ

Главная цель построения АФХ — оценка устойчивости системы по критерию Найквиста. Алгоритм анализа:

  1. Проверьте, охватывает ли годограф точку (-1,0) против часовой стрелки.
  2. Если да — система неустойчива в замкнутом состоянии.
  3. Если нет — система устойчива.
  4. Оцените запас устойчивости:
    • 📏 Запас по амплитуде = 1 / |W(jω_c)|, где ω_c — частота среза.
    • 🔄 Запас по фазе = 180° - arg(W(jω_c)).

В Excel запас устойчивости можно рассчитать так:

  • Добавьте столбец с модулем АФХ: =ИМАБС(E2).
  • Найдите частоту, где модуль равен 1 (частота среза ω_c).
  • В ячейке рядом с ω_c рассчитайте фазу: =ГРАДУСЫ(ATAN2(Im; Re)).
  • Запас по фазе = 180 - абсолютное_значение_фазы.

Пример анализа устойчивости по АФХ Слева: неустойчивая система (годограф охватывает -1). Справа: устойчивая система с запасом по фазе 45°.

Типичные ошибки и как их избежать

Даже опытные инженеры допускают ошибки при построении АФХ в Excel. Вот самые распространённые:

ОшибкаПоследствиеКак исправить
Линейный шаг по частотеСкученность точек на низких частотах, пропуск резонансного пикаИспользовать логарифмический масштаб: =10^(ЛОГ10(ω_min) + (строка-1)*шаг)
Неправильная формула для знаменателяОшибка "#ЗНАЧ!" или неверная форма годографаПроверять приоритет операций: сначала умножение, затем сложение. Использовать скобки!
Отсутствие мнимой единицы в АФХ превращается в вещественную функцию (прямая линия)Всегда использовать =КОМПЛЕКС(0;ω) для
Некорректные пределы осейКритическая точка (-1,0) не видна на графикеУстановить ось X и Y от -2 до 2 (или шире для систем с большим усилением)
Игнорирование запаздыванияАФХ не отражает реальное поведение системыДобавлять множитель e^(-jωτ) через формулу Эйлера

Ещё одна распространённая проблема — несовпадение АФХ с теоретическими расчётами. Причины:

  • 🔍 Округление в промежуточных вычислениях. Решение: увеличить количество знаков после запятой в ячейках (формат Числовой с 10 знаками).
  • 📉 Недостаточно точек в критической области. Решение: увеличить количество строк в диапазоне частот до 200-500.
  • 🧮 Ошибки в передаточной функции. Решение: проверить расчёт вручную для 2-3 частот (например, ω=0, ω=1, ω→∞).

Экспорт данных для дальнейшего анализа

Excel удобен для построения АФХ, но для глубокого анализа (например, синтеза регуляторов) данные лучше перенести в MATLAB или Python. Как экспортировать:

  1. Выделите столбцы с ω, Re и Im.
  2. Скопируйте их (Ctrl+C).
  3. Вставьте в текстовый файл (.txt или .csv) через Блокнот.
  4. Импортируйте в MATLAB:
    data = readmatrix('afh_data.csv');
    

    omega = data(:,1);

    re = data(:,2);

    im = data(:,3);

    plot(re, im); hold on;

    plot(-1, 0, 'ro'); % Критическая точка

    grid on; axis equal;

Для Python (с использованием numpy и matplotlib):

import numpy as np

import matplotlib.pyplot as plt

data = np.loadtxt('afh_data.csv', delimiter=',')

omega, re, im = data[:,0], data[:,1], data[:,2]

plt.plot(re, im, label='АФХ')

plt.plot(-1, 0, 'ro', label='Критическая точка')

plt.xlabel('Re(W(jω))')

plt.ylabel('Im(W(jω))')

plt.legend()

plt.grid(True)

plt.axis('equal')

plt.show()

При экспорте:

  • 📂 Сохраняйте данные в CSV (разделитель — запятая).
  • 🔤 Убедитесь, что в первой строке нет заголовков (или добавьте их вручную в коде импорта).
  • 🔍 Проверьте кодировку файла (для кириллических имен столбцов используйте UTF-8).

FAQ: Частые вопросы по построению АФХ в Excel

Можно ли построить АФХ для системы с запаздыванием?

Да, но нужно учесть множитель e^(-jωτ), где τ — время запаздывания. В Excel это реализуется через формулу Эйлера:

=КОМПЛЕКС(COS(ω*τ); -SIN(ω*τ))

Умножьте этот множитель на передаточную функцию без запаздывания.

Почему моя АФХ выглядит как прямая линия, а не кривая?

Это происходит, если:

  1. Вы забыли добавить мнимую часть в (используйте =КОМПЛЕКС(0;ω)).
  2. В знаменателе передаточной функции отсутствует мнимая часть (проверьте формулы).
  3. Диапазон частот слишком мал (увеличьте ω_max до 100-1000 рад/с).
Как построить АФХ для системы с нулями и полюсами?

Для передаточной функции вида W(s) = K·(s+z1)/(s+p1)·(s+z2)/(s+p2):

  1. Рассчитайте числитель: K*(jω + z1)*(jω + z2).
  2. Рассчитайте знаменатель: (jω + p1)*(jω + p2).
  3. Разделите числитель на знаменатель (используйте ИМДЕЛ).

Для каждого множителя используйте формулу:

=КОМПЛЕКС(0;ω) + полюс_или_нуль
Можно ли построить АФХ для нелинейной системы?

Нет, АФХ применима только к линейным стационарным системам. Для нелинейных систем используют:

  • 📊 Фазовые портретыMATLAB или Python).
  • 🔄 Метод гармонической линеаризации (для приближённого анализа).
Как добавить на график АФХ линии постоянных амплитуд и фаз?

В Excel это сделать сложно, но можно:

  1. Постройте вспомогательные данные для окружностей (постоянная амплитуда) и лучей (постоянная фаза).
  2. Используйте Добавление ряда данных на графике.
  3. Для окружности радиуса R с центром в (0,0): x = R*COS(φ), y = R*SIN(φ), где φ — угол от 0 до 2π.

Гораздо проще сделать это в MATLAB с помощью функции nyquistplot или в Python с matplotlib.