Функции: модели объектов
Типы SimModel
представляют дискретные модели в пространстве состояний, которые можно использовать для создания объектов StateEstimator
и PredictiveController
либо как симуляторы объектов путем вызова методов evaloutput
и updatestate!
для экземпляров SimModel
(с целью проверки структуры средств оценки и контроллеров). Для моделирования во времени состояния x
хранятся в экземплярах SimModel
. Для их изменения вручную используйте метод setstate!
.
SimModel
#
ModelPredictiveControl.SimModel
— Type
Абстрактный супертип типов LinModel
и NonLinModel
.
(model::SimModel)(d=[]) -> y
Функтор, позволяющий использовать вызываемый объект SimModel
как псевдоним для evaloutput
.
Примеры
julia> model = NonLinModel((x,u,_)->-x + u, (x,_)->x .+ 20, 10.0, 1, 1, 1);
julia> y = model()
1-element Vector{Float64}:
20.0
LinModel
#
ModelPredictiveControl.LinModel
— Type
LinModel(sys::StateSpace[, Ts]; i_u=1:size(sys,2), i_d=Int[])
Создает линейную модель на основе модели в пространстве состояний sys
со временем выборки Ts
в секундах.
Если модель sys
дискретная, Ts
можно опустить. Матрицы пространства состояний имеют следующий вид:
с векторами состояний и выходов . Вектор состоит из обрабатываемых входов и измеряемых возмущений в любом порядке. i_u
предоставляет индексы , с которыми производятся операции, и i_d
, измеряемые возмущения. Если модель sys
является непрерывной или дискретной с Ts ≠ sys.Ts
, см. расширенную справку.
Примеры
julia> model = LinModel(ss(0.4, 0.2, 0.3, 0, 0.1))
Discrete-time linear model with a sample time Ts = 0.1 s and:
1 manipulated inputs u
1 states x
1 outputs y
0 measured disturbances d
Расширенная справка
Матрицы пространства состояний схожи, если модель sys
непрерывная (замените на , а на в LHS). В этом случае модель дискретизируется с помощью c2d
и :zoh
для обрабатываемых входов и :tustin
для измеряемых возмущений. Наконец, если модель sys
дискретная и предоставлен аргумент Ts ≠ sys.Ts
, система дискретизируется повторно с помощью упомянутых ранее методов дискретизации.
Обратите внимание, что конструктор преобразует систему в минимальную реализацию с помощью minreal
для обеспечения управляемости и наблюдаемости. Как следствие, итоговое представление пространства состояний может отличаться от предоставленного в sys
. Оно также преобразуется в более практичную форму ( из-за фиксатора нулевого порядка):
Используйте синтаксис LinModel{NT}(A, Bu, C, Bd, Dd, Ts)
, чтобы применить определенное представление пространства состояний.
LinModel(sys::TransferFunction[, Ts]; i_u=1:size(sys,2), i_d=Int[])
Выполняет преобразование в пространство состояний с минимальной реализацией, если sys
— это передаточная функция.
sys
равно для непрерывной системы и для дискретной.
Примеры
julia> model = LinModel([tf(3, [30, 1]) tf(-2, [5, 1])], 0.5, i_d=[2])
Discrete-time linear model with a sample time Ts = 0.5 s and:
1 manipulated inputs u
2 states x
1 outputs y
1 measured disturbances d
LinModel(sys::DelayLtiSystem, Ts; i_u=1:size(sys,2), i_d=Int[])
Выполняет дискретизацию с фиксатором нулевого порядка, если sys
— это непрерывная система с задержками.
Задержки должны быть кратными времени дискретизации Ts
.
LinModel{NT}(A, Bu, C, Bd, Dd, Ts)
Создает модель на основе матриц дискретного пространства состояний A, Bu, C, Bd, Dd
напрямую.
Этот синтаксис не изменяет представление пространства состояний, переданное в аргументе (minreal
не вызывается). Необходимо убедиться в том, что модель является управляемой и наблюдаемой. Необязательный параметр NT
явным образом задает числовой тип матриц.
LinModel(model::NonLinModel; x=model.x, u=model.uop, d=model.dop)
Вызывает linearize(model; x, u, d)
и возвращает получившуюся линейную модель.
NonLinModel
#
ModelPredictiveControl.NonLinModel
— Type
NonLinModel{NT}(f::Function, h::Function, Ts, nu, nx, ny, nd=0)
Создает нелинейную модель на основе дискретных функций пространства состояний f
и h
.
Функции обновления состояний и вывода определены следующим образом:
Ts
— это время дискретизации в секундах. nu
, nx
, ny
и nd
— это количества соответственно обрабатываемых входов, состояний, выходов и измеряемых возмущений. Необязательный параметр NT
явным образом задает числовой тип векторов (по умолчанию Float64
).
Если |
Нелинейные непрерывные функции пространства состояний в настоящее время не поддерживаются. В таком случае вручную вызовите решатель дифференциальных уравнений в f
(см. руководство).
|
См. также описание LinModel
.
Примеры
julia> model = NonLinModel((x,u,_)->0.1x+u, (x,_)->2x, 10.0, 1, 1, 1)
Discrete-time nonlinear model with a sample time Ts = 10.0 s and:
1 manipulated inputs u
1 states x
1 outputs y
0 measured disturbances d
Задание рабочих точек
#
ModelPredictiveControl.setop!
— Function
setop!(model::SimModel; uop=nothing, yop=nothing, dop=nothing) -> model
Задает рабочие точки входов model
, выходов uop
и измеряемых возмущений yop
для модели dop
.
Модель пространства состояний с рабочими точками (номинальными значениями) имеет следующий вид:
где векторы uop
, yop
и dop
вычисляются так:
Если объект model
относится к типу NonLinModel
, структура аналогичная:
Примеры
julia> model = setop!(LinModel(tf(3, [10, 1]), 2.0), uop=[50], yop=[20])
Discrete-time linear model with a sample time Ts = 2.0 s and:
1 manipulated inputs u
1 states x
1 outputs y
0 measured disturbances d
Линеаризация
#
ModelPredictiveControl.linearize
— Function
linearize(model::NonLinModel; x=model.x, u=model.uop, d=model.dop) -> linmodel
Линеаризует модель model
в рабочих точках x
, u
, d
и возвращает LinModel
.
Аргументы x
, u
и d
— это точки линеаризации для состояния , обрабатываемого входа и измеряемого возмущения соответственно. Якобианы функций и вычисляются автоматически с помощью ForwardDiff.jl
.
Если возникает ошибка наподобие следующей, см. расширенную справку: |
Примеры
julia> model = NonLinModel((x,u,_)->x.^3 + u, (x,_)->x, 0.1, 1, 1, 1);
julia> linmodel = linearize(model, x=[10.0], u=[0.0]);
julia> linmodel.A
1×1 Matrix{Float64}:
300.0
Расширенная справка
Автоматическое дифференцирование (AD) позволяет получать точные якобианы. Однако функции модели NonLinModel
f
и h
должны быть совместимы с этой возможностью. В разделе Автоматическое дифференцирование описываются распространенные ошибки, которые допускают при написании этих функций.