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

Анализ

Сведения об анализе надежности см. в разделе, посвященном RobustAndOptimalControl.jl.

Wn, zeta, ps = damp(sys)

Вычисляет собственные частоты, Wn, и коэффициенты демпфирования, zeta, для полюсов, ps, sys.

dampreport(sys)

Отображает отчет о полюсах, коэффициенте демпфирования, собственной частоте и постоянной времени системы sys.

dcgain(sys, ϵ=0)

Вычисляет статический коэффициент усиления (dcgain) системы sys,

равный G(0) для систем с непрерывным временем и G(1) для систем с дискретным временем.

ϵ можно указать для вычисления dcgain при малом возмущении в область устойчивости комплексной плоскости.

dₘ = delaymargin(G::LTISystem)

Возвращает запас устойчивости по запаздыванию dₘ. Для систем с дискретным временем запас устойчивости по запаздыванию нормализуется временем выборки, т. е. значение представляет собой запас в виде количества раз выборки. Поддерживает только системы SISO.

S, PS, CS, T = gangoffour(P, C; minimal=true)
gangoffour(P::AbstractVector, C::AbstractVector; minimal=true)

Если задана передаточная функция, описывающая объект P, и передаточная функция, описывающая регулятор C, вычисляет четыре передаточные функции в Большой четверке.

  • S = 1/(1+PC) Функция чувствительности

  • PS = (1+PC)\P Воздействие нагрузки на измерительный сигнал

  • CS = (1+PC)\C Отношение шума измерения к сигналу управления

  • T = PC/(1+PC) Комплементарная функция чувствительности

Если minimal=true, то minreal будет применяться ко всем передаточным функциям.

S, PS, CS, T, RY, RU, RE = gangofseven(P,C,F)

Если заданы передаточные функции, описывающие объект P, регулятор C и блок с прямой связью F, вычисляет четыре передаточные функции в Большой четверке и передаточные функции, соответствующие прямой связи.

  • S = 1/(1+PC) Функция чувствительности

  • PS = P/(1+PC)

  • CS = C/(1+PC)

  • T = PC/(1+PC) Комплементарная функция чувствительности

  • RY = PCF/(1+PC)

  • RU = CF/(1+P*C)

  • RE = F/(1+P*C)

wgm, gm, wpm, pm = margin(sys::LTISystem, w::Vector; full=false, allMargins=false)

возвращает частоты для запасов по усилению, запасы по усилению, частоты для запасов по фазе, запасы по фазе.

Если задано !allMargins, возвращает только наименьший запас.

Если задано full, возвращает также fullPhase. См. также описание delaymargin и RobustAndOptimalControl.diskmargin.

markovparam(sys, n)

Вычисляет n-й марковский параметр системы пространства состояний с дискретным временем sys. Определяется следующим образом.

h(0) = D

h(n) = C*A^(n-1)*B

poles(sys)

Вычисляет полюса системы sys.

reduce_sys(A::AbstractMatrix, B::AbstractMatrix, C::AbstractMatrix, D::AbstractMatrix, meps::AbstractFloat)

Реализует REDUCE в документе Эмами-Найни и Ван Доорена (Emami-Naeini & Van Dooren). Возвращает преобразованные матрицы A, B, C, D. Они пусты, если в них нет нулей.

relative_gain_array(A::AbstractMatrix; tol = 1.0e-15)

Справка: «On the Relative Gain Array (RGA) with Singular and Rectangular Matrices» Jeffrey Uhlmann https://arxiv.org/pdf/1805.10312.pdf

relative_gain_array(G, w::AbstractVector)
relative_gain_array(G, w::Number)

Вычисляет массив относительных коэффициентов усиления G на частотах w. G(iω) .* pinv(tranpose(G(iω)))

RGA можно использовать для поиска пар входа-выхода для управления MIMO с помощью индивидуально настраиваемых контуров. Создавайте пары входов и выходов таким образом, чтобы RGA(ωc) на частоте перехода стал как можно ближе к диагональному. Избегайте пар, в которых RGA(0) содержит отрицательные диагональные элементы.

  • Сумма абсолютных значений записей в RGA является хорошей мерой «истинного числа условий» G, наилучшего числа условий, которое может быть достигнуто путем масштабирования входных/выходных данных G, — Глэд, Люнг (Glad, Ljung).

  • RGA инвариантен к масштабированию входных/выходных данных G.

  • Если RGA содержит большие записи, система может быть чувствительна к ошибкам модели, — Скогестад (Skogestad), «Multivariable Feedback Control: Analysis and Design»

    • Неопределенность во входных каналах (диагональная входная неопределенность). Объекты с

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

    • Неопределенность элементов. Большие элементы RGA предполагают чувствительность к поэлементной неопределенности.

    Однако на практике такая неопределенность может не проявиться из-за физических связей между элементами передаточной функции. Поэтому диагональная неопределенность входных данных (которая всегда присутствует) обычно больше затрагивает объекты с большими элементами RGA.

Массив относительных коэффициентов усиления вычисляется с помощью обобщенной инверсии с единичной согласованностью (UC). Справка: «On the Relative Gain Array (RGA) with Singular and Rectangular Matrices» Jeffrey Uhlmann https://arxiv.org/pdf/1805.10312.pdf

tzeros(sys)

Вычисляет инвариантные нули системы sys. Если sys является минимальной реализацией, это также передаточные нули.

z, p, k = zpkdata(sys)

Вычислить нули, полюса и коэффициенты усиления системы sys.

Возвращаемые значения

  • z: Matrix{Vector{ComplexF64}}, (ny × nu)

  • p: Matrix{Vector{ComplexF64}}, (ny × nu)

  • k: Matrix{Float64}, (ny × nu)

are(::Continuous, A, B, Q, R)

Вычисляет «X» — решение алгебраического уравнения Риккати с непрерывным временем, определенного как A’X + XA - (XB)R{caret}-1(B’X) + Q = 0, где R является несингулярным.

В задаче ЛКР Q связан с ухудшением состояния , а R — с ухудшением управления . Дополнительные сведения см. в документе lqr.

Использует MatrixEquations.arec. Сведения об именованных аргументах см. в docstring для ControlSystemsBase.MatrixEquations.arec. Обратите внимание, что они определяют входные аргументы в другом порядке.

are(::Discrete, A, B, Q, R; kwargs...)

Вычисляет X — решение алгебраического уравнения Риккати с дискретным временем, определенного как A’XA - X - (A’XB)(B’XB + R){caret}-1(B’XA) + Q = 0, где Q>=0 и R>0.

В задаче ЛКР Q связан с ухудшением состояния , а R — с ухудшением управления . Дополнительные сведения см. в документе lqr.

Использует MatrixEquations.ared. Сведения об именованных аргументах см. в docstring для ControlSystemsBase.MatrixEquations.ared. Обратите внимание, что они определяют входные аргументы в другом порядке.

S, P, B = balance(A[, perm=true])

Вычисляет преобразование подобия T = S*P, что дает B = T\A*T, благодаря чему нормы строк и столбцов B приблизительно эквивалентны. Если perm=false, преобразование будет только масштабировать A с помощью диагонали S, но не перестанавливать A (т. е. задавать P=I).

sysr, G, T = balreal(sys::StateSpace)

Вычисляет сбалансированную реализацию системы sys, так что грэмианы наблюдаемости и достижимости сбалансированной системы равны и диагональны diagm(G). T является преобразованием подобия между старым состоянием x и новым состоянием z, так что z = Tx.

См. также описание gram и baltrunc.

Справка: Varga A., Balancing-free square-root algorithm for computing singular perturbation approximations.

sysr, G, T = baltrunc(sys::StateSpace; atol = √ϵ, rtol=1e-3, n = nothing, residual = false)

Уменьшает размерность состояния путем вычисления сбалансированной реализации системы sys, так что грэмианы наблюдаемости и достижимости сбалансированной системы равны и диагональны diagm(G) и усечения ее до порядка n. Если значение n не указано, оно выбирается таким образом, что удаляются все состояния, соответствующие сингулярным значениям меньше atol и меньше rtol σmax.

T является матрицей проекций между старым состоянием x и новым состоянием z, такой, что z = Tx. T в общем случае будет неквадратной матрицей.

Если residual = true, совпадающее статическое усиление достигается за счет «остаточности», т. е. задания

где индексы 1 и 2 соответствуют остаточному и усеченному состояниям.

См. также описание gram, balreal.

Glad, Ljung, Reglerteori: Flervariabla och Olinjära metoder.

Более сложный вариант упрощения модели см. в документе RobustAndOptimalControl.jl — упрощение модели.

Расширенная справка

Примечание. Вычисления грэмианов чувствительны к масштабированию входных-выходных сигналов. Чтобы результат численной балансировки, вычисления грэмиана или усечения MIMO-систем был значимым, необходимо разумно масштабировать входные и выходные сигналы системы. Распространенным (но не единственным) подходом является следующий.

  • Выходные сигналы масштабируются таким образом, чтобы максимально допустимая ошибка управления, максимально ожидаемое эталонное отклонение или максимально ожидаемое отклонение были равны единице.

  • Входные переменные масштабируются так, чтобы величина была равна единице. Для этого каждая переменная делится на ее максимальное ожидаемое или допустимое изменение, т. е. .

Без такого масштабирования результат балансировки будет зависеть от единиц измерения входного и выходного сигналов. Например, изменение единиц измерения для одного выходного сигнала с метра на миллиметр сделает его в 1000 раз более важным.

controllability(A, B; atol, rtol)
controllability(sys; atol, rtol)

Проверяет управляемость пары (A, B) или sys с помощью теста PHB.

Возвращаемое значение содержит поле iscontrollable, которое равно true, если условие ранга выполняется при всех собственных значениях A, и false в противном случае. Возвращаемая структура также содержит ранг и наименьшее сингулярное значение при каждом отдельном собственном значении A в полях ranks и sigma_min.

Технически эта функция проверяет управляемость из источника, называемую также достижимостью.

P = covar(sys, W)

Вычисляет стационарную ковариацию P = E[y(t)y(t)'] вывода y модели StateSpace sys, управляемой белым гауссовским шумом w с ковариацией E[w(t)w(τ)]=W*δ(t-τ) (δ — дельта Дирака).

Замечание. Если sys неустойчива, результирующая ковариация представляет собой матрицу Inf. Записи, соответствующие прямому прохождению (D__W__D' .!= 0), будут равны Inf для систем с непрерывным временем.

ctrb(A, B)
ctrb(sys)

Вычисляет матрицу управляемости для системы, описываемой (A, B) или sys.

Обратите внимание, что проверка управляемости путем вычисления ранга из ctrb не является наиболее численно точным способом, лучше проверить, является ли gram(sys, :c) положительно определенным, или вызвать функцию controllability.

gram(sys, opt; kwargs...)

Вычисляет грэмиан системы sys. Если opt имеет значение :c, вычисляет грэмиан управляемости. Если opt имеет значение :o, вычисляет грэмиан наблюдаемости.

См. также описание grampd. Сведения об именованных аргументах см. в описании grampd.

Расширенная справка

Примечание. Вычисления грэмианов чувствительны к масштабированию входных-выходных сигналов. Чтобы результат численной балансировки, вычисления грэмиана или усечения MIMO-систем был значимым, необходимо разумно масштабировать входные и выходные сигналы системы. Распространенным (но не единственным) подходом является следующий.

  • Выходные сигналы масштабируются таким образом, чтобы максимально допустимая ошибка управления, максимально ожидаемое эталонное отклонение или максимально ожидаемое отклонение были равны единице.

  • Входные переменные масштабируются так, чтобы величина была равна единице. Для этого каждая переменная делится на ее максимальное ожидаемое или допустимое изменение, т. е. .

Без такого масштабирования результат балансировки будет зависеть от единиц измерения входного и выходного сигналов. Например, изменение единиц измерения для одного выходного сигнала с метра на миллиметр сделает его в 1000 раз более важным.

U = grampd(sys, opt; kwargs...)

Возвращает коэффициент Холецкого U грэмиана системы sys. Если opt имеет значение :c, вычисляет грэмиан управляемости G = U*U'. Если opt имеет значение :o, вычисляет грэмиан наблюдаемости G = U’U.

Получает объект Cholesky по коэффициенту Cholesky(U) для грэмиана наблюдаемости.

Использует MatrixEquations.plyapc/plyapd. Сведения об именованных аргументах см. в docstring для ControlSystemsBase.MatrixEquations.plyapc/plyapd.

Ninf, ω_peak = hinfnorm(sys; tol=1e-6)

Вычисляет норму H∞ Ninf LTI-системы sys, а также частоту ω_peak, на которой достигается коэффициент усиления Ninf.

Ninf := sup_ω σ_max[sys(iω)] если G стабилен (σ_max — это наибольшее сингулярное значение) := Inf если G нестабилен

tol — это необязательный именованный аргумент, указывающий желаемую относительную точность для вычисляемой нормы H∞ (не является абсолютным сертификатом).

sys при необходимости сначала преобразуется в модель пространства состояний.

Вычисление нормы L∞ с непрерывным временем реализует «двухшаговый алгоритм». См. документ: N.A. Bruinsma and M. Steinbuch, 'A fast algorithm to compute the H∞-norm of a transfer function matrix', Systems and Control Letters (1990), pp. 287-293.

Сведения о версии с дискретным временем см. в документе: P. Bongers, O. Bosgra, M. Steinbuch, 'L∞-norm calculation for generalized state space systems in continuous and discrete time', American Control Conference, 1991.

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

sysi = innovation_form(sys, R1, R2[, R12])
sysi = innovation_form(sys; sysw=I, syse=I, R1=I, R2=I)

Принимает систему

x' = Ax + Bu + w ~ R1
y  = Cx + Du + e ~ R2

и возвращает систему

x' = Ax + Kv
y  = Cx + v

где v является инновационной последовательностью.

Если задано sysw (syse), в качестве ковариации используется ковариация, полученная в результате фильтрации шума с R1 (R2) по sysw (syse).

См. Stochastic Control, Chapter 4, Åström

sysi = innovation_form(sys, K)

Принимает систему

x' = Ax + Bu + Kv
y  = Cx + Du + v

и возвращает систему

x' = Ax + Kv
y  = Cx + v

где v является инновационной последовательностью.

См. Stochastic Control, Chapter 4, Åström

Ninf, ω_peak = linfnorm(sys; tol=1e-6)

Вычисляет норму L∞ Ninf LTI-системы sys, а также частоту ω_peak, на которой достигается усиление Ninf.

Ninf := sup_ω σ_max[sys(iω)] (σ_max обозначает наибольшее сингулярное значение).

tol — это необязательный именованный аргумент, указывающий желаемую относительную точность для вычисляемой нормы L∞ (не является абсолютным сертификатом).

sys при необходимости сначала преобразуется в модель пространства состояний.

Вычисление нормы L∞ с непрерывным временем реализует «двухшаговый алгоритм». См. документ: N.A. Bruinsma and M. Steinbuch, 'A fast algorithm to compute the H∞-norm of a transfer function matrix', Systems and Control Letters (1990), pp. 287-293.

Сведения о версии с дискретным временем см. в документе: P. Bongers, O. Bosgra, M. Steinbuch, 'L∞-norm calculation for generalized state space systems in continuous and discrete time', American Control Conference, 1991.

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

observability(A, C; atol, rtol)

Проверяет наблюдаемость пары (A, C) или sys с помощью теста PHB.

Возвращаемое значение содержит поле isobservable, которое равно true, если условие ранга выполняется при всех собственных значениях A, и false в противном случае. Возвращаемая структура также содержит ранг и наименьшее сингулярное значение при каждом отдельном собственном значении A в полях ranks и sigma_min.

cont = observer_controller(sys, L::AbstractMatrix, K::AbstractMatrix; direct=false)

Если direct = false

Возвращает observer_controller cont, заданный с помощью ss(A - B*L - K*C + K*D*L, K, L, 0) такой, что feedback(sys, cont) порождает замкнутую систему с собственными значениями, заданными A-KC и A-BL.

Этот регулятор не имеет прямой составляющей и соответствует обратной связи по состоянию, действующей для состояния, вычисляемого с помощью observer_predictor. Эта форма используется, если вычисленный управляющий сигнал применяется в следующий момент выборки, или с другим большим запаздыванием по отношению к измерению, поступающему в регулятор.

Источник: «Computer-Controlled Systems» Eq 4.37

Если direct = true

Возвращает регулятор наблюдателя cont, заданный с помощью ss((I-KC)(A-BL), (I-KC)(A-BL)K, L, LK) такой, что feedback(sys, cont) порождает замкнутую систему с собственными значениями, заданными A-BL и A-BL-KC. Этот регулятор имеет прямую составляющую и соответствует обратной связи по состоянию, действующей для состояния, вычисляемого с помощью observer_filter. Эта форма используется, если вычисленный управляющий сигнал применяется сразу после получения измерения. Этот вариант, как правило, имеет лучшие показатели производительности, чем вариант без прямой составляющей.

Для использования этой формулировки коэффициент усиления наблюдателя K должен был быть рассчитан на пару (A, CA), а не (A, C). Для этого передайте direct = true при вызове place или kalman.

Источник: Источник: «Computer-Controlled Systems», стр. 140, и «Computer-Controlled Systems», стр. 162 prob 4.7

Аргументы

  • sys: модель системы.

  • L: коэффициент усиления обратной связи по состоянию u = -Lx.

  • K: коэффициент усиления наблюдателя.

См. также описание observer_predictor и innovation_form.

observer_filter(sys, K; output_state = false)

Возвращает фильтр наблюдателя

с входным уравнением [(I - KC)B K] * [u(k-1); y(k)].

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

Это аналогично observer_predictor, но, в отличие от предиктора, выходные данные фильтра зависят от текущего измерения, тогда как выходные данные предиктора зависят только от прошлых измерений.

Фильтр наблюдателя эквивалентен фильтру observer_predictor для систем с непрерывным временем.

Для использования этой формулировки коэффициент усиления наблюдателя K должен был быть рассчитан на пару (A, CA), а не (A, C). Для этого передайте direct = true при вызове place или kalman.

Источник: «Computer-Controlled Systems», Eq 4.32

observer_predictor(sys::AbstractStateSpace, K; h::Int = 1, output_state = false)
observer_predictor(sys::AbstractStateSpace, R1, R2[, R12]; output_state = false)

Если sys непрерывно, возвращается система предикторов наблюдателя

с входным уравнением [B-KD K] * [u; y].

Если sys дискретный, может быть задан горизонт прогнозирования h. В этом случае для прогнозирования y(t) используются измерения до времени t-h включительно и входные данные до времени t включительно.

Если заданы ковариационные матрицы R1, R2, коэффициент усиления Калмана K вычисляется с помощью kalman.

Если output_state имеет значение true, выходными данными будет оценка состояния , а не оценка выхода .

obsv(A, C, n=size(A,1))
obsv(sys, n=sys.nx)

Вычисляет матрицу наблюдаемости со строками n для системы, описываемой (A, C) или sys. При указании необязательного параметра n > sys.nx возвращается расширенная матрица наблюдаемости.

Обратите внимание, что проверка наблюдаемости путем вычисления ранга из obsv не является наиболее численно точным способом, лучше проверить, является ли gram(sys, :o) положительно определенным, или вызвать функцию observability.

Xc = plyap(sys::AbstractStateSpace, Ql; kwargs...)

Решатель Ляпунова, который принимает коэффициент Холецкого L для Q и возвращает треугольную матрицу Xc такую, что Xc*Xc' = X.

syst = similarity_transform(sys, T; unitary=false)

Выполняет преобразование подобия T : Tx̃ = x для sys следующим образом

à = T⁻¹AT
B̃ = T⁻¹ B
C̃ = CT
D̃ = D

Если unitary=true, предполагается, что T является унитарной, а вместо обратного значения используется сопряжение матрицы. См. также описание balance_statespace.

time_scale(sys::AbstractStateSpace{Continuous}, a; balanced = false)
time_scale(G::TransferFunction{Continuous},     a; balanced = true)

Изменяет масштаб оси времени (изменяет единицу измерения времени) sys.

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

Масштабирование времени для функции с преобразованием Лапласа можно представить следующим образом.

Именованный аргумент balanced указывает, применять или нет сбалансированное масштабирование к матрицам B и C. Для систем с пространством состояний используется значение по умолчанию false, поскольку при этом изменяется представление состояний, масштабироваться будет только B. Для передаточных функций значением по умолчанию является true.

Пример:

В следующем примере показано, как система с постоянной времени порядка одной микросекунды масштабируется таким образом, что постоянная времени становится равной 1, т. е. единица измерения времени меняется с секунд на микросекунды.

Gs  = tf(1, [1e-6, 1])     # шкала времени в микросекундах, моделируемая в секундах
Gms = time_scale(Gs, 1e-6) # Изменение на шкалу времени в микросекундах
Gms == tf(1, [1, 1])       # В Gms в качестве единицы времени теперь используются микросекунды

Следующий пример иллюстрирует, как изменяется ось времени при моделировании во временной области в зависимости от масштаба времени.

t = 0:0.1:50 # исходная временная ось
a = 10       # Коэффициент масштабирования
sys1 = ssrand(1,1,5)
res1 = step(sys1, t)      # Выполнение исходного моделирования
sys2 = time_scale(sys, a) # Масштабирование времени
res2 = step(sys2, t ./ a) # Моделирование на масштабированной оси времени, обратите внимание на `1/a`
isapprox(res1.y, res2.y, rtol=1e-3, atol=1e-3)
lyap(A, Q; kwargs...)

Вычисляет решение X дискретного уравнения Ляпунова AXA' - X + Q = 0.

Использует MatrixEquations.lyapc / MatrixEquations.lyapd. Сведения об именованных аргументах см. в docstring для ControlSystemsBase.MatrixEquations.lyapc / ControlSystemsBase.MatrixEquations.lyapd.

norm(sys, p=2; tol=1e-6)

norm(sys) или norm(sys,2) вычисляет норму H2 LTI-системы sys.

norm(sys, Inf) вычисляет норму H∞ LTI-системы sys. Норма H∞ совпадает с нормой L∞ для устойчивых систем, а Inf — для неустойчивых. Если требуется также частота пикового усиления, следует использовать функцию hinfnorm. Дополнительные сведения см. в описании hinfnorm.

tol — это необязательный именованный аргумент, используемый только для вычисления норм L∞. Он представляет желаемую относительную точность для вычисляемой нормы L∞ (не является абсолютным сертификатом).

sys при необходимости сначала преобразуется в модель StateSpace.

A, B, C, T = balance_statespace{S}(A::Matrix{S}, B::Matrix{S}, C::Matrix{S}, perm::Bool=false)
sys, T = balance_statespace(sys::StateSpace, perm::Bool=false)

Вычисляет балансирующее преобразование T, которое пытается масштабировать систему так, чтобы нормы строк и столбцов [T__A/T T__B; C/T 0] были примерно равны. Если perm=true, разрешено переупорядочивать состояния в A.

Обратное значение sysb, T = balance_statespace(sys) задается значением similarity_transform(sysb, T).

Это не то же самое, что и поиск сбалансированной реализации с равными и диагональными грэмианами наблюдаемости и достижимости. См. описание balreal.

Видео

Основное использование анализа надежности с помощью JuliaControl