Синтез
Сведения о синтезе и , а также более сложных способах проектирования ЛКГ, см. в разделе, посвященном RobustAndOptimalControl.
#
ControlSystemsBase.kalman
— Method
kalman(Continuous, A, C, R1, R2)
kalman(Discrete, A, C, R1, R2; direct = false)
kalman(sys, R1, R2; direct = false)
Рассчитывает оптимальный коэффициент усиления Калмана.
Если direct = true
, коэффициент усиления наблюдателя вычисляется для пары (A, CA)
, а не (A,C)
. Этот параметр предназначен для использования вместе с параметром direct = true
для observer_controller
. Источник: Computer-Controlled Systems, стр. 140. direct = false
иногда называют эстиматором «с задержкой», а direct = true
— «текущим» эстиматором.
Чтобы получить аппроксимацию в дискретном времени для задачи ЛКГ с непрерывным временем, можно использовать функцию c2d
для получения соответствующих ковариационных матриц в дискретном времени.
Для получения системы LTISystem, представляющей фильтр Калмана, передайте полученный коэффициент усиления обратной связи Калмана в observer_filter
. Чтобы получить регулятор ЛКГ, передайте полученный коэффициент усиления обратной связи Калмана и коэффициент усиления обратной связи по состоянию, вычисленный с помощью lqr
, в observer_controller
.
Аргументы args...; kwargs...
передаются в решатель Риккати, что позволяет задавать взаимную ковариацию и т. д. Дополнительные сведения см. в описании ?MatrixEquations.arec/ared
.
#
ControlSystemsBase.lqr
— Method
lqr(sys, Q, R)
lqr(Continuous, A, B, Q, R, args...; kwargs...)
lqr(Discrete, A, B, Q, R, args...; kwargs...)
Вычисляет оптимальную матрицу коэффициентов усиления K
по закону обратной связи по состоянию u = -K*x
, которая минимизирует функцию стоимости:
J = integral(x’Qx + u’Ru, 0, inf) для модели с непрерывным временем dx = Ax + Bu
. J = sum(x’Qx + u’Ru, 0, inf) для модели с дискретным временем x[k+1] = Ax[k] + Bu[k]
.
Решает задачу ЛКР для системы пространства состояний sys
. Подходит для систем как с дискретным, так и с непрерывным временем.
Аргументы args...; kwargs...
передаются в решатель Риккати, что позволяет задавать взаимную ковариацию и т. д. Дополнительные сведения см. в описании ?MatrixEquations.arec / ared
.
Чтобы также получить решение уравнения Риккати и собственные значения замкнутой системы, вызовите вместо этого ControlSystemsBase.MatrixEquations.arec / ared
(обратите внимание на разный порядок аргументов у этих функций).
Чтобы получить аппроксимацию в дискретном времени для задачи ЛКР с непрерывным временем, можно использовать функцию c2d
для получения соответствующих матриц стоимости в дискретном времени.
Примеры
Непрерывное время
using LinearAlgebra # Для матрицы тожественности I
using Plots
A = [0 1; 0 0]
B = [0; 1]
C = [1 0]
sys = ss(A,B,C,0)
Q = I
R = I
L = lqr(sys,Q,R) # Также можно использовать lqr(Continuous,A,B,Q,R)
u(x,t) = -L*x # Строим закон управления
t=0:0.1:5
x0 = [1,0]
y, t, x, uout = lsim(sys,u,t,x0=x0)
plot(t,x', lab=["Position" "Velocity"], xlabel="Time [s]")
Дискретное время
using LinearAlgebra # Для матрицы тожественности I
using Plots
Ts = 0.1
A = [1 Ts; 0 1]
B = [0;1]
C = [1 0]
sys = ss(A, B, C, 0, Ts)
Q = I
R = I
L = lqr(Discrete, A,B,Q,R) # Также можно использовать lqr(sys,Q,R)
u(x,t) = -L*x # Строим закон управления
t=0:Ts:5
x0 = [1,0]
y, t, x, uout = lsim(sys,u,t,x0=x0)
plot(t,x', lab=["Position" "Velocity"], xlabel="Time [s]")
#
ControlSystemsBase.place
— Function
place(A, B, p, opt=:c; direct = false)
place(sys::StateSpace, p, opt=:c; direct = false)
Вычисляет матрицу коэффициентов усиления K
такую, что A - BK
имеет собственные значения p
.
place(A, C, p, opt=:o) place(sys::StateSpace, p, opt=:o)
Вычисляет матрицу коэффициентов усиления наблюдателя L
такую, что A - LC
имеет собственные значения p
.
Если direct = true
и opt = :o
, коэффициент усиления наблюдателя K
рассчитывается так, что A - KCA
имеет собственные значения p
. Этот параметр предназначен для использования в сочетании с direct = true
в observer_controller
.
Примечание: direct = true
следует применять только к системам с дискретным временем.
Источник: Computer-Controlled Systems, стр. 140.
Применяет формулу Аккермана к одномерным системам и place_knvd
к многомерным.
Имейте в виду, что эта функция может быть чувствительна к численным значениям. Для решения задачи размещения может быть целесообразнее использовать повышенную точность.
#
ControlSystemsBase.place_knvd
— Method
place_knvd(A::AbstractMatrix, B, λ; verbose = false, init = :s)
Надежное размещение полюсов по алгоритму из следующей работы:
Robust Pole Assignment in Linear State Feedback, Каутский (Kautsky), — Никольс (Nichols), Ван Доорен (Van Dooren)
В данной реализации применяется «метод 0» для X-шага и QR-разложение для всех разложений.
Эта функция вызывается автоматически при вызове place
с многомерной системой.
Аргументы:
-
init
: определяет стратегию инициализации для итераций нахождения матрицыX
. Возможные варианты::id
(по умолчанию),:rand
,:s
.
#
ControlSystemsBase.c2d
— Function
sysd = c2d(sys::AbstractStateSpace{<:Continuous}, Ts, method=:zoh; w_prewarp=0)
Gd = c2d(G::TransferFunction{<:Continuous}, Ts, method=:zoh)
Преобразует систему с непрерывным временем sys
в систему с дискретным временем с интервалом дискретизации Ts
с помощью указанного метода method
(:zoh
, :foh
, :fwdeuler
или :tustin
).
method = :tustin
выполняет билинейное преобразование с частотой предварительного искажения w_prewarp
.
-
w_prewarp
: частота предварительного искажения (рад/с) при использовании метода Тастина; для других методов не действует.
См. также описание c2d_x0map
.
Расширенная справка
Дискретизация ZoH является точной для линейных систем с кусочно-заданными постоянными входами (инвариантный шаг), то есть решение, полученное с помощью lsim
, не является приблизительным (абсолютная машинная точность). Дискретизация ZoH широко применяется для дискретизации моделей объектов с непрерывным временем, которые должны управляться регулятором с дискретным временем.
Дискретизация FoH является точной для линейных систем с кусочно-заданными линейными входами (инвариантное линейное изменение). Это хороший вариант для моделирования систем с плавными непрерывными входными сигналами.
Для качественной аппроксимации поведения системы с непрерывным временем в частотном диапазоне лучше всего может подойти метод :tustin
(трапецеидальный билинейный). В этом случае с помощью аргумента предварительного искажения можно обеспечить соответствие частотной характеристики системы с дискретным временем этому же параметру системы с непрерывным временем при заданной частоте. При преобразовании методом Тастина смысл компонентов состояния меняется, а при преобразованиях ZoH и FoH — сохраняется. Метод Тастина широко применяется для дискретизации регулятора с непрерывным временем.
Прямой метод Эйлера, как правило, требует очень небольшого интервала дискретизации относительно постоянных времени системы, поэтому использовать его обычно не рекомендуется.
Согласно классическому правилу выбора интервала дискретизации для расчета системы управления значение Ts
должно быть в диапазоне , где — это частота единичного усиления (рад/с).
#
ControlSystemsBase.c2d
— Method
Qd = c2d(sys::StateSpace{Continuous}, Qc::Matrix, Ts; opt=:o)
Qd, Rd = c2d(sys::StateSpace{Continuous}, Qc::Matrix, Rc::Matrix, Ts; opt=:o)
Qd = c2d(sys::StateSpace{Discrete}, Qc::Matrix; opt=:o)
Qd, Rd = c2d(sys::StateSpace{Discrete}, Qc::Matrix, Rc::Matrix; opt=:o)
Выбирайте непрерывную во времени ковариацию или матрицу стоимости ЛКР так, чтобы они соответствовали предоставленной системе с дискретным временем.
Если opt = :o
(по умолчанию), матрица считается ковариационной. Также можно предоставить ковариацию измерений R
. Если же opt = :c
, матрица считается матрицей стоимости для задачи ЛКР.
Ковариация измерений (здесь обозначается как |
Применяемый метод взят из теоремы 5 в указанном ниже источнике.
Источник: Discrete-time Solutions to the Continuous-time Differential Lyapunov Equation With Applications to Kalman Filtering, Патрик Аксельссон (Patrik Axelsson) и Фредрик Густафссон (Fredrik Gustafsson)
В случае с сингулярными ковариационными матрицами традиционный двойной интегратор с ковариационной матрицей Q = diagm([0,σ²])
нельзя дискретизировать этим методом. Вместо этого необходимо вручную отслеживать входную матрицу («множитель Холецкого») Q
, например на предмет того, вводится ли шум дисперсии σ²
как N = [0, 1]
, в результате чего он дискретизируется методом ZoH и становится Nd = [1/2 Ts^2; Ts]
, что дает ковариационную матрицу σ² * Nd * Nd'
.
Пример:
В следующем примере синтезируется регулятор ЛКР с непрерывным временем для колебательной системы. Он моделируется с помощью OrdinaryDiffEq, чтобы интегратор ОДУ мог также проинтегрировать стоимость ЛКР с непрерывным временем (стоимость добавляется как дополнительная переменная состояния). Затем мы дискретизируем как систему, так и матрицы стоимости, чтобы смоделировать то же самое. Подобная дискретизация контроллера ЛКР иногда называется lqrd
.
using ControlSystemsBase, LinearAlgebra, OrdinaryDiffEq, Test
sysc = DemoSystems.resonant()
x0 = ones(sysc.nx)
Qc = [1 0.01; 0.01 2] # Матрица стоимости с непрерывным временем для состояния
Rc = I(1) # Матрица стоимости с непрерывным временем для входа
L = lqr(sysc, Qc, Rc)
dynamics = function (xc, p, t)
x = xc[1:sysc.nx]
u = -L*x
dx = sysc.A*x + sysc.B*u
dc = dot(x, Qc, x) + dot(u, Rc, u)
return [dx; dc]
end
prob = ODEProblem(dynamics, [x0; 0], (0.0, 10.0))
sol = solve(prob, Tsit5(), reltol=1e-8, abstol=1e-8)
cc = sol.u[end][end] # Стоимость с непрерывным временем
# Вариант с дискретным временем
Ts = 0.01
sysd = c2d(sysc, Ts)
Ld = lqr(sysd, Qd, Rd)
sold = lsim(sysd, (x, t) -> -Ld*x, 0:Ts:10, x0 = x0)
function cost(x, u, Q, R)
dot(x, Q, x) + dot(u, R, u)
end
cd = cost(sold.x, sold.u, Qd, Rd) # Стоимость с дискретным временем
@test cc ≈ cd rtol=0.01 # Результат должен быть аналогичным
#
ControlSystemsBase.c2d_poly2poly
— Method
c2d_poly2poly(ro, Ts)
Возвращает полиномиальные коэффициенты в дискретном времени для заданных полиномиальных коэффициентов в непрерывном времени.
#
ControlSystemsBase.c2d_roots2poly
— Method
c2d_roots2poly(ro, Ts)
Возвращает полиномиальные коэффициенты в дискретном времени для вектора корней в непрерывном времени.
#
ControlSystemsBase.c2d_x0map
— Function
sysd, x0map = c2d_x0map(sys::AbstractStateSpace{<:Continuous}, Ts, method=:zoh; w_prewarp=0)
Возвращает дискретизацию sysd
системы sys
и матрицы x0map
, которая преобразует начальные условия в дискретной области по формуле x0_discrete = x0map*[x0; u0]
.
Дополнительные сведения см. в описании c2d
.
#
ControlSystemsBase.d2c
— Function
d2c(sys::AbstractStateSpace{<:Discrete}, method::Symbol = :zoh; w_prewarp=0)
Преобразует систему в дискретном времени в систему в непрерывном времени, причем предполагается, что система в дискретном времени была дискретизирована с помощью method
. Доступные методы: `:zoh, :fwdeuler´.
-
w_prewarp
: частота предварительного искажения при использовании метода Тастина; для других методов не действует.
#
ControlSystemsBase.d2c
— Function
Qc = d2c(sys::AbstractStateSpace{<:Discrete}, Qd::AbstractMatrix; opt=:o)
Повторно дискретизирует ковариационную матрицу в дискретном времени, относящуюся к sys
, в эквивалентную матрицу в непрерывном времени.
Применяемый метод взят из теоремы 5 в указанном ниже источнике.
Если же opt = :c
, матрица считается матрицей стоимости для задачи ЛКР.
Источник: Discrete-time Solutions to the Continuous-time Differential Lyapunov Equation With Applications to Kalman Filtering Патрик Аксельссон (Patrik Axelsson) и Фредрик Густафссон (Fredrik Gustafsson)
#
ControlSystemsBase.dab
— Method
X,Y = dab(A,B,C)
Решает тождество Диофанта-Ариабхата-Безу
, где и — многочлены, а .
См. «Computer-Controlled Systems: Theory and Design, Third Edition», Карл Йохан Остром (Karl Johan Åström), Бьерн Виттенмарк (Björn Wittenmark)
#
ControlSystemsBase.rstc
— Method
См. ?rstd
для дискретного случая
#
ControlSystemsBase.rstd
— Method
R,S,T = rstd(BPLUS,BMINUS,A,BM1,AM,AO,AR,AS)
R,S,T = rstd(BPLUS,BMINUS,A,BM1,AM,AO,AR)
R,S,T = rstd(BPLUS,BMINUS,A,BM1,AM,AO)
Полиномиальный синтез в дискретном времени.
Полиномиальный синтез согласно главе 10 работы Computer-Controlled Systems для синтеза регулятора
Входы:
-
BPLUS
: часть числителя открытого контура -
BMINUS
: часть числителя открытого контура -
A
: знаменатель открытого контура -
BM1
: дополнительные нули -
AM
: знаменатель закрытого контура -
AO
: многочлен наблюдателя -
AR
: предварительно заданный коэффициент R,
например целая часть от [1, -1]{caret}k
-
AS
: предварительно заданный коэффициент S,
например запирающий фильтр [1, 0, w{caret}2]
Выходы: R,S,T
: многочлены регулятора
Сведения о том, как выбирается решение тождества Диофанта- Ариабхата-Безу, см. в описании функции dab
.
См. «Computer-Controlled Systems: Theory and Design, Third Edition», Карл Йохан Остром (Karl Johan Åström), Бьерн Виттенмарк (Björn Wittenmark)
#
ControlSystemsBase.zpconv
— Method
zpc(a,r,b,s)
Образует conv(a,r) + conv(b,s)
, где длины многочленов выравниваются путем заполнения нулями так, что можно произвести сложение.
#
ControlSystemsBase.laglink
— Method
laglink(a, M; [Ts])
Возвращает соединение с задержкой фазы; выведенное эмпирическим путем значение a = 0.1ωc
гарантирует потерю запаса по фазе менее 6 градусов. Кривая Боде начинается от M
, спадает в точке a/M
и выравнивается в точке 1 для частот более a
.
#
ControlSystemsBase.leadlink
— Function
leadlink(b, N, K=1; [Ts])
Возвращает соединение с опережением фазы. Вершина фазовой кривой находится в точке ω = b√(N)
, где усиление соединения составляет K√(N)
. Кривая Боде начинается от K
, изгибается вверх в точке b
и выравнивается в точке KN
для частот более bN
.
Опережение фазы в точке ω = b√(N)
можно построить как график функции N
с помощью leadlinkcurve()
.
При значениях N < 1
получается соединение с задержкой фазы.
См. также описание leadlinkat
laglink
.
#
ControlSystemsBase.leadlinkat
— Function
leadlinkat(ω, N, K=1; [Ts])
Возвращает соединение с опережением фазы. Вершина фазовой кривой находится в точке ω
, где усиление соединения составляет K√(N)
. Кривая Боде начинается от K
, изгибается вверх в точке ω/√(N)
и выравнивается в точке KN
для частот более ω√(N)
.
Опережение фазы в точке ω
можно построить как график функции N
с помощью leadlinkcurve()
.
При значениях N < 1
получается соединение с задержкой фазы.
См. также описание leadlink
laglink
.
#
ControlSystemsBase.leadlinkcurve
— Function
leadlinkcurve(start=1)
Строит график опережения фазы как функции N
для соединения с опережением фазы. Если задан входной аргумент start
, кривая строится от точки start
до 10; в противном случае от 1 до 10.
См. также описание leadlink, leadlinkat
.
#
ControlSystemsBase.loopshapingPI
— Method
C, kp, ki, fig, CF = loopshapingPI(P, ωp; ϕl, rl, phasemargin, form=:standard, doplot=false, Tf, F)
Выбирает параметры ПИ-регулятора (в параллельной форме) так, что кривая Найквиста P
при частоте ωp
смещается к rl exp(i ϕl)
.
Параметры могут возвращаться в виде одного из нескольких стандартных представлений, выбираемого с помощью form
. Возможные варианты:
-
:standard
- -
:series
- -
:parallel
-
Если указан параметр phasemargin
(в градусах), ϕl
выбирается так, что кривая смещается на угол phasemargin - 180
градусов.
Если параметр rl
не указан, амплитуда кривой при ωp
сохраняется и изменяется только фаза. То же самое верно для ϕl
, если не задан параметр phasemargin.
-
Tf
: необязательная постоянная времени для фильтра шума измерения второго порядка в формеtf(1, [Tf^2, 2*Tf/sqrt(2), 1])
, делающая регулятор строго правильным. -
F
: готовый фильтр, который применяется вместо фильтра второго порядка, используемого по умолчанию, если задан параметрTf
. -
doplot
: строит графикиgangoffourplot
иnyquistplot
системы.
См. также описание loopshapingPID
, pidplots
, stabregionPID
и placePI
.
#
ControlSystemsBase.loopshapingPID
— Method
C, kp, ki, kd, fig, CF = loopshapingPID(P, ω; Mt = 1.3, ϕt=75, form=:standard, doplot=false, lb=-10, ub=10, Tf = 1/1000ω, F = nothing)
Выбирает параметры ПИД-регулятора так, что кривая Найквиста передаточной функции контура при частоте ω
направлена по касательной к окружности в точке, где амплитуда равна Mt
. ϕt
означает положительный угол в градусах между вещественной осью и точкой касания.
Значения Mt
и ϕt
по умолчанию выбраны оптимальным образом для процессов с инерцией и могут потребовать корректировки для более простых процессов.
Коэффициент усиления получившегося регулятора, как правило, возрастает с увеличением ω
и Mt
.
Аргументы:
-
P
: одномерный объект. -
ω
: частота спецификации. -
Mt
: амплитуда комплементарной функции чувствительности при частоте спецификации, $T(iω)
$.
-
ϕt
: положительный угол в градусах между вещественной осью и точкой касания. -
doplot
: при значении true вfig
возвращаются графики четырех параметров и Найквиста. -
lb
: log10 нижней границы дляkd
. -
ub
: log10 верхней границы дляkd
. -
Tf
: постоянная времени для фильтра шума измерения второго порядка в формеtf(1, [Tf^2, 2*Tf/sqrt(2), 1])
, делающая регулятор строго правильным. На практике регулятор обычно задает для этой постоянной времени более медленное значение, чем значение по умолчанию, напримерTf = 1/100ω
илиTf = 1/10ω
. -
F
: готовый фильтр, который применяется вместо фильтра второго порядка по умолчанию.
Параметры могут возвращаться в виде одного из нескольких стандартных представлений, выбираемого с помощью form
. Возможные варианты:
-
:standard
- -
:series
- -
:parallel
-
См. также описание loopshapingPI
, pidplots
, stabregionPID
и placePI
.
Пример:
P = tf(1, [1,0,0]) # Двойной интегратор
Mt = 1.3 # Максимальная амплитуда комплементарной чувствительности
ω = 1 # Частота, при которой сохраняется спецификация
C, kp, ki, kd, fig, CF = loopshapingPID(P, ω; Mt, ϕt = 75, doplot=true)
#
ControlSystemsBase.pid
— Function
C = pid(param_p, param_i, [param_d]; form=:standard, state_space=false, [Tf], [Ts])
Рассчитывает и возвращает ПИД-регулятор.
В качестве form
можно выбрать одну из следующих форм:
-
:standard
-Kp*(1 + 1/(Ti*s) + Td*s)
-
:series
-Kc*(1 + 1/(τi*s))*(τd*s + 1)
-
:parallel
-Kp + Ki/s + Kd*s
Если state_space
имеет значение true
, то либо параметр kd
должен быть равен нулю, либо необходимо указать положительное значение Tf
для создания фильтра на входе с целью реализации пространства состояний. Применяется фильтр 1 / (1 + s*Tf + (s*Tf)^2/2)
, где в качестве Tf
обычно можно выбрать Ti/N
для ПИ-регулятора или Td/N
для ПИД-регулятора, а N
обычно находится в диапазоне от 2 до 20. Пространство состояний возвращается в контролируемой канонической форме.
Для дискретного регулятора можно задать положительное значение Ts
. В этом случае регулятор с непрерывным временем дискретизируется методом Тастина.
Примеры
C1 = pid(3.3, 1, 2) # Kd≠0 работает без фильтра в форме tf C2 = pid(3.3, 1, 2; Tf=0.3, state_space=true) # В пространстве состояний требуется фильтр C3 = pid(2., 3, 0; Ts=0.4, state_space=true) # Дискретный
Также экспортируются функции pid_tf
и pid_ss
. Они принимают те же параметры, и именно они вызываются в pid
в зависимости от параметра state_space
.
#
ControlSystemsBase.pidplots
— Method
pidplots(P, args...; params_p, params_i, params_d=0, form=:standard, ω=0, grid=false, kwargs...)
Строит графики представляющих интерес показателей, связанных с замыканием контура управления вокруг процесса P
с ПИД-регулятором, указанным в params
в одной из следующих форм:
-
:standard
-Kp*(1 + 1/(Ti*s) + Td*s)
-
:series
-Kc*(1 + 1/(τi*s))*(τd*s + 1)
-
:parallel
-Kp + Ki/s + Kd*s
Передаваемые значения могут быть массивами, если необходимо рассчитать несколько разных регуляторов, а если grid=true
, будет выполнен сеточный поиск по всем возможным сочетаниям значений.
Доступны следующие графики: :gof
для четырех параметров, :nyquist
, :controller
для графика Боде передаточной функции регулятора и :pz
для карт корней и полюсов. Они должны указываться как дополнительные аргументы функции.
Вы также можете указать вектор частот ω
для графиков Боде и Найквиста.
См. также описание loopshapingPI
, stabregionPID
#
ControlSystemsBase.placePI
— Method
C, kp, ki = placePI(P, ω₀, ζ; form=:standard)
Выбирает параметры ПИ-регулятора так, что полюса замкнутого контура между P
и C
размещаются в соответствии с полюсами s^2 + 2ζω₀s + ω₀^2
.
Параметры могут возвращаться в виде одного из нескольких стандартных представлений, выбираемого с помощью form
. Возможные варианты:
-
:standard
- -
:series
- (эквивалентно предыдущему варианту для ПИ-регуляторов) -
:parallel
-
C
— это возвращаемая передаточная функция регулятора, а params
— именованный кортеж, содержащий параметры. К параметрам в именованном кортеже можно обращаться в форме params.Kp
или params["Kp"]
, либо их можно распаковать так: Kp, Ti, Td = values(params)
.
См. также описание loopshapingPI
.
#
ControlSystemsBase.stabregionPID
— Function
kp, ki, fig = stabregionPID(P, [ω]; kd=0, doplot=false, form=:standard)
Отрезки кривой, генерируемые этой программой, представляют границы области устойчивости для процесса с передаточной функцией P(s). Предполагается, что дифференциальный коэффициент усиления предоставлен в параллельной форме, то есть в форме kp + ki/s + kd s, но результат может быть преобразован в любую форму, заданную с помощью ключевого слова form
. Кривая находится путем анализа
Если P
— это функция (например, s -> exp(-sqrt(s))), устойчивость контуров обратной связи, использующих ПИ-регуляторы, может быть проанализирована для процессов с моделями, имеющими произвольные аналитические функции. См. также loopshapingPI
, loopshapingPID
, pidplots
.
#
ControlSystemsBase.sminreal
— Method
sminreal(sys)
Вычисляет структурно минимальную реализацию системы пространства состояний sys
. Структурно минимальной является такая реализация, в которой удаляются только те состояния, которые можно определить как неконтролируемые и ненаблюдаемые на основе положения 0s в sys
.
Системы с числовым шумом в коэффициентах, например шумом в порядке eps
, требуют усечения до нуля, чтобы было возможным структурное упрощение, например:
trunc_zero!(A) = A[abs.(A) .< 10eps(maximum(abs, A))] .= 0
trunc_zero!(sys.A); trunc_zero!(sys.B); trunc_zero!(sys.C)
sminreal(sys)
В отличие от функции minreal
, которая производит устранение нулевых значений сигнала с использованием операций линейной алгебры, имеет сложность xD835__xDC42(nₓ{caret}3) и допускает числовые погрешности, функция sminreal
требует очень низких вычислительных затрат и обладает числовой точностью (работает с целыми числами). Однако sminreal
имеет гораздо меньшую способность к сокращению порядка модели.
См. также описание функции minreal
.
#
ControlSystemsBase.add_input
— Function
add_input(sys::AbstractStateSpace, B2::AbstractArray, D2 = 0)
Добавляет входы в sys
, образуя
Если B2
— целое число, оно интерпретируется как индекс и используется входная матрица, содержащая одну единицу по указанному индексу.
В следующем примере строится модель инноваций, которая принимает инновации в качестве входов:
G = ssrand(2,2,3, Ts=1)
K = kalman(G, I(G.nx), I(G.ny))
sys = add_input(G, K)
#
ControlSystemsBase.add_output
— Function
add_output(sys::AbstractStateSpace, C2::AbstractArray, D2 = 0)
Добавляет выходы в sys
, образуя
Если C2
— целое число, оно интерпретируется как индекс и используется выходная матрица, содержащая одну единицу по указанному индексу.
#
ControlSystemsBase.append
— Method
append(systems::StateSpace...), append(systems::TransferFunction...)
Добавляет системы в блочно-диагональной форме.
#
ControlSystemsBase.array2mimo
— Method
array2mimo(M::AbstractArray{<:LTISystem})
Принимает массив систем LTISystem
и создает одну многомерную систему.
#
ControlSystemsBase.feedback
— Method
feedback(sys1::AbstractStateSpace, sys2::AbstractStateSpace;
U1=:, Y1=:, U2=:, Y2=:, W1=:, Z1=:, W2=Int[], Z2=Int[],
Wperm=:, Zperm=:, pos_feedback::Bool=false)
Базовое использование: feedback(sys1, sys2)
образует соединение с (отрицательной) обратной связью.
┌──────────────┐
◄──────────┤ sys1 │◄──── Σ ◄──────
│ │ │ │
│ └──────────────┘ -1
│ |
│ ┌──────────────┐ │
└─────►│ sys2 ├──────┘
│ │
└──────────────┘
Если вторая система sys2
не задана, предполагается отрицательная тождественная обратная связь (sys2 = 1
).
Расширенное использование: feedback
также поддерживает более гибкое использование, как показано на рисунке ниже.
┌──────────────┐
z1◄─────┤ sys1 │◄──────w1
┌─── y1◄─────┤ │◄──────u1 ◄─┐
│ └──────────────┘ │
│ α
│ ┌──────────────┐ │
└──► u2─────►│ sys2 ├───────►y2──┘
w2─────►│ ├───────►z2
└──────────────┘
U1
, W1
— индексы входных сигналов sys1
, соответствующие u1
и w1
. Y1
, Z1
— индексы выходных сигналов sys1
, соответствующие y1
и z1
. U2
, W2
, Y2
, Z2
— соответствующие сигналы sys2
.
Укажите Wperm
и Zperm
, чтобы изменить порядок входов (соответствующих [w1; w2]) и выходов (соответствующих [z1; z2]) в итоговой модели пространства состояний.
По умолчанию обратная связь отрицательная (α = -1). Для положительной обратной связи (α = 1) укажите pos_feedback=true
.
См. также lft
, starprod
, sensitivity
, input_sensitivity
, output_sensitivity
, comp_sensitivity
, input_comp_sensitivity
, output_comp_sensitivity
, G_PS
, G_CS
.
В разделе руководства От блок-схем к коду содержатся более подробные инструкции по использованию этой функции.
Схожие (но немного менее симметричные) формулы см. в работе Чжоу (Zhou), Дойла (Doyle), Гловера (Glover) (1996).
#
ControlSystemsBase.feedback
— Method
feedback(sys)
feedback(sys1, sys2)
Для общей системы ЛПП feedback
образует соединение с отрицательной обратной связью.
>-+ sys1 +-->
| |
(-)sys2 +
Если вторая система не задана, предполагается отрицательная тождественная обратная связь.
#
ControlSystemsBase.feedback2dof
— Method
feedback2dof(P,R,S,T)
feedback2dof(B,A,R,S,T)
-
Возвращает
BT/(AR+ST)
, где B и A — соответственно многочлен-числитель и многочлен-знаменательP
. -
Возвращает
BT/(AR+ST)
.
#
ControlSystemsBase.feedback2dof
— Method
feedback2dof(P::TransferFunction, C::TransferFunction, F::TransferFunction)
Возвращает передаточную функцию, P(F+C)/(1+PC)
которая представляет замкнутую систему с процессом P
, регулятором C
и фильтром прямой обратной связи F
от опорного сигнала к управляющему (с обходом C
).
+-------+ | | +-----> F +----+ | | | | | +-------+ | | +-------+ | +-------+ r | - | | | | | y +--+-----> C +----+----> P +---+--> | | | | | | | +-------+ +-------+ | | | +--------------------------------+
#
ControlSystemsBase.lft
— Function
lft(G, Δ, type=:l)
Нижнее и верхнее дробно-линейное преобразование (ДЛП) между системами G
и Δ
.
Для нижнего ДЛП укажите :l
, для верхнего — :u
.
У G
должно быть больше входов и выходов, чем у Δ
.
Подробные сведения см. в главе 9.1 в работе К. Чжоу (Zhou, K.) и Дж. Дойла (JC Doyle) Essentials of robust control, Prentice hall (NJ), 1998 г.
#
ControlSystemsBase.parallel
— Method
parallel(sys1::LTISystem, sys2::LTISystem)
Соединяет системы параллельно; эквивалентно sys2+sys1
.
#
ControlSystemsBase.series
— Method
series(sys1::LTISystem, sys2::LTISystem)
Соединяет системы последовательно; эквивалентно sys2*sys1
.
#
ControlSystemsBase.starprod
— Method
starprod(sys1, sys2, dimu, dimy)
Вычисляет произведение звезды Редхеффера.
length(U1) = length(Y2) = dimu
и length(Y1) = length(U2) = dimy
Подробные сведения см. в главе 9.3 в работе К. Чжоу (Zhou, K.) и Дж. Дойла (JC Doyle) Essentials of robust control, Prentice hall (NJ), 1998 г.
#
ControlSystemsBase.G_CS
— Method
G_CS(P, C)
Передаточная функция замкнутой системы от шума измерения (--) или опорного узла (+) на выход управляющего сигнала. Строго говоря, передаточная функция задается в виде (1 + CP)⁻¹C
, поэтому SC
было бы более правильным, но нестандартным именем.
▲ │e₁ │ ┌─────┐ d₁────+──┴──► P ├─────┬──►e₄ │ └─────┘ │ │ │ │ ┌─────┐ -│ e₂◄──┴─────┤ C ◄──┬──+───d₂ └─────┘ │ │e₃ ▼
-
input_sensitivity
— передаточная функция из d₁ в e₁, (I + CP)⁻¹ -
output_sensitivity
— передаточная функция из d₂ в e₃, (I + PC)⁻¹ -
input_comp_sensitivity
— передаточная функция из d₁ в e₂, (I + CP)⁻¹CP -
output_comp_sensitivity
— передаточная функция из d₂ в e₄, (I + PC)⁻¹PC -
G_PS
— передаточная функция из d₁ в e₄, (1 + PC)⁻¹P -
G_CS
— передаточная функция из d₂ в e₂, (1 + CP)⁻¹C
#
ControlSystemsBase.G_PS
— Method
G_PS(P, C)
Передаточная функция замкнутой системы от возмущения по нагрузке к выходу объекта. Строго говоря, передаточная функция задается в виде (1 + PC)⁻¹P
, поэтому SP
было бы более правильным, но нестандартным именем.
▲ │e₁ │ ┌─────┐ d₁────+──┴──► P ├─────┬──►e₄ │ └─────┘ │ │ │ │ ┌─────┐ -│ e₂◄──┴─────┤ C ◄──┬──+───d₂ └─────┘ │ │e₃ ▼
-
input_sensitivity
— передаточная функция из d₁ в e₁, (I + CP)⁻¹ -
output_sensitivity
— передаточная функция из d₂ в e₃, (I + PC)⁻¹ -
input_comp_sensitivity
— передаточная функция из d₁ в e₂, (I + CP)⁻¹CP -
output_comp_sensitivity
— передаточная функция из d₂ в e₄, (I + PC)⁻¹PC -
G_PS
— передаточная функция из d₁ в e₄, (1 + PC)⁻¹P -
G_CS
— передаточная функция из d₂ в e₂, (1 + CP)⁻¹C
#
ControlSystemsBase.comp_sensitivity
— Method
См. описание output_comp_sensitivity
.
▲ │e₁ │ ┌─────┐ d₁────+──┴──► P ├─────┬──►e₄ │ └─────┘ │ │ │ │ ┌─────┐ -│ e₂◄──┴─────┤ C ◄──┬──+───d₂ └─────┘ │ │e₃ ▼
-
input_sensitivity
— передаточная функция из d₁ в e₁, (I + CP)⁻¹ -
output_sensitivity
— передаточная функция из d₂ в e₃, (I + PC)⁻¹ -
input_comp_sensitivity
— передаточная функция из d₁ в e₂, (I + CP)⁻¹CP -
output_comp_sensitivity
— передаточная функция из d₂ в e₄, (I + PC)⁻¹PC -
G_PS
— передаточная функция из d₁ в e₄, (1 + PC)⁻¹P -
G_CS
— передаточная функция из d₂ в e₂, (1 + CP)⁻¹C
#
ControlSystemsBase.extended_gangoffour
— Function
extended_gangoffour(P, C, pos=true)
Возвращает систему пространства состояний, которая сопоставляет
-
опорный сигнал или шум измерения
w1
-
возмущение по нагрузке
w2
с
-
погрешностью управления
z1
-
входным управляющим сигналом
z2
z1 z2 ▲ ┌─────┐ ▲ ┌─────┐ │ │ │ │ │ │ w1──+─┴─►│ C ├──┴───+─►│ P ├─┐ │ │ │ │ │ │ │ │ └─────┘ │ └─────┘ │ │ w2 │ └────────────────────────────┘
Возвращаемая система имеет матрицу передаточной функции
или в коде
# Для одномерного P
S = G[1, 1]
PS = G[1, 2]
CS = G[2, 1]
T = G[2, 2]
# Для многомерного P
S = G[1:P.ny, 1:P.nu]
PS = G[1:P.ny, P.ny+1:end]
CS = G[P.ny+1:end, 1:P.ny]
T = G[P.ny+1:end, P.ny+1:end] # Комплементарная функция чувствительности по входу
График всех четырех параметров можно построить следующим образом:
Gcl = extended_gangoffour(G, C) # Строим замкнутую систему
bodeplot(Gcl, lab=["S" "CS" "PS" "T"], plotphase=false) |> display # Строим график четырех параметров
Обратите внимание, что последний вход Gcl представляет собой передаточные функции PS
и T
из gangoffour2
с обратным знаком. Чтобы получить передаточную матрицу с тем же знаком, что и у G_PS
и input_comp_sensitivity
, вызовите extended_gangoffour(P, C, pos=false)
. Более подробный пример см. в описании glover_mcfarlane
из RobustAndOptimalControl.jl. См. также описание ncfmargin
и feedback_control
из RobustAndOptimalControl.jl.
#
ControlSystemsBase.input_comp_sensitivity
— Method
input_comp_sensitivity(P,C)
Передаточная функция от возмущения по нагрузке к управляющему сигналу.
-
«Входная» (input) означает, что передаточная функция направлена в сторону от входа объекта.
-
«Комплементарная» (comp) означает, что передаточная функция направлена в сторону выхода (в данном случае выхода регулятора).
▲ │e₁ │ ┌─────┐ d₁────+──┴──► P ├─────┬──►e₄ │ └─────┘ │ │ │ │ ┌─────┐ -│ e₂◄──┴─────┤ C ◄──┬──+───d₂ └─────┘ │ │e₃ ▼
-
input_sensitivity
— передаточная функция из d₁ в e₁, (I + CP)⁻¹ -
output_sensitivity
— передаточная функция из d₂ в e₃, (I + PC)⁻¹ -
input_comp_sensitivity
— передаточная функция из d₁ в e₂, (I + CP)⁻¹CP -
output_comp_sensitivity
— передаточная функция из d₂ в e₄, (I + PC)⁻¹PC -
G_PS
— передаточная функция из d₁ в e₄, (1 + PC)⁻¹P -
G_CS
— передаточная функция из d₂ в e₂, (1 + CP)⁻¹C
#
ControlSystemsBase.input_sensitivity
— Method
input_sensitivity(P, C)
Передаточная функция от возмущения по нагрузке к общему входу объекта.
-
«Входная» (input) означает, что передаточная функция направлена в сторону от входа объекта.
▲ │e₁ │ ┌─────┐ d₁────+──┴──► P ├─────┬──►e₄ │ └─────┘ │ │ │ │ ┌─────┐ -│ e₂◄──┴─────┤ C ◄──┬──+───d₂ └─────┘ │ │e₃ ▼
-
input_sensitivity
— передаточная функция из d₁ в e₁, (I + CP)⁻¹ -
output_sensitivity
— передаточная функция из d₂ в e₃, (I + PC)⁻¹ -
input_comp_sensitivity
— передаточная функция из d₁ в e₂, (I + CP)⁻¹CP -
output_comp_sensitivity
— передаточная функция из d₂ в e₄, (I + PC)⁻¹PC -
G_PS
— передаточная функция из d₁ в e₄, (1 + PC)⁻¹P -
G_CS
— передаточная функция из d₂ в e₂, (1 + CP)⁻¹C
#
ControlSystemsBase.output_comp_sensitivity
— Method
output_comp_sensitivity(P,C)
Передаточная функция от шума измерения или опорного узла на выход объекта.
-
«Выходная» (output) означает, что передаточная функция направлена в сторону от выхода объекта.
-
«Комплементарная» (comp) означает, что передаточная функция направлена в сторону выхода (в данном случае выхода объекта).
▲ │e₁ │ ┌─────┐ d₁────+──┴──► P ├─────┬──►e₄ │ └─────┘ │ │ │ │ ┌─────┐ -│ e₂◄──┴─────┤ C ◄──┬──+───d₂ └─────┘ │ │e₃ ▼
-
input_sensitivity
— передаточная функция из d₁ в e₁, (I + CP)⁻¹ -
output_sensitivity
— передаточная функция из d₂ в e₃, (I + PC)⁻¹ -
input_comp_sensitivity
— передаточная функция из d₁ в e₂, (I + CP)⁻¹CP -
output_comp_sensitivity
— передаточная функция из d₂ в e₄, (I + PC)⁻¹PC -
G_PS
— передаточная функция из d₁ в e₄, (1 + PC)⁻¹P -
G_CS
— передаточная функция из d₂ в e₂, (1 + CP)⁻¹C
#
ControlSystemsBase.output_sensitivity
— Method
output_sensitivity(P, C)
Передаточная функция от шума измерения или опорного узла на погрешность управления.
-
«Выходная» (output) означает, что передаточная функция направлена в сторону от выхода объекта.
▲ │e₁ │ ┌─────┐ d₁────+──┴──► P ├─────┬──►e₄ │ └─────┘ │ │ │ │ ┌─────┐ -│ e₂◄──┴─────┤ C ◄──┬──+───d₂ └─────┘ │ │e₃ ▼
-
input_sensitivity
— передаточная функция из d₁ в e₁, (I + CP)⁻¹ -
output_sensitivity
— передаточная функция из d₂ в e₃, (I + PC)⁻¹ -
input_comp_sensitivity
— передаточная функция из d₁ в e₂, (I + CP)⁻¹CP -
output_comp_sensitivity
— передаточная функция из d₂ в e₄, (I + PC)⁻¹PC -
G_PS
— передаточная функция из d₁ в e₄, (1 + PC)⁻¹P -
G_CS
— передаточная функция из d₂ в e₂, (1 + CP)⁻¹C
#
ControlSystemsBase.sensitivity
— Method
Функция чувствительности по выходу — это передаточная функция от опорного входа на погрешность управления, а функция чувствительности по входу — передаточная функция от возмущения на входе объекта к общему входу объекта. Для одномерных систем функции чувствительности по входу и выходу равны. Как правило, требуется минимизировать функцию чувствительности, чтобы повысить надежность и производительность, однако из-за существующих на практике ограничений функция чувствительности всегда стремится к 1 при высоких частотах. При надежном подходе минимизируется пик функции чувствительности . Пиковая амплитуда — это величина, обратная расстоянию между кривой Найквиста открытого контура и критической точкой --1. Ограничение пика чувствительности по верху обеспечивает более низкие границы запасов по фазе и усилению в соответствии с формулой
Как правило, лучше ограничивать , чем определять запасы по усилению и фазе, из-за возможных одновременных отклонений по усилению и фазе, из-за чего надежность может снижаться даже несмотря на большие запасы по усилению и фазе.
▲ │e₁ │ ┌─────┐ d₁────+──┴──► P ├─────┬──►e₄ │ └─────┘ │ │ │ │ ┌─────┐ -│ e₂◄──┴─────┤ C ◄──┬──+───d₂ └─────┘ │ │e₃ ▼
-
input_sensitivity
— передаточная функция из d₁ в e₁, (I + CP)⁻¹ -
output_sensitivity
— передаточная функция из d₂ в e₃, (I + PC)⁻¹ -
input_comp_sensitivity
— передаточная функция из d₁ в e₂, (I + CP)⁻¹CP -
output_comp_sensitivity
— передаточная функция из d₂ в e₄, (I + PC)⁻¹PC -
G_PS
— передаточная функция из d₁ в e₄, (1 + PC)⁻¹P -
G_CS
— передаточная функция из d₂ в e₂, (1 + CP)⁻¹C
#
ControlSystemsBase.bodev
— Method
bodev(sys::LTISystem, w::AbstractVector; $(Expr(:kw, :unwrap, true)))
Предназначен для использования с одномерными системами, где действует так же, как bode
, но лишние измерения в возвращаемых значениях удаляются.
#
ControlSystemsBase.bodev
— Method
bodev(sys::LTISystem; )
Предназначен для использования с одномерными системами, где действует так же, как bode
, но лишние измерения в возвращаемых значениях удаляются.
#
ControlSystemsBase.freqrespv
— Method
freqrespv(G::AbstractMatrix, w_vec::AbstractVector{<:Real}; )
Предназначен для использования с одномерными системами, где действует так же, как freqresp
, но лишние измерения в возвращаемых значениях удаляются.
#
ControlSystemsBase.freqrespv
— Method
freqrespv(G::Number, w_vec::AbstractVector{<:Real}; )
Предназначен для использования с одномерными системами, где действует так же, как freqresp
, но лишние измерения в возвращаемых значениях удаляются.
386#W"}, Tuple{LTISystem, AbstractVector{var"#386#W"}}} where var"#386#W"<:Real">
ControlSystemsBase.freqrespv
— Method
freqrespv(sys::LTISystem, w_vec::AbstractVector{W}; )
Предназначен для использования с одномерными системами, где действует так же, как freqresp
, но лишние измерения в возвращаемых значениях удаляются.
#
ControlSystemsBase.nyquistv
— Method
nyquistv(sys::LTISystem, w::AbstractVector; )
Предназначен для использования с одномерными системами, где действует так же, как nyquist
, но лишние измерения в возвращаемых значениях удаляются.
#
ControlSystemsBase.nyquistv
— Method
nyquistv(sys::LTISystem; )
Предназначен для использования с одномерными системами, где действует так же, как nyquist
, но лишние измерения в возвращаемых значениях удаляются.
#
ControlSystemsBase.sigmav
— Method
sigmav(sys::LTISystem, w::AbstractVector; )
Предназначен для использования с одномерными системами, где действует так же, как sigma
, но лишние измерения в возвращаемых значениях удаляются.
#
ControlSystemsBase.sigmav
— Method
sigmav(sys::LTISystem; )
Предназначен для использования с одномерными системами, где действует так же, как sigma
, но лишние измерения в возвращаемых значениях удаляются.