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

Синтез

Сведения о синтезе и , а также более сложных способах проектирования ЛКГ, см. в разделе, посвященном RobustAndOptimalControl.

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.

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]")
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 к многомерным.

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

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.

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 должно быть в диапазоне , где  — это частота единичного усиления (рад/с).

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, матрица считается матрицей стоимости для задачи ЛКР.

Ковариация измерений (здесь обозначается как Rc) обычно оценивается в дискретные моменты времени и в этом случае не зависит от частоты дискретизации. Дискретизация ковариации измерений имеет смысл только в том случае, если синтезирован регулятор с непрерывным временем и необходимо получить ближайший к нему регулятор с дискретным временем.

Применяемый метод взят из теоремы 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           # Результат должен быть аналогичным
c2d_poly2poly(ro, Ts)

Возвращает полиномиальные коэффициенты в дискретном времени для заданных полиномиальных коэффициентов в непрерывном времени.

c2d_roots2poly(ro, Ts)

Возвращает полиномиальные коэффициенты в дискретном времени для вектора корней в непрерывном времени.

sysd, x0map = c2d_x0map(sys::AbstractStateSpace{<:Continuous}, Ts, method=:zoh; w_prewarp=0)

Возвращает дискретизацию sysd системы sys и матрицы x0map, которая преобразует начальные условия в дискретной области по формуле x0_discrete = x0map*[x0; u0].

Дополнительные сведения см. в описании c2d.

d2c(sys::AbstractStateSpace{<:Discrete}, method::Symbol = :zoh; w_prewarp=0)

Преобразует систему в дискретном времени в систему в непрерывном времени, причем предполагается, что система в дискретном времени была дискретизирована с помощью method. Доступные методы: `:zoh, :fwdeuler´.

  • w_prewarp: частота предварительного искажения при использовании метода Тастина; для других методов не действует.

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)

X,Y = dab(A,B,C)

Решает тождество Диофанта-Ариабхата-Безу

, где и  — многочлены, а .

См. «Computer-Controlled Systems: Theory and Design, Third Edition», Карл Йохан Остром (Karl Johan Åström), Бьерн Виттенмарк (Björn Wittenmark)

См. ?rstd для дискретного случая

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)

zpc(a,r,b,s)

Образует conv(a,r) + conv(b,s), где длины многочленов выравниваются путем заполнения нулями так, что можно произвести сложение.

laglink(a, M; [Ts])

Возвращает соединение с задержкой фазы; выведенное эмпирическим путем значение a = 0.1ωc гарантирует потерю запаса по фазе менее 6 градусов. Кривая Боде начинается от M, спадает в точке a/M и выравнивается в точке 1 для частот более a.

leadlink(b, N, K=1; [Ts])

Возвращает соединение с опережением фазы. Вершина фазовой кривой находится в точке ω = b√(N), где усиление соединения составляет K√(N). Кривая Боде начинается от K, изгибается вверх в точке b и выравнивается в точке KN для частот более bN.

Опережение фазы в точке ω = b√(N) можно построить как график функции N с помощью leadlinkcurve().

При значениях N < 1 получается соединение с задержкой фазы.

См. также описание leadlinkat laglink.

leadlinkat(ω, N, K=1; [Ts])

Возвращает соединение с опережением фазы. Вершина фазовой кривой находится в точке ω, где усиление соединения составляет K√(N). Кривая Боде начинается от K, изгибается вверх в точке ω/√(N) и выравнивается в точке KN для частот более ω√(N).

Опережение фазы в точке ω можно построить как график функции N с помощью leadlinkcurve().

При значениях N < 1 получается соединение с задержкой фазы.

См. также описание leadlink laglink.

leadlinkcurve(start=1)

Строит график опережения фазы как функции N для соединения с опережением фазы. Если задан входной аргумент start, кривая строится от точки start до 10; в противном случае от 1 до 10.

См. также описание leadlink, leadlinkat.

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.

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)
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.

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

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.

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.

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.

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)
add_output(sys::AbstractStateSpace, C2::AbstractArray, D2 = 0)

Добавляет выходы в sys, образуя

Если C2 — целое число, оно интерпретируется как индекс и используется выходная матрица, содержащая одну единицу по указанному индексу.

append(systems::StateSpace...), append(systems::TransferFunction...)

Добавляет системы в блочно-диагональной форме.

array2mimo(M::AbstractArray{<:LTISystem})

Принимает массив систем LTISystem и создает одну многомерную систему.

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).

feedback(sys)
feedback(sys1, sys2)

Для общей системы ЛПП feedback образует соединение с отрицательной обратной связью.

>-+ sys1 +-->
  |      |
 (-)sys2 +

Если вторая система не задана, предполагается отрицательная тождественная обратная связь.

feedback2dof(P,R,S,T)
feedback2dof(B,A,R,S,T)
  • Возвращает BT/(AR+ST), где B и A — соответственно многочлен-числитель и многочлен-знаменатель P.

  • Возвращает BT/(AR+ST).

feedback2dof(P::TransferFunction, C::TransferFunction, F::TransferFunction)

Возвращает передаточную функцию, P(F+C)/(1+PC) которая представляет замкнутую систему с процессом P, регулятором C и фильтром прямой обратной связи F от опорного сигнала к управляющему (с обходом C).

         +-------+
         |       |
   +----->   F   +----+
   |     |       |    |
   |     +-------+    |
   |     +-------+    |    +-------+
r  |  -  |       |    |    |       |    y
+--+----->   C   +----+---->   P   +---+-->
      |  |       |         |       |   |
      |  +-------+         +-------+   |
      |                                |
      +--------------------------------+
lft(G, Δ, type=:l)

Нижнее и верхнее дробно-линейное преобразование (ДЛП) между системами G и Δ.

Для нижнего ДЛП укажите :l, для верхнего — :u.

У G должно быть больше входов и выходов, чем у Δ.

Подробные сведения см. в главе 9.1 в работе К. Чжоу (Zhou, K.) и Дж. Дойла (JC Doyle) Essentials of robust control, Prentice hall (NJ), 1998 г.

parallel(sys1::LTISystem, sys2::LTISystem)

Соединяет системы параллельно; эквивалентно sys2+sys1.

series(sys1::LTISystem, sys2::LTISystem)

Соединяет системы последовательно; эквивалентно sys2*sys1.

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 г.

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

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

См. описание 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

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.

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

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

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

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

Функция чувствительности по выходу  — это передаточная функция от опорного входа на погрешность управления, а функция чувствительности по входу  — передаточная функция от возмущения на входе объекта к общему входу объекта. Для одномерных систем функции чувствительности по входу и выходу равны. Как правило, требуется минимизировать функцию чувствительности, чтобы повысить надежность и производительность, однако из-за существующих на практике ограничений функция чувствительности всегда стремится к 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

bodev(sys::LTISystem, w::AbstractVector; $(Expr(:kw, :unwrap, true)))

Предназначен для использования с одномерными системами, где действует так же, как bode, но лишние измерения в возвращаемых значениях удаляются.

bodev(sys::LTISystem; )

Предназначен для использования с одномерными системами, где действует так же, как bode, но лишние измерения в возвращаемых значениях удаляются.

freqrespv(G::AbstractMatrix, w_vec::AbstractVector{<:Real}; )

Предназначен для использования с одномерными системами, где действует так же, как freqresp, но лишние измерения в возвращаемых значениях удаляются.

freqrespv(G::Number, w_vec::AbstractVector{<:Real}; )

Предназначен для использования с одномерными системами, где действует так же, как freqresp, но лишние измерения в возвращаемых значениях удаляются.

freqrespv(sys::LTISystem, w_vec::AbstractVector{W}; )

Предназначен для использования с одномерными системами, где действует так же, как freqresp, но лишние измерения в возвращаемых значениях удаляются.

nyquistv(sys::LTISystem, w::AbstractVector; )

Предназначен для использования с одномерными системами, где действует так же, как nyquist, но лишние измерения в возвращаемых значениях удаляются.

nyquistv(sys::LTISystem; )

Предназначен для использования с одномерными системами, где действует так же, как nyquist, но лишние измерения в возвращаемых значениях удаляются.

sigmav(sys::LTISystem, w::AbstractVector; )

Предназначен для использования с одномерными системами, где действует так же, как sigma, но лишние измерения в возвращаемых значениях удаляются.

sigmav(sys::LTISystem; )

Предназначен для использования с одномерными системами, где действует так же, как sigma, но лишние измерения в возвращаемых значениях удаляются.