@@ -4,6 +4,7 @@ const DEFAULT_LINMPC_TRANSCRIPTION = SingleShooting()
44struct LinMPC{
55 NT<: Real ,
66 SE<: StateEstimator ,
7+ CW<: ControllerWeights ,
78 TM<: TranscriptionMethod ,
89 JM<: JuMP.GenericModel
910} <: PredictiveController{NT}
@@ -18,7 +19,7 @@ struct LinMPC{
1819 Hp:: Int
1920 Hc:: Int
2021 nϵ:: Int
21- weights:: ControllerWeights{NT}
22+ weights:: CW
2223 R̂u:: Vector{NT}
2324 R̂y:: Vector{NT}
2425 P̃Δu:: Matrix{NT}
@@ -45,13 +46,18 @@ struct LinMPC{
4546 Dop:: Vector{NT}
4647 buffer:: PredictiveControllerBuffer{NT}
4748 function LinMPC {NT} (
48- estim:: SE , Hp, Hc, M_Hp, N_Hc, L_Hp, Cwt ,
49+ estim:: SE , Hp, Hc, weights :: CW ,
4950 transcription:: TM , optim:: JM
50- ) where {NT<: Real , SE<: StateEstimator , TM<: TranscriptionMethod , JM<: JuMP.GenericModel }
51+ ) where {
52+ NT<: Real ,
53+ SE<: StateEstimator ,
54+ CW<: ControllerWeights ,
55+ TM<: TranscriptionMethod ,
56+ JM<: JuMP.GenericModel
57+ }
5158 model = estim. model
5259 nu, ny, nd, nx̂ = model. nu, model. ny, model. nd, estim. nx̂
5360 ŷ = copy (model. yop) # dummy vals (updated just before optimization)
54- weights = ControllerWeights {NT} (model, Hp, Hc, M_Hp, N_Hc, L_Hp, Cwt)
5561 # dummy vals (updated just before optimization):
5662 R̂y, R̂u, Tu_lastu0 = zeros (NT, ny* Hp), zeros (NT, nu* Hp), zeros (NT, nu* Hp)
5763 PΔu = init_ZtoΔU (estim, transcription, Hp, Hc)
@@ -63,8 +69,9 @@ struct LinMPC{
6369 # dummy vals (updated just before optimization):
6470 F, fx̂, Fŝ = zeros (NT, ny* Hp), zeros (NT, nx̂), zeros (NT, nx̂* Hp)
6571 con, nϵ, P̃Δu, P̃u, Ẽ, Ẽŝ = init_defaultcon_mpc (
66- estim, transcription,
67- Hp, Hc, Cwt, PΔu, Pu, E,
72+ estim, weights, transcription,
73+ Hp, Hc,
74+ PΔu, Pu, E,
6875 ex̂, fx̂, gx̂, jx̂, kx̂, vx̂, bx̂,
6976 Eŝ, Fŝ, Gŝ, Jŝ, Kŝ, Vŝ, Bŝ
7077 )
@@ -78,7 +85,7 @@ struct LinMPC{
7885 nZ̃ = get_nZ (estim, transcription, Hp, Hc) + nϵ
7986 Z̃ = zeros (NT, nZ̃)
8087 buffer = PredictiveControllerBuffer (estim, transcription, Hp, Hc, nϵ)
81- mpc = new {NT, SE, TM, JM} (
88+ mpc = new {NT, SE, CW, TM, JM} (
8289 estim, transcription, optim, con,
8390 Z̃, ŷ,
8491 Hp, Hc, nϵ,
@@ -140,9 +147,9 @@ arguments. This controller allocates memory at each time step for the optimizati
140147- `Mwt=fill(1.0,model.ny)` : main diagonal of ``\m athbf{M}`` weight matrix (vector).
141148- `Nwt=fill(0.1,model.nu)` : main diagonal of ``\m athbf{N}`` weight matrix (vector).
142149- `Lwt=fill(0.0,model.nu)` : main diagonal of ``\m athbf{L}`` weight matrix (vector).
143- - `M_Hp=diagm (repeat(Mwt,Hp))` : positive semidefinite symmetric matrix ``\m athbf{M}_{H_p}``.
144- - `N_Hc=diagm (repeat(Nwt,Hc))` : positive semidefinite symmetric matrix ``\m athbf{N}_{H_c}``.
145- - `L_Hp=diagm (repeat(Lwt,Hp))` : positive semidefinite symmetric matrix ``\m athbf{L}_{H_p}``.
150+ - `M_Hp=Diagonal (repeat(Mwt,Hp))` : positive semidefinite symmetric matrix ``\m athbf{M}_{H_p}``.
151+ - `N_Hc=Diagonal (repeat(Nwt,Hc))` : positive semidefinite symmetric matrix ``\m athbf{N}_{H_c}``.
152+ - `L_Hp=Diagonal (repeat(Lwt,Hp))` : positive semidefinite symmetric matrix ``\m athbf{L}_{H_p}``.
146153- `Cwt=1e5` : slack variable weight ``C`` (scalar), use `Cwt=Inf` for hard constraints only.
147154- `transcription=SingleShooting()` : a [`TranscriptionMethod`](@ref) for the optimization.
148155- `optim=JuMP.Model(OSQP.MathOptInterfaceOSQP.Optimizer)` : quadratic optimizer used in
@@ -199,9 +206,9 @@ function LinMPC(
199206 Mwt = fill (DEFAULT_MWT, model. ny),
200207 Nwt = fill (DEFAULT_NWT, model. nu),
201208 Lwt = fill (DEFAULT_LWT, model. nu),
202- M_Hp = diagm (repeat (Mwt, Hp)),
203- N_Hc = diagm (repeat (Nwt, Hc)),
204- L_Hp = diagm (repeat (Lwt, Hp)),
209+ M_Hp = Diagonal (repeat (Mwt, Hp)),
210+ N_Hc = Diagonal (repeat (Nwt, Hc)),
211+ L_Hp = Diagonal (repeat (Lwt, Hp)),
205212 Cwt = DEFAULT_CWT,
206213 transcription:: TranscriptionMethod = DEFAULT_LINMPC_TRANSCRIPTION,
207214 optim:: JuMP.GenericModel = JuMP. Model (DEFAULT_LINMPC_OPTIMIZER, add_bridges= false ),
@@ -242,9 +249,9 @@ function LinMPC(
242249 Mwt = fill (DEFAULT_MWT, estim. model. ny),
243250 Nwt = fill (DEFAULT_NWT, estim. model. nu),
244251 Lwt = fill (DEFAULT_LWT, estim. model. nu),
245- M_Hp = diagm (repeat (Mwt, Hp)),
246- N_Hc = diagm (repeat (Nwt, Hc)),
247- L_Hp = diagm (repeat (Lwt, Hp)),
252+ M_Hp = Diagonal (repeat (Mwt, Hp)),
253+ N_Hc = Diagonal (repeat (Nwt, Hc)),
254+ L_Hp = Diagonal (repeat (Lwt, Hp)),
248255 Cwt = DEFAULT_CWT,
249256 transcription:: TranscriptionMethod = DEFAULT_LINMPC_TRANSCRIPTION,
250257 optim:: JM = JuMP. Model (DEFAULT_LINMPC_OPTIMIZER, add_bridges= false ),
@@ -255,7 +262,8 @@ function LinMPC(
255262 @warn (" prediction horizon Hp ($Hp ) ≤ estimated number of delays in model " *
256263 " ($nk ), the closed-loop system may be unstable or zero-gain (unresponsive)" )
257264 end
258- return LinMPC {NT} (estim, Hp, Hc, M_Hp, N_Hc, L_Hp, Cwt, transcription, optim)
265+ weights = ControllerWeights {NT} (estim. model, Hp, Hc, M_Hp, N_Hc, L_Hp, Cwt)
266+ return LinMPC {NT} (estim, Hp, Hc, weights, transcription, optim)
259267end
260268
261269"""
0 commit comments