Амплитудно-фазочастотная характеристика (АФХ) — ключевой инструмент анализа динамических систем в автоматике, радиотехнике и обработке сигналов. Её построение вручную отнимает часы, но 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)*шаг) для логарифмического масштаба|
Добавить столбец jω с мнимыми частотами (=КОМПЛЕКС(0;ω))|
Проверить, что количество точек не менее 100 для плавной кривой-->
Критическая ошибка новичков: использование линейного шага для ω приводит к скученности точек на низких частотах и разреженности на высоких, что искажает АФХ в критических зонах (например, около частоты среза).
| Параметр | Значение | Ячейка Excel | Примечание |
|---|---|---|---|
Коэффициент усиления K | 10 | B2 | Безразмерная величина |
Постоянная времени T | 0.5 с | B3 | В секундах |
Коэффициент демпфирования ξ | 0.7 | B4 | Для колебательного звена 0 < ξ < 1 |
Начальная частота ω_min | 0.01 рад/с | B5 | Логарифмический масштаб |
Конечная частота ω_max | 100 рад/с | 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(ω*τ)).
Построение графика АФХ
Когда данные готовы, переходим к визуализации:
- Выделите столбцы с Re и Im (например,
F2:F101иG2:G101). - Перейдите на вкладку
Вставка → Точечная диаграмма → Точечная с гладкими кривыми. - Уберите легенду и линии сетки (они мешают анализу).
- Добавьте горизонтальную и вертикальную оси, пересекающиеся в (0,0).
- Отметьте точку (-1,0) — это критическая точка Найквиста.
Для наглядности:
- 🎨 Используйте красный цвет для кривой АФХ.
- 🔴 Добавьте маркер на точку (-1,0) с подписью "Граница устойчивости".
- 📌 Подпишите оси: "Re(W(jω))" и "Im(W(jω))".
Как добавить стрелки направления на график?
1. Вставьте фигурную стрелку из меню Вставка → Фигуры.
2. Поверните её вдоль кривой АФХ.
3. Скопируйте стрелку и расположите вдоль траектории с шагом 5-10 точек.
4. Группируйте стрелки (Формат → Группировать), чтобы они не сдвигались при изменении данных.
Пример корректно построенной АФХ для колебательного звена (ξ=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,0) против часовой стрелки.
- Если да — система неустойчива в замкнутом состоянии.
- Если нет — система устойчива.
- Оцените запас устойчивости:
- 📏 Запас по амплитуде = 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)*шаг) |
| Неправильная формула для знаменателя | Ошибка "#ЗНАЧ!" или неверная форма годографа | Проверять приоритет операций: сначала умножение, затем сложение. Использовать скобки! |
Отсутствие мнимой единицы в jω | АФХ превращается в вещественную функцию (прямая линия) | Всегда использовать =КОМПЛЕКС(0;ω) для jω |
| Некорректные пределы осей | Критическая точка (-1,0) не видна на графике | Установить ось X и Y от -2 до 2 (или шире для систем с большим усилением) |
| Игнорирование запаздывания | АФХ не отражает реальное поведение системы | Добавлять множитель e^(-jωτ) через формулу Эйлера |
Ещё одна распространённая проблема — несовпадение АФХ с теоретическими расчётами. Причины:
- 🔍 Округление в промежуточных вычислениях. Решение: увеличить количество знаков после запятой в ячейках (формат
Числовойс 10 знаками). - 📉 Недостаточно точек в критической области. Решение: увеличить количество строк в диапазоне частот до 200-500.
- 🧮 Ошибки в передаточной функции. Решение: проверить расчёт вручную для 2-3 частот (например, ω=0, ω=1, ω→∞).
Экспорт данных для дальнейшего анализа
Excel удобен для построения АФХ, но для глубокого анализа (например, синтеза регуляторов) данные лучше перенести в MATLAB или Python. Как экспортировать:
- Выделите столбцы с
ω,ReиIm. - Скопируйте их (
Ctrl+C). - Вставьте в текстовый файл (
.txtили.csv) черезБлокнот. - Импортируйте в 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(ω*τ))
Умножьте этот множитель на передаточную функцию без запаздывания.
Почему моя АФХ выглядит как прямая линия, а не кривая?
Это происходит, если:
- Вы забыли добавить мнимую часть в
jω(используйте=КОМПЛЕКС(0;ω)). - В знаменателе передаточной функции отсутствует мнимая часть (проверьте формулы).
- Диапазон частот слишком мал (увеличьте
ω_maxдо 100-1000 рад/с).
Как построить АФХ для системы с нулями и полюсами?
Для передаточной функции вида W(s) = K·(s+z1)/(s+p1)·(s+z2)/(s+p2):
- Рассчитайте числитель:
K*(jω + z1)*(jω + z2). - Рассчитайте знаменатель:
(jω + p1)*(jω + p2). - Разделите числитель на знаменатель (используйте
ИМДЕЛ).
Для каждого множителя используйте формулу:
=КОМПЛЕКС(0;ω) + полюс_или_нуль
Можно ли построить АФХ для нелинейной системы?
Нет, АФХ применима только к линейным стационарным системам. Для нелинейных систем используют:
- 📊 Фазовые портреты (в MATLAB или Python).
- 🔄 Метод гармонической линеаризации (для приближённого анализа).
Как добавить на график АФХ линии постоянных амплитуд и фаз?
В Excel это сделать сложно, но можно:
- Постройте вспомогательные данные для окружностей (постоянная амплитуда) и лучей (постоянная фаза).
- Используйте
Добавление ряда данныхна графике. - Для окружности радиуса
Rс центром в (0,0):x = R*COS(φ),y = R*SIN(φ), гдеφ— угол от 0 до 2π.
Гораздо проще сделать это в MATLAB с помощью функции nyquistplot или в Python с matplotlib.