@@ -32,7 +32,6 @@ struct NonLinMPC{S<:StateEstimator, JEFunc<:Function} <: PredictiveController
3232 Ps:: Matrix{Float64}
3333 d0:: Vector{Float64}
3434 D̂0:: Vector{Float64}
35- Uop:: Vector{Float64}
3635 Yop:: Vector{Float64}
3736 Dop:: Vector{Float64}
3837 function NonLinMPC {S, JEFunc} (
@@ -52,11 +51,11 @@ struct NonLinMPC{S<:StateEstimator, JEFunc<:Function} <: PredictiveController
5251 S_Hp, T_Hp, S_Hc, T_Hc = init_ΔUtoU (nu, Hp, Hc)
5352 E, F, G, J, Kd, Q = init_deterpred (model, Hp, Hc)
5453 con, S̃_Hp, Ñ_Hc, Ẽ = init_defaultcon (model, Hp, Hc, C, S_Hp, S_Hc, N_Hc, E)
55- nvar = size (Ẽ, 2 )
5654 P̃, q̃ = init_quadprog (model, Ẽ, S̃_Hp, M_Hp, Ñ_Hc, L_Hp)
5755 Ks, Ps = init_stochpred (estim, Hp)
5856 d0, D̂0 = zeros (nd), zeros (nd* Hp)
59- Uop, Yop, Dop = repeat (model. uop, Hp), repeat (model. yop, Hp), repeat (model. dop, Hp)
57+ Yop, Dop = repeat (model. yop, Hp), repeat (model. dop, Hp)
58+ nvar = size (Ẽ, 2 )
6059 ΔŨ = zeros (nvar)
6160 mpc = new (
6261 estim, optim, con,
@@ -67,14 +66,9 @@ struct NonLinMPC{S<:StateEstimator, JEFunc<:Function} <: PredictiveController
6766 Ẽ, F, G, J, Kd, Q, P̃, q̃,
6867 Ks, Ps,
6968 d0, D̂0,
70- Uop, Yop, Dop,
69+ Yop, Dop,
7170 )
72- @variable (optim, ΔŨ[1 : nvar])
73- A = con. A[con. i_b, :]
74- b = con. b[con. i_b]
75- @constraint (optim, linconstraint, A* ΔŨ .≤ b)
76- init_nonlinprog! (mpc, model)
77- set_silent (optim)
71+ init_optimization! (mpc)
7872 return mpc
7973 end
8074end
@@ -194,10 +188,23 @@ function NonLinMPC(
194188end
195189
196190
197- function init_nonlinprog! (mpc:: NonLinMPC , model:: SimModel )
191+ """
192+ init_optimization!(mpc::NonLinMPC)
193+
194+ Init the nonlinear optimization for [`NonLinMPC`](@ref) controllers.
195+ """
196+ function init_optimization! (mpc:: NonLinMPC )
197+ # --- variables and linear constraints ---
198198 optim, con = mpc. optim, mpc. con
199- ΔŨvar = optim[:ΔŨ ]
200- nvar = length (ΔŨvar)
199+ nvar = length (mpc. ΔŨ)
200+ set_silent (optim)
201+ @variable (optim, ΔŨvar[1 : nvar])
202+ ΔŨvar = optim[:ΔŨvar ]
203+ A = con. A[con. i_b, :]
204+ b = con. b[con. i_b]
205+ @constraint (optim, linconstraint, A* ΔŨvar .≤ b)
206+ # --- nonlinear optimization init ---
207+ model = mpc. estim. model
201208 last_ΔŨtup, C, Ŷ = nothing , nothing , nothing
202209 last_dΔŨtup, dC, dŶ = nothing , nothing , nothing
203210 function Jfunc (ΔŨtup:: Float64... )
@@ -250,6 +257,7 @@ function init_nonlinprog!(mpc::NonLinMPC, model::SimModel)
250257 sym = Symbol (" C_Ŷmax_$i " )
251258 register (optim, sym, nvar, Cfunc[n + i], autodiff= true )
252259 end
260+ return nothing
253261end
254262
255263
@@ -259,24 +267,20 @@ setnontlincon!(::NonLinMPC, ::LinModel) = nothing
259267" Set the nonlinear constraints on the output predictions `Ŷ`."
260268function setnonlincon! (mpc:: NonLinMPC , model:: NonLinModel )
261269 optim = mpc. optim
262- ΔŨ = mpc. optim[:ΔŨ ]
270+ ΔŨvar = mpc. optim[:ΔŨvar ]
263271 con = mpc. con
264272 map (con -> delete (optim, con), all_nonlinear_constraints (optim))
265273 for i in findall (.! isinf .(con. Ŷmin))
266274 f_sym = Symbol (" C_Ŷmin_$(i) " )
267- add_nonlinear_constraint (optim, :($ (f_sym)($ (ΔŨ ... )) <= 0 ))
275+ add_nonlinear_constraint (optim, :($ (f_sym)($ (ΔŨvar ... )) <= 0 ))
268276 end
269277 for i in findall (.! isinf .(con. Ŷmax))
270278 f_sym = Symbol (" C_Ŷmax_$(i) " )
271- add_nonlinear_constraint (optim, :($ (f_sym)($ (ΔŨ ... )) <= 0 ))
279+ add_nonlinear_constraint (optim, :($ (f_sym)($ (ΔŨvar ... )) <= 0 ))
272280 end
273281 return nothing
274282end
275283
276- " Nonlinear programming objective does not require any initialization."
277- init_objective! (mpc:: NonLinMPC , _ ) = nothing
278-
279-
280284"""
281285 obj_nonlinprog(mpc::NonLinMPC, model::LinModel, ΔŨ::Vector{Real})
282286
0 commit comments