Документация Engee
Notebook

Расположение полюсов и нулей

В этом примере показано, как исследовать расположение полюсов и нулей динамических систем. Это можно сделать графически, построив карту с помощью pzmap. А можно найти численные значения с помощью функции zpkdata.

Изучение расположения полюсов и нулей может быть полезно для таких задач, как анализ устойчивости. В этом примере сравниваются две системы с замкнутым контуром, которые имеют одинаковую передаточную функцию объекта управления и разные контроллеры.


Создадим две модели систем с замкнутым контуром.

In [ ]:
using ControlSystems

G = zpk([], [-5, -5, -10], 100)
C1 = pid(2.9, 7.1)
CL1 = feedback(G * C1, 1)
C2 = pid(29, 7.1)
CL2 = feedback(G * C2, 1)
Out[0]:
TransferFunction{Continuous, ControlSystemsBase.SisoZpk{Float64, ComplexF64}}
                              (1.0s + 5.000000140181413)(1.0s + 4.999999859818593)(1.0s + 0.14084507042253516)
2900.0---------------------------------------------------------------------------------------------------------------------------------
      (1.0s + 5.0)(1.0s + 5.0)(1.0s + 21.10553800168399)(1.0s^2 - 1.2358649411320777s + 148.49404080219574)(1.0s + 0.13032693944811272)

Continuous-time transfer function model

Контроллер C2 имеет гораздо более высокое пропорциональное усиление. В остальном две системы с замкнутым контуром CL1 и CL2 одинаковы.

Графически исследуем расположение полюсов и нулей обеих систем.

In [ ]:
pzmap(CL1,label="CL1")
pzmap!(CL2,label="CL2")
Out[0]:

pzmap отображает расположение полюсов и нулей на комплексной плоскости в виде x и o меток соответственно. При предоставлении нескольких моделей, полюса и нули каждой модели отображаются другим цветом. Здесь полюса и нули CL1 выделены оранжевым цветом, а полюса и нули CL2 - фиолетовым. Нули у функций одинаковы, поэтому накладываясь друг на друга получается зеленый цвет.

График показывает, что все полюса CL1 находятся в левой полуплоскости и, следовательно, CL1 устойчива. Модель системы CL2 содержит полюса в правой полуплоскости, поэтому неустойчива.

Вычислим числовые значения расположения полюсов и нулей в CL2 с помощью zpkmap. Эта кункция возвращает три значения в следующем порядке: коэффициент усиления (k), полюса (p), нули (z).

In [ ]:
z,p,k = zpkdata(CL2)
display(z)
display(p)
1×1 Matrix{Vector{ComplexF64}}:
 [-5.000000140181413 + 0.0im, -4.999999859818593 + 0.0im, -0.14084507042253516 + 0.0im]
1×1 Matrix{Vector{ComplexF64}}:
 [-5.0 + 0.0im, -5.0 + 0.0im, -21.10553800168399 + 0.0im, 0.6179324705660388 + 12.170135589385021im, 0.6179324705660388 - 12.170135589385021im, -0.13032693944811272 + 0.0im]

Также есть отдельная функция для поиска полюсов - poles, и для поиска нулей - tzeros. Найдем отдельные значения для системы CL1.

In [ ]:
poles(CL2)
Out[0]:
6-element Vector{ComplexF64}:
                 -5.0 + 0.0im
                 -5.0 + 0.0im
   -21.10553800168399 + 0.0im
   0.6179324705660388 + 12.170135589385021im
   0.6179324705660388 - 12.170135589385021im
 -0.13032693944811272 + 0.0im
In [ ]:
tzeros(CL1)
Out[0]:
3-element Vector{ComplexF64}:
  -5.0000000890586955 + 0.0im
   -4.999999910941301 + 0.0im
 -0.14084507042253533 + 0.0im

tzero и poles возвращают векторы-столбцы, содержащие местоположения нулей и полюсов системы.

С помощью знания нахождения полюсов и нулей передаточной функции системы, можно судить об ее устойчивости. Больше функций для анализа устойчивости системы можно найти в разделе Анализ.