@@ -10,6 +10,8 @@ struct ExplicitMPC{S<:StateEstimator} <: PredictiveController
1010 M_Hp:: Diagonal{Float64, Vector{Float64}}
1111 Ñ_Hc:: Diagonal{Float64, Vector{Float64}}
1212 L_Hp:: Diagonal{Float64, Vector{Float64}}
13+ C:: Float64
14+ E:: Float64
1315 R̂u:: Vector{Float64}
1416 R̂y:: Vector{Float64}
1517 S̃_Hp:: Matrix{Bool}
@@ -34,16 +36,19 @@ struct ExplicitMPC{S<:StateEstimator} <: PredictiveController
3436 model = estim. model
3537 nu, nxd, nxs, ny, nd = model. nu, model. nx, estim. nxs, model. ny, model. nd
3638 x̂d, x̂s, ŷ, Ŷs = zeros (nxd), zeros (nxs), zeros (ny), zeros (ny* Hp)
37- validate_weights (model, Hp, Hc, Mwt, Nwt, Lwt, Inf , ru)
39+ Cwt = Inf # no slack variable ϵ for ExplicitMPC
40+ Ewt = 0 # economic costs not supported for ExplicitMPC
41+ validate_weights (model, Hp, Hc, Mwt, Nwt, Lwt, Cwt, ru)
3842 M_Hp = Diagonal {Float64} (repeat (Mwt, Hp))
3943 N_Hc = Diagonal {Float64} (repeat (Nwt, Hc))
4044 L_Hp = Diagonal {Float64} (repeat (Lwt, Hp))
45+ C = Cwt
4146 # manipulated input setpoint predictions are constant over Hp :
4247 R̂u = ~ iszero (Lwt) ? repeat (ru, Hp) : R̂u = Float64[]
4348 R̂y = zeros (ny* Hp) # dummy R̂y (updated just before optimization)
4449 S_Hp, T_Hp, S_Hc, T_Hc = init_ΔUtoU (nu, Hp, Hc)
4550 E, F, G, J, Kd, Q = init_deterpred (model, Hp, Hc)
46- _ , S̃_Hp, Ñ_Hc, Ẽ = init_defaultcon (model, Hp, Hc, Inf , S_Hp, S_Hc, N_Hc, E)
51+ _ , S̃_Hp, Ñ_Hc, Ẽ = init_defaultcon (model, Hp, Hc, C , S_Hp, S_Hc, N_Hc, E)
4752 P̃, q̃, p = init_quadprog (model, Ẽ, S̃_Hp, M_Hp, Ñ_Hc, L_Hp)
4853 Ks, Ps = init_stochpred (estim, Hp)
4954 d, D̂ = zeros (nd), zeros (nd* Hp)
@@ -54,7 +59,7 @@ struct ExplicitMPC{S<:StateEstimator} <: PredictiveController
5459 estim,
5560 ΔŨ, x̂d, x̂s, ŷ, Ŷs,
5661 Hp, Hc,
57- M_Hp, Ñ_Hc, L_Hp, R̂u, R̂y,
62+ M_Hp, Ñ_Hc, L_Hp, Cwt, Ewt, R̂u, R̂y,
5863 S̃_Hp, T_Hp, T_Hc,
5964 Ẽ, F, G, J, Kd, Q, P̃, q̃, p,
6065 Ks, Ps,
@@ -87,15 +92,14 @@ arguments.
8792- `Mwt=fill(1.0,model.ny)` : main diagonal of ``\m athbf{M}`` weight matrix (vector).
8893- `Nwt=fill(0.1,model.nu)` : main diagonal of ``\m athbf{N}`` weight matrix (vector).
8994- `Lwt=fill(0.0,model.nu)` : main diagonal of ``\m athbf{L}`` weight matrix (vector).
90- - `Cwt=1e5` : slack variable weight ``C`` (scalar), use `Cwt=Inf` for hard constraints only.
9195- `ru=model.uop` : manipulated input setpoints ``\m athbf{r_u}`` (vector).
9296
9397# Examples
9498```jldoctest
9599julia> model = LinModel([tf(3, [30, 1]); tf(-2, [5, 1])], 4);
96100
97101julia> mpc = ExplicitMPC(model, Mwt=[0, 1], Nwt=[0.5], Hp=30, Hc=1)
98- ExplicitMPC controller with a sample time Ts = 4.0 s, OSQP optimizer, SteadyKalmanFilter estimator and:
102+ ExplicitMPC controller with a sample time Ts = 4.0 s, SteadyKalmanFilter estimator and:
99103 30 prediction steps Hp
100104 1 control steps Hc
101105 1 manipulated inputs u
@@ -120,7 +124,7 @@ Use custom state estimator `estim` to construct `ExplicitMPC`.
120124julia> estim = KalmanFilter(LinModel([tf(3, [30, 1]); tf(-2, [5, 1])], 4), i_ym=[2]);
121125
122126julia> mpc = ExplicitMPC(estim, Mwt=[0, 1], Nwt=[0.5], Hp=30, Hc=1)
123- ExplicitMPC controller with a sample time Ts = 4.0 s, OSQP optimizer, KalmanFilter estimator and:
127+ ExplicitMPC controller with a sample time Ts = 4.0 s, KalmanFilter estimator and:
124128 30 prediction steps Hp
125129 1 control steps Hc
126130 1 manipulated inputs u
@@ -152,6 +156,8 @@ function ExplicitMPC(
152156 return ExplicitMPC {S} (estim, Hp, Hc, Mwt, Nwt, Lwt, ru)
153157end
154158
159+ setconstraint! (:: ExplicitMPC ,kwargs... ) = error (" ExplicitMPC does not support constraints." )
160+
155161function Base. show (io:: IO , mpc:: ExplicitMPC )
156162 Hp, Hc = mpc. Hp, mpc. Hc
157163 nu, nd = mpc. estim. model. nu, mpc. estim. model. nd
@@ -173,4 +179,7 @@ Analytically solve the optimization problem for [`ExplicitMPC`](@ref).
173179function optim_objective! (mpc:: ExplicitMPC )
174180 mpc. ΔŨ[:] = - mpc. P̃\ mpc. q̃
175181 return mpc. ΔŨ
176- end
182+ end
183+
184+ " For [`ExplicitMPC`](@ref), return an empty summary."
185+ get_summary (:: ExplicitMPC ) = solution_summary (JuMP. Model (), verbose= true )
0 commit comments