Расположение полюсов и нулей¶
В этом примере показано, как исследовать расположение полюсов и нулей динамических систем. Это можно сделать графически, построив карту с помощью pzmap
. А можно найти численные значения с помощью функции zpkdata
.
Изучение расположения полюсов и нулей может быть полезно для таких задач, как анализ устойчивости. В этом примере сравниваются две системы с замкнутым контуром, которые имеют одинаковую передаточную функцию объекта управления и разные контроллеры.
Создадим две модели систем с замкнутым контуром.
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 одинаковы.
Графически исследуем расположение полюсов и нулей обеих систем.
pzmap
отображает расположение полюсов и нулей на комплексной плоскости в виде x и o меток соответственно. При предоставлении нескольких моделей, полюса и нули каждой модели отображаются другим цветом. Здесь полюса и нули CL1 выделены оранжевым цветом, а полюса и нули CL2 - фиолетовым. Нули у функций одинаковы, поэтому накладываясь друг на друга получается зеленый цвет.
График показывает, что все полюса CL1 находятся в левой полуплоскости и, следовательно, CL1 устойчива. Модель системы CL2 содержит полюса в правой полуплоскости, поэтому неустойчива.
Вычислим числовые значения расположения полюсов и нулей в CL2 с помощью zpkmap
. Эта кункция возвращает три значения в следующем порядке: коэффициент усиления (k), полюса (p), нули (z).
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.
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
Out[0]:
3-element Vector{ComplexF64}:
-5.0000000890586955 + 0.0im
-4.999999910941301 + 0.0im
-0.14084507042253533 + 0.0im
tzero
и poles
возвращают векторы-столбцы, содержащие местоположения нулей и полюсов системы.
С помощью знания нахождения полюсов и нулей передаточной функции системы, можно судить об ее устойчивости. Больше функций для анализа устойчивости системы можно найти в разделе Анализ.
{"id": "dbb2b6db-0cbb-45cd-a11a-ce54dee9abd4", "data": [{"xaxis": "x", "mode": "markers", "x": [-5.0000000890586955, -4.999999910941301, -0.14084507042253533], "showlegend": true, "name": "CL1", "colorbar": {"title": {"text": ""}}, "zmin": null, "z": null, "legendgroup": "CL1", "y": [0, 0, 0], "zmax": null, "zaxis": null, "yaxis": "y", "marker": {"line": {"color": "rgba(0, 0, 0, 0.5)", "width": 1}, "symbol": "circle", "color": "rgba(0, 154, 250, 0.500)", "size": 30}, "metadata": {"smartZoomParams": {"maxCount": 3, "minCount": 25000, "currentCount": 3}, "shouldEnableSmartZoom": false}, "type": "scatter"}, {"xaxis": "x", "mode": "markers", "x": [-5, -5, -13.749436983200678, -3.086784291031507, -3.086784291031507, -0.07699443473630292], "showlegend": true, "name": "CL1", "colorbar": {"title": {"text": ""}}, "zmin": null, "z": null, "legendgroup": "CL1", "y": [0, 0, 0, 5.39024211036503, -5.39024211036503, 0], "zmax": null, "zaxis": null, "yaxis": "y", "marker": {"line": {"color": "rgba(0, 0, 0, 0.5)", "width": 1}, "symbol": "x", "color": "rgba(227, 111, 71, 0.500)", "size": 30}, "metadata": {"smartZoomParams": {"maxCount": 6, "minCount": 25000, "currentCount": 6}, "shouldEnableSmartZoom": false}, "type": "scatter"}, {"xaxis": "x", "mode": "markers", "x": [-5.000000140181413, -4.999999859818593, -0.14084507042253516], "showlegend": true, "name": "CL2", "colorbar": {"title": {"text": ""}}, "zmin": null, "z": null, "legendgroup": "CL2", "y": [0, 0, 0], "zmax": null, "zaxis": null, "yaxis": "y", "marker": {"line": {"color": "rgba(0, 0, 0, 0.5)", "width": 1}, "symbol": "circle", "color": "rgba(62, 164, 78, 0.500)", "size": 30}, "metadata": {"smartZoomParams": {"maxCount": 3, "minCount": 25000, "currentCount": 3}, "shouldEnableSmartZoom": false}, "type": "scatter"}, {"xaxis": "x", "mode": "markers", "x": [-5, -5, -21.10553800168399, 0.6179324705660388, 0.6179324705660388, -0.13032693944811272], "showlegend": true, "name": "CL2", "colorbar": {"title": {"text": ""}}, "zmin": null, "z": null, "legendgroup": "CL2", "y": [0, 0, 0, 12.170135589385021, -12.170135589385021, 0], "zmax": null, "zaxis": null, "yaxis": "y", "marker": {"line": {"color": "rgba(0, 0, 0, 0.5)", "width": 1}, "symbol": "x", "color": "rgba(195, 113, 210, 0.500)", "size": 30}, "metadata": {"smartZoomParams": {"maxCount": 6, "minCount": 25000, "currentCount": 6}, "shouldEnableSmartZoom": false}, "type": "scatter"}], "config": {"showlegend": false, "height": 400, "xaxis": {"showline": false, "showticklabels": true, "gridcolor": "rgba(0, 0, 0, 0.1)", "tickfont": {"family": "sans-serif", "color": "rgba(0, 0, 0, 1)", "size": 11}, "tickmode": "array", "anchor": "y", "range": [-21.75724211585149, 1.26963658473354], "tickcolor": "rgba(0, 0, 0, 0)", "gridwidth": 0.5, "visible": true, "showgrid": true, "linecolor": "rgba(0, 0, 0, 1)", "zerolinecolor": "rgba(0, 0, 0, 1)", "tickangle": 0, "zeroline": true, "mirror": false, "domain": [0.05100612423447069, 0.9934383202099737], "title": {"font": {"family": "sans-serif", "color": "rgba(0, 0, 0, 1)", "size": 15}, "text": ""}, "ticks": "inside", "type": "linear"}, "annotations": [{"y": 1, "yanchor": "top", "rotation": 0, "x": 0.5222222222222223, "font": {"family": "sans-serif", "color": "rgba(0, 0, 0, 1)", "size": 20}, "yref": "paper", "xref": "paper", "showarrow": false, "text": "Pole-zero map", "xanchor": "center"}], "plot_bgcolor": "rgba(255, 255, 255, 1.000)", "paper_bgcolor": "rgba(255, 255, 255, 1.000)", "margin": {"t": 20, "b": 20, "r": 0, "l": 0}, "yaxis": {"showline": false, "showticklabels": true, "gridcolor": "rgba(0, 0, 0, 0.1)", "tickfont": {"family": "sans-serif", "color": "rgba(0, 0, 0, 1)", "size": 11}, "tickmode": "array", "anchor": "x", "range": [-12.900343724748122, 12.900343724748122], "tickcolor": "rgba(0, 0, 0, 0)", "gridwidth": 0.5, "visible": true, "showgrid": true, "linecolor": "rgba(0, 0, 0, 1)", "zerolinecolor": "rgba(0, 0, 0, 1)", "tickangle": 0, "zeroline": true, "mirror": false, "domain": [0.03762029746281716, 0.9415463692038496], "title": {"font": {"family": "sans-serif", "color": "rgba(0, 0, 0, 1)", "size": 15}, "text": ""}, "ticks": "inside", "type": "linear"}, "width": 1367.953125}}