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