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