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

Функции: модели объектов

Типы SimModel представляют дискретные модели в пространстве состояний, которые можно использовать для создания объектов StateEstimator и PredictiveController либо как симуляторы объектов путем вызова методов evaloutput и updatestate! для экземпляров SimModel (с целью проверки структуры средств оценки и контроллеров). Для моделирования во времени состояния x хранятся в экземплярах SimModel. Для их изменения вручную используйте метод setstate!.

SimModel

# ModelPredictiveControl.SimModelType

Абстрактный супертип типов 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.LinModelType

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, см. расширенную справку.

См. также разделы ss и tf.

Примеры

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

NonLinModel{NT}(f::Function, h::Function, Ts, nu, nx, ny, nd=0)

Создает нелинейную модель на основе дискретных функций пространства состояний f и h.

Функции обновления состояний и вывода определены следующим образом:

Ts — это время дискретизации в секундах. nu, nx, ny и nd — это количества соответственно обрабатываемых входов, состояний, выходов и измеряемых возмущений. Необязательный параметр NT явным образом задает числовой тип векторов (по умолчанию Float64).

Если nd = 0, замените аргумент d на _ (см. примеры ниже).

Нелинейные непрерывные функции пространства состояний в настоящее время не поддерживаются. В таком случае вручную вызовите решатель дифференциальных уравнений в f (см. руководство).

f и h должны быть функциями на чистом языке Julia для использования модели в NonLinMPC, ExtendedKalmanFilter, MovingHorizonEstimator и linearize.

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

linearize(model::NonLinModel; x=model.x, u=model.uop, d=model.dop) -> linmodel

Линеаризует модель model в рабочих точках x, u, d и возвращает LinModel.

Аргументы x, u и d — это точки линеаризации для состояния , обрабатываемого входа и измеряемого возмущения соответственно. Якобианы функций и вычисляются автоматически с помощью ForwardDiff.jl.

Если возникает ошибка наподобие следующей, см. расширенную справку: MethodError: no method matching (::var"##")(::Vector{ForwardDiff.Dual}).

Примеры

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