Functions: Plant Models
The SimModel
types represents discrete state-space models that can be used to construct StateEstimator
s and PredictiveController
s, or as plant simulators by calling evaloutput
and updatestate!
methods on SimModel
instances (to test estimator/controller designs). For time simulations, the states x
are stored inside SimModel
instances. Use setstate!
method to manually modify them.
SimModel
#
ModelPredictiveControl.SimModel
— Type
Abstract supertype of LinModel
and NonLinModel
types.
(model::SimModel)(d=[]) -> y
Functor allowing callable SimModel
object as an alias for evaloutput
.
Examples
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[])
Construct a linear model from state-space model sys
with sampling time Ts
in second.
Ts
can be omitted when sys
is discrete-time. Its state-space matrices are:
with the state and output vectors. The vector comprises the manipulated inputs and measured disturbances , in any order. i_u
provides the indices of that are manipulated, and i_d
, the measured disturbances. See Extended Help if sys
is continuous-time, or discrete-time with Ts ≠ sys.Ts
.
Examples
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
Extended Help
State-space matrices are similar if sys
is continuous (replace with and with on the LHS). In such a case, it’s discretized with c2d
and :zoh
for manipulated inputs, and :tustin
, for measured disturbances. Lastly, if sys
is discrete and the provided argument Ts ≠ sys.Ts
, the system is resampled by using the aforementioned discretization methods.
Note that the constructor transforms the system to its minimal realization using minreal
for controllability/observability. As a consequence, the final state-space representation may be different from the one provided in sys
. It is also converted into a more practical form ( because of the zero-order hold):
Use the syntax LinModel{NT}(A, Bu, C, Bd, Dd, Ts)
to force a specific state-space representation.
LinModel(sys::TransferFunction[, Ts]; i_u=1:size(sys,2), i_d=Int[])
Convert to minimal realization state-space when sys
is a transfer function.
sys
is equal to for continuous-time, and , for discrete-time.
Examples
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[])
Discretize with zero-order hold when sys
is a continuous system with delays.
The delays must be multiples of the sample time Ts
.
LinModel{NT}(A, Bu, C, Bd, Dd, Ts)
Construct the model from the discrete state-space matrices A, Bu, C, Bd, Dd
directly.
This syntax do not modify the state-space representation provided in argument (minreal
is not called). Care must be taken to ensure that the model is controllable and observable. The optional parameter NT
explicitly specifies the number type of the matrices.
LinModel(model::NonLinModel; x=model.x, u=model.uop, d=model.dop)
Call linearize(model; x, u, d)
and return the resulting linear model.
NonLinModel
#
ModelPredictiveControl.NonLinModel
— Type
NonLinModel{NT}(f::Function, h::Function, Ts, nu, nx, ny, nd=0)
Construct a nonlinear model from discrete-time state-space functions f
and h
.
The state update and output functions are defined as :
Ts
is the sampling time in second. nu
, nx
, ny
and nd
are the respective number of manipulated inputs, states, outputs and measured disturbances. The optional parameter NT
explicitly specifies the number type of vectors (default to Float64
).
Replace the |
Nonlinear continuous-time state-space functions are not supported for now. In such a case, manually call a differential equation solver in f
(see Manual).
|
See also LinModel
.
Examples
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
Set Operating Points
#
ModelPredictiveControl.setop!
— Function
setop!(model::SimModel; uop=nothing, yop=nothing, dop=nothing) -> model
Set model
inputs uop
, outputs yop
and measured disturbances dop
operating points.
The state-space model with operating points (a.k.a. nominal values) is:
in which the uop
, yop
and dop
vectors evaluate:
The structure is similar if model
is a NonLinModel
:
Examples
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
Linearize
#
ModelPredictiveControl.linearize
— Function
linearize(model::NonLinModel; x=model.x, u=model.uop, d=model.dop) -> linmodel
Linearize model
at the operating points x
, u
, d
and return the LinModel
.
The arguments x
, u
and d
are the linearization points for the state , manipulated input and measured disturbance , respectively. The Jacobians of and functions are automatically computed with ForwardDiff.jl
.
See Extended Help if you get an error like: |
Examples
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
Extended Help
Automatic differentiation (AD) allows exact Jacobians. The NonLinModel
f
and h
functions must be compatible with this feature though. See Automatic differentiation for common mistakes when writing these functions.