11const DEFAULT_LINMPC_OPTIMIZER = OSQP. MathOptInterfaceOSQP. Optimizer
2+ const DEFAULT_LINMPC_TRANSCRIPTION = :singleshooting
23
34struct LinMPC{
45 NT<: Real ,
@@ -8,6 +9,7 @@ struct LinMPC{
89 estim:: SE
910 # note: `NT` and the number type `JNT` in `JuMP.GenericModel{JNT}` can be
1011 # different since solvers that support non-Float64 are scarce.
12+ transcription:: Symbol
1113 optim:: JM
1214 con:: ControllerConstraint{NT, Nothing}
1315 ΔŨ:: Vector{NT}
@@ -41,16 +43,19 @@ struct LinMPC{
4143 Dop:: Vector{NT}
4244 buffer:: PredictiveControllerBuffer{NT}
4345 function LinMPC {NT} (
44- estim:: SE , Hp, Hc, M_Hp, N_Hc, L_Hp, Cwt, optim:: JM
46+ estim:: SE , Hp, Hc, M_Hp, N_Hc, L_Hp, Cwt,
47+ transcription, optim:: JM
4548 ) where {NT<: Real , SE<: StateEstimator , JM<: JuMP.GenericModel }
4649 model = estim. model
4750 nu, ny, nd, nx̂ = model. nu, model. ny, model. nd, estim. nx̂
4851 ŷ = copy (model. yop) # dummy vals (updated just before optimization)
4952 weights = ControllerWeights {NT} (model, Hp, Hc, M_Hp, N_Hc, L_Hp, Cwt)
5053 # dummy vals (updated just before optimization):
5154 R̂y, R̂u, T_lastu = zeros (NT, ny* Hp), zeros (NT, nu* Hp), zeros (NT, nu* Hp)
52- S, T = init_ΔUtoU (model, Hp, Hc)
53- E, G, J, K, V, B, ex̂, gx̂, jx̂, kx̂, vx̂, bx̂ = init_predmat (estim, model, Hp, Hc)
55+ S, T = init_ZtoU (estim, Hp, Hc, transcription)
56+ E, G, J, K, V, B, ex̂, gx̂, jx̂, kx̂, vx̂, bx̂ = init_predmat (
57+ estim, model, Hp, Hc, transcription
58+ )
5459 # dummy vals (updated just before optimization):
5560 F, fx̂ = zeros (NT, ny* Hp), zeros (NT, nx̂)
5661 con, nϵ, S̃, Ẽ = init_defaultcon_mpc (
@@ -67,7 +72,7 @@ struct LinMPC{
6772 ΔŨ = zeros (NT, nΔŨ)
6873 buffer = PredictiveControllerBuffer {NT} (nu, ny, nd, Hp, Hc, nϵ)
6974 mpc = new {NT, SE, JM} (
70- estim, optim, con,
75+ estim, transcription, optim, con,
7176 ΔŨ, ŷ,
7277 Hp, Hc, nϵ,
7378 weights,
@@ -130,6 +135,8 @@ arguments. This controller allocates memory at each time step for the optimizati
130135- `N_Hc=diagm(repeat(Nwt,Hc))` : positive semidefinite symmetric matrix ``\m athbf{N}_{H_c}``.
131136- `L_Hp=diagm(repeat(Lwt,Hp))` : positive semidefinite symmetric matrix ``\m athbf{L}_{H_p}``.
132137- `Cwt=1e5` : slack variable weight ``C`` (scalar), use `Cwt=Inf` for hard constraints only.
138+ - `transcription=:singleshooting` : transcription method for the nonlinear optimization
139+ problem, can be `:singleshooting` or `:multipleshoting`.
133140- `optim=JuMP.Model(OSQP.MathOptInterfaceOSQP.Optimizer)` : quadratic optimizer used in
134141 the predictive controller, provided as a [`JuMP.Model`](https://jump.dev/JuMP.jl/stable/api/JuMP/#JuMP.Model)
135142 (default to [`OSQP`](https://osqp.org/docs/parsers/jump.html) optimizer).
@@ -187,11 +194,12 @@ function LinMPC(
187194 N_Hc = diagm (repeat (Nwt, Hc)),
188195 L_Hp = diagm (repeat (Lwt, Hp)),
189196 Cwt = DEFAULT_CWT,
197+ transcription = DEFAULT_LINMPC_TRANSCRIPTION,
190198 optim:: JuMP.GenericModel = JuMP. Model (DEFAULT_LINMPC_OPTIMIZER, add_bridges= false ),
191199 kwargs...
192200)
193201 estim = SteadyKalmanFilter (model; kwargs... )
194- return LinMPC (estim; Hp, Hc, Mwt, Nwt, Lwt, Cwt, M_Hp, N_Hc, L_Hp, optim)
202+ return LinMPC (estim; Hp, Hc, Mwt, Nwt, Lwt, Cwt, M_Hp, N_Hc, L_Hp, transcription, optim)
195203end
196204
197205
@@ -229,6 +237,7 @@ function LinMPC(
229237 N_Hc = diagm (repeat (Nwt, Hc)),
230238 L_Hp = diagm (repeat (Lwt, Hp)),
231239 Cwt = DEFAULT_CWT,
240+ transcription = DEFAULT_LINMPC_TRANSCRIPTION,
232241 optim:: JM = JuMP. Model (DEFAULT_LINMPC_OPTIMIZER, add_bridges= false ),
233242) where {NT<: Real , SE<: StateEstimator{NT} , JM<: JuMP.GenericModel }
234243 isa (estim. model, LinModel) || error (" estim.model type must be a LinModel" )
@@ -237,7 +246,7 @@ function LinMPC(
237246 @warn (" prediction horizon Hp ($Hp ) ≤ estimated number of delays in model " *
238247 " ($nk ), the closed-loop system may be unstable or zero-gain (unresponsive)" )
239248 end
240- return LinMPC {NT} (estim, Hp, Hc, M_Hp, N_Hc, L_Hp, Cwt, optim)
249+ return LinMPC {NT} (estim, Hp, Hc, M_Hp, N_Hc, L_Hp, Cwt, transcription, optim)
241250end
242251
243252"""
0 commit comments