Skip to content

Commit 3c74484

Browse files
committed
changed: Ipopt nlp_scaling_max_gradient default to 10.0/C
1 parent b84e230 commit 3c74484

File tree

3 files changed

+25
-8
lines changed

3 files changed

+25
-8
lines changed

src/controller/nonlinmpc.jl

Lines changed: 9 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -276,7 +276,7 @@ Init the nonlinear optimization for [`NonLinMPC`](@ref) controllers.
276276
"""
277277
function init_optimization!(mpc::NonLinMPC, optim::JuMP.GenericModel{JNT}) where JNT<:Real
278278
# --- variables and linear constraints ---
279-
con = mpc.con
279+
C, con = mpc.C, mpc.con
280280
nΔŨ = length(mpc.ΔŨ)
281281
set_silent(optim)
282282
limit_solve_time(mpc.optim, mpc.estim.model.Ts)
@@ -285,6 +285,14 @@ function init_optimization!(mpc::NonLinMPC, optim::JuMP.GenericModel{JNT}) where
285285
b = con.b[con.i_b]
286286
@constraint(optim, linconstraint, A*ΔŨvar .≤ b)
287287
# --- nonlinear optimization init ---
288+
if !isinf(C) && solver_name(optim) == "Ipopt"
289+
try
290+
get_attribute(optim, "nlp_scaling_max_gradient")
291+
catch
292+
# default "nlp_scaling_max_gradient" to `10.0/C` if not already set:
293+
set_attribute(optim, "nlp_scaling_max_gradient", 10.0/C)
294+
end
295+
end
288296
model = mpc.estim.model
289297
ny, nx̂, Hp, ng = model.ny, mpc.estim.nx̂, mpc.Hp, length(con.i_g)
290298
# inspired from https://jump.dev/JuMP.jl/stable/tutorials/nonlinear/tips_and_tricks/#User-defined-operators-with-vector-outputs

src/estimator/mhe/construct.jl

Lines changed: 12 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -964,17 +964,26 @@ Init the nonlinear optimization of [`MovingHorizonEstimator`](@ref).
964964
function init_optimization!(
965965
estim::MovingHorizonEstimator, model::SimModel, optim::JuMP.GenericModel{JNT},
966966
) where JNT<:Real
967-
He, con = estim.He, estim.con
968-
nV̂, nX̂, ng = He*estim.nym, He*estim.nx̂, length(con.i_g)
969-
# --- variables and linear constraints ---
967+
C, con = estim.C, estim.con
970968
nZ̃ = length(estim.Z̃)
969+
# --- variables and linear constraints ---
971970
set_silent(optim)
972971
limit_solve_time(estim.optim, estim.model.Ts)
973972
@variable(optim, Z̃var[1:nZ̃])
974973
A = estim.con.A[con.i_b, :]
975974
b = estim.con.b[con.i_b]
976975
@constraint(optim, linconstraint, A*Z̃var .≤ b)
977976
# --- nonlinear optimization init ---
977+
if !isinf(C) && solver_name(optim) == "Ipopt"
978+
try
979+
get_attribute(optim, "nlp_scaling_max_gradient")
980+
catch
981+
# default "nlp_scaling_max_gradient" to `10.0/C` if not already set:
982+
set_attribute(optim, "nlp_scaling_max_gradient", 10.0/C)
983+
end
984+
end
985+
He = estim.He
986+
nV̂, nX̂, ng = He*estim.nym, He*estim.nx̂, length(con.i_g)
978987
# see init_optimization!(mpc::NonLinMPC, optim) for details on the inspiration
979988
Jfunc, gfunc = let estim=estim, model=model, nZ̃=nZ̃ , nV̂=nV̂, nX̂=nX̂, ng=ng
980989
last_Z̃tup_float, last_Z̃tup_dual = nothing, nothing

src/precompile.jl

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,8 @@
11
sys = [
2-
tf(1.90, [18, 1]) tf(1.90, [18, 1]);
3-
tf(-0.74,[8, 1]) tf(0.74, [8, 1])
2+
tf(1.90, [1800, 1]) tf(1.90, [1800, 1]);
3+
tf(-0.74,[800, 1]) tf(0.74, [800, 1])
44
]
5-
Ts = 4.0
5+
Ts = 400.0
66
model = setop!(LinModel(sys, Ts), uop=[10, 10], yop=[50, 30])
77
y = model()
88

@@ -74,7 +74,7 @@ initstate!(nmpc_im, nlmodel.uop, y)
7474
u = nmpc_im([55, 30], ym=y)
7575
sim!(nmpc_im, 3, [55, 30])
7676

77-
nmpc_ukf = setconstraint!(NonLinMPC(UnscentedKalmanFilter(nlmodel), Hp=10, Cwt=10), ymin=[45, -Inf])
77+
nmpc_ukf = setconstraint!(NonLinMPC(UnscentedKalmanFilter(nlmodel), Hp=10, Cwt=1e3), ymin=[45, -Inf])
7878
initstate!(nmpc_ukf, nlmodel.uop, y)
7979
u = nmpc_ukf([55, 30])
8080
sim!(nmpc_ukf, 3, [55, 30])

0 commit comments

Comments
 (0)