@@ -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}
@@ -19,7 +20,7 @@ struct LinMPC{
1920 Hc:: Int
2021 nϵ:: Int
2122 nb:: Vector{Int}
22- weights:: ControllerWeights{NT}
23+ weights:: CW
2324 R̂u:: Vector{NT}
2425 R̂y:: Vector{NT}
2526 P̃Δu:: Matrix{NT}
@@ -46,13 +47,18 @@ struct LinMPC{
4647 Dop:: Vector{NT}
4748 buffer:: PredictiveControllerBuffer{NT}
4849 function LinMPC {NT} (
49- estim:: SE , Hp, Hc, M_Hp, N_Hc, L_Hp, Cwt ,
50+ estim:: SE , Hp, Hc, weights :: CW ,
5051 transcription:: TM , optim:: JM
51- ) where {NT<: Real , SE<: StateEstimator , TM<: TranscriptionMethod , JM<: JuMP.GenericModel }
52+ ) where {
53+ NT<: Real ,
54+ SE<: StateEstimator ,
55+ CW<: ControllerWeights ,
56+ TM<: TranscriptionMethod ,
57+ JM<: JuMP.GenericModel
58+ }
5259 model = estim. model
5360 nu, ny, nd, nx̂ = model. nu, model. ny, model. nd, estim. nx̂
5461 ŷ = copy (model. yop) # dummy vals (updated just before optimization)
55- weights = ControllerWeights {NT} (model, Hp, Hc, M_Hp, N_Hc, L_Hp, Cwt)
5662 # dummy vals (updated just before optimization):
5763 R̂y, R̂u, Tu_lastu0 = zeros (NT, ny* Hp), zeros (NT, nu* Hp), zeros (NT, nu* Hp)
5864 nb = ones (Hc)
@@ -65,8 +71,9 @@ struct LinMPC{
6571 # dummy vals (updated just before optimization):
6672 F, fx̂, Fŝ = zeros (NT, ny* Hp), zeros (NT, nx̂), zeros (NT, nx̂* Hp)
6773 con, nϵ, P̃Δu, P̃u, Ẽ, Ẽŝ = init_defaultcon_mpc (
68- estim, transcription,
69- Hp, Hc, Cwt, PΔu, Pu, E,
74+ estim, weights, transcription,
75+ Hp, Hc,
76+ PΔu, Pu, E,
7077 ex̂, fx̂, gx̂, jx̂, kx̂, vx̂, bx̂,
7178 Eŝ, Fŝ, Gŝ, Jŝ, Kŝ, Vŝ, Bŝ
7279 )
@@ -80,7 +87,7 @@ struct LinMPC{
8087 nZ̃ = get_nZ (estim, transcription, Hp, Hc) + nϵ
8188 Z̃ = zeros (NT, nZ̃)
8289 buffer = PredictiveControllerBuffer (estim, transcription, Hp, Hc, nϵ)
83- mpc = new {NT, SE, TM, JM} (
90+ mpc = new {NT, SE, CW, TM, JM} (
8491 estim, transcription, optim, con,
8592 Z̃, ŷ,
8693 Hp, Hc, nϵ, nb,
@@ -142,9 +149,9 @@ arguments. This controller allocates memory at each time step for the optimizati
142149- `Mwt=fill(1.0,model.ny)` : main diagonal of ``\m athbf{M}`` weight matrix (vector).
143150- `Nwt=fill(0.1,model.nu)` : main diagonal of ``\m athbf{N}`` weight matrix (vector).
144151- `Lwt=fill(0.0,model.nu)` : main diagonal of ``\m athbf{L}`` weight matrix (vector).
145- - `M_Hp=diagm (repeat(Mwt,Hp))` : positive semidefinite symmetric matrix ``\m athbf{M}_{H_p}``.
146- - `N_Hc=diagm (repeat(Nwt,Hc))` : positive semidefinite symmetric matrix ``\m athbf{N}_{H_c}``.
147- - `L_Hp=diagm (repeat(Lwt,Hp))` : positive semidefinite symmetric matrix ``\m athbf{L}_{H_p}``.
152+ - `M_Hp=Diagonal (repeat(Mwt,Hp))` : positive semidefinite symmetric matrix ``\m athbf{M}_{H_p}``.
153+ - `N_Hc=Diagonal (repeat(Nwt,Hc))` : positive semidefinite symmetric matrix ``\m athbf{N}_{H_c}``.
154+ - `L_Hp=Diagonal (repeat(Lwt,Hp))` : positive semidefinite symmetric matrix ``\m athbf{L}_{H_p}``.
148155- `Cwt=1e5` : slack variable weight ``C`` (scalar), use `Cwt=Inf` for hard constraints only.
149156- `transcription=SingleShooting()` : a [`TranscriptionMethod`](@ref) for the optimization.
150157- `optim=JuMP.Model(OSQP.MathOptInterfaceOSQP.Optimizer)` : quadratic optimizer used in
@@ -201,9 +208,9 @@ function LinMPC(
201208 Mwt = fill (DEFAULT_MWT, model. ny),
202209 Nwt = fill (DEFAULT_NWT, model. nu),
203210 Lwt = fill (DEFAULT_LWT, model. nu),
204- M_Hp = diagm (repeat (Mwt, Hp)),
205- N_Hc = diagm (repeat (Nwt, Hc)),
206- L_Hp = diagm (repeat (Lwt, Hp)),
211+ M_Hp = Diagonal (repeat (Mwt, Hp)),
212+ N_Hc = Diagonal (repeat (Nwt, Hc)),
213+ L_Hp = Diagonal (repeat (Lwt, Hp)),
207214 Cwt = DEFAULT_CWT,
208215 transcription:: TranscriptionMethod = DEFAULT_LINMPC_TRANSCRIPTION,
209216 optim:: JuMP.GenericModel = JuMP. Model (DEFAULT_LINMPC_OPTIMIZER, add_bridges= false ),
@@ -244,9 +251,9 @@ function LinMPC(
244251 Mwt = fill (DEFAULT_MWT, estim. model. ny),
245252 Nwt = fill (DEFAULT_NWT, estim. model. nu),
246253 Lwt = fill (DEFAULT_LWT, estim. model. nu),
247- M_Hp = diagm (repeat (Mwt, Hp)),
248- N_Hc = diagm (repeat (Nwt, Hc)),
249- L_Hp = diagm (repeat (Lwt, Hp)),
254+ M_Hp = Diagonal (repeat (Mwt, Hp)),
255+ N_Hc = Diagonal (repeat (Nwt, Hc)),
256+ L_Hp = Diagonal (repeat (Lwt, Hp)),
250257 Cwt = DEFAULT_CWT,
251258 transcription:: TranscriptionMethod = DEFAULT_LINMPC_TRANSCRIPTION,
252259 optim:: JM = JuMP. Model (DEFAULT_LINMPC_OPTIMIZER, add_bridges= false ),
@@ -257,7 +264,8 @@ function LinMPC(
257264 @warn (" prediction horizon Hp ($Hp ) ≤ estimated number of delays in model " *
258265 " ($nk ), the closed-loop system may be unstable or zero-gain (unresponsive)" )
259266 end
260- return LinMPC {NT} (estim, Hp, Hc, M_Hp, N_Hc, L_Hp, Cwt, transcription, optim)
267+ weights = ControllerWeights {NT} (estim. model, Hp, Hc, M_Hp, N_Hc, L_Hp, Cwt)
268+ return LinMPC {NT} (estim, Hp, Hc, weights, transcription, optim)
261269end
262270
263271"""
0 commit comments