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

Построение графиков реакций системы

В этом примере показано, как построить графики временных и частотных характеристик линейных систем SISO и MIMO.

Построение временных характеристик

Создадим передаточную функцию третьего порядка.

In [ ]:
using ControlSystems
sys = tf([8, 18, 32],[1, 6, 14, 24])
Out[0]:
TransferFunction{Continuous, ControlSystemsBase.SisoRational{Int64}}
   8s^2 + 18s + 32
---------------------
s^3 + 6s^2 + 14s + 24

Continuous-time transfer function model

Вы можете построить графики переходной и импульсной функций системы с помощью step() и impulse() библиотеки ControlSystems.jl.

In [ ]:
plot(
    plot(step(sys,10),title="Реакция на ступенчатое воздействие"),
    plot(impulse(sys,10),title="Реакция на импульс"),
    layout=(2,1)
)
Out[0]:

Вы также можете смоделировать реакцию на произвольный сигнал, такой как синусоида, с помощью команды lsim(). Входной сигнал отображается серым цветом, а реакция системы — синим.lsim

In [ ]:
t = collect(0:0.001:4);
u = sin.(10*t);

plot(lsim(sys,u',t))
plot!(t,u)
Out[0]:

Команды получения частотных и временных характеристик можно использовать с непрерывными и дискретными сигналами или моделями. Для моделей пространства состояний можно также построить график реакции системы из некоторого заданного начального состояния.

In [ ]:
A = [-0.8 3.6 -2.1;-3 -1.2 4.8;3 -4.3 -1.1];
B = [0; -1.1; -0.2];
C = [1.2 0 0.6];
D = -0.6;
G = ss(A,B,C,D)

t1 = collect(0:0.001:18);
u1 = fill(0,(1, 18001))
x_0 = [-1.0; 0.0; 2.0]  # initial state
plot(lsim(G, u1, t1, x0 = x_0))
Out[0]:

Частотные характеристики

Анализ в частотной области является ключом к пониманию устойчивости и эксплуатационных характеристик систем управления. Графики Боде, Найквиста и Николса — это три стандартных способа построения и анализа частотной характеристики линейной системы. Вы можете создать эти графики с помощью команд ControlSystemsBase.bodeplot, ControlSystemsBase.nicholsplot и ControlSystemsBase.nyquistplot.

In [ ]:
bodeplot(sys, label="sys",title="Диаграмма Боде")
Out[0]:
In [ ]:
nyquistplot(
    sys, 
    unit_circle = true,
    Mt_circles = true,
    hz = true,
    label="sys",
    title="Диаграмма Найквиста"
)
Out[0]:
In [ ]:
ws = exp10.(range(-2,stop=2,length=200))
nicholsplot(sys,ws)
Out[0]:

Карты полюсов и нулей, корневой годограф

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

respdemo_07.png

Здесь: $$ G=\frac{-(2s+1)}{s^2+3s+2} $$

Для определения усточивости замкнутого контура системы можно построить карту полюсов и нулей.

In [ ]:
s = tf('s');
G = -(2*s+1)/(s^2+3*s+2);
k = 0.7;
T = feedback(G*k,1);

pzmap(T; hz = true)
Out[0]:

Полюса замкнутого контура (отмеченные крестиками) лежат в левой полуплоскости, поэтому замкнутая система устойчива при этом выборе усиления.

Чтобы лучше понять, как усиление замкнутого контура влияет на устойчивость. Вы можете построить график расположения полюсов, то есть коорневоой годограф командой rlocus().

In [ ]:
plot(rlocus(G,3))
Out[0]:

Если навести курсор на место пересечения годографа с осью Oy, то мы увидим значение коэффициента, когда система становится неустойчивой. Таким образом, коэффициент усиления замкнутого контура должен оставаться меньше 1,5 для его устойчивости.

Характеристики откликов системы

На графиках откликов можно отображать различные характеристики. Покажем на примере графика реакции на ступенчатое воздействие.

In [ ]:
result = step(T);
plot(result)
Out[0]:

Чтобы определить характеристики графика, используйте функцию stepinfo. Она возвращает все характерристики переходного процесса, например, время установившегося значения, перерегулирование и тд. Эту информацию можно записать в переменную, а также можно отразить на графике с помощью plot.

In [ ]:
res1 = stepinfo(result)
Out[0]:
StepInfo:
Initial value:     0.000
Final value:      -0.538
Step size:         0.538
Peak:             -0.820
Peak time:         1.533 s
Overshoot:         52.21 %
Undershoot:        -0.00 %
Settling time:     5.986 s
Rise time:         0.438 s
In [ ]:
plot(stepinfo(result))
Out[0]:

Анализ MIMO систем

Все команды, перечисленные выше, полностью поддерживают системы с несколькими входами и выходами (MIMO).

Создадим систему с двумя входами и двумя выходами. Для этого подключим библиотеку RobustAndOptimalControl.jl.

In [ ]:
import Pkg
Pkg.add("RobustAndOptimalControl")
   Resolving package versions...
  No Changes to `~/.project/Project.toml`
  No Changes to `~/.project/Manifest.toml`
In [ ]:
using RobustAndOptimalControl

Зададим систему в пространстве состояний случайным оразом используя ssrand. Дадим названия входам, выходам и состояниям системы с помощью named_ss.

In [ ]:
sys = named_ss(ssrand(2,2,3), x=:x, u=:u, y=:y)
Out[0]:
NamedStateSpace{Continuous, Float64}
A = 
 -0.6935858467597371  -0.032817470930895265  -0.3016581326344437
  0.5058765400071297  -1.6615260469669768     0.10945949288601392
 -1.247932807541346    0.7137077690752949    -0.5819319866343858
B = 
 -1.237448751523171   -0.3036661565073825
 -1.0848540704260157   1.6705711712602642
  1.2314535524207553   1.373228442496533
C = 
 -0.21514307560050283  1.4187348362176657  0.133664233314064
  0.7819036714282767   1.329056006320937   0.48281519607043166
D = 
 0.39388861160244376  0.003475472871380889
 2.133431314048057    2.2733658279516127

Continuous-time state-space model
With state  names: x1 x2 x3
     input  names: u1 u2
     output names: y1 y2
In [ ]:
sys.A .= [-0.5 -0.3 -0.2 ; 0 -1.3 -1.7; 0.4 1.7 -1.3]
sys
Out[0]:
NamedStateSpace{Continuous, Float64}
A = 
 -0.5  -0.3  -0.2
  0.0  -1.3  -1.7
  0.4   1.7  -1.3
B = 
 -1.237448751523171   -0.3036661565073825
 -1.0848540704260157   1.6705711712602642
  1.2314535524207553   1.373228442496533
C = 
 -0.21514307560050283  1.4187348362176657  0.133664233314064
  0.7819036714282767   1.329056006320937   0.48281519607043166
D = 
 0.39388861160244376  0.003475472871380889
 2.133431314048057    2.2733658279516127

Continuous-time state-space model
With state  names: x1 x2 x3
     input  names: u1 u2
     output names: y1 y2
In [ ]:
plot(step(sys,8))
Out[0]:

Другие полезнае графики для построения MIMO систем.

  • График сингулярных значений (sigma). Для MIMO систем график сингулярных значений показывает минимальные линии на графике, соответствующие каждому сингулярному значению матрицы частотной характеристики.
  • Отображение полюсов / нулей для каждой пары ввода-вывода.

Например, постройте график пикового усиления sys в зависимости от частоты:

In [ ]:
sigmaplot(sys)
Out[0]:

Сравнение систем

Для сравнения характеристик различных систем, можно отобразить их на одном графике. Назначить каждой системе определенный цвет, маркер или стиль линий для удобства сравнения. Используя приведенный выше пример обратной связи, построим пошаговый отклик замкнутого контура для трех значений коэффициента усиления контура k тремя разными цветами:

In [ ]:
k1 = 0.4;
T1 = feedback(G*k1,1);
k2 = 1;
T2 = feedback(G*k2,1);
plot(step([T T1 T2]), line=[:green :red :black])
Out[0]:

Вывод

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