@@ -50,6 +50,10 @@ nmpc_nonlin_ms = NonLinMPC(
5050 nonlinmodel, transcription= MultipleShooting (),
5151 Mwt= [1 , 1 ], Nwt= [0.1 , 0.1 ], Lwt= [0.1 , 0.1 ], Hp= 10
5252)
53+ nmpc_nonlin_tc = NonLinMPC (
54+ nonlinmodel_c, transcription= TrapezoidalCollocation (),
55+ Mwt= [1 ], Nwt= [0.1 ], Lwt= [0.1 ], Hp= 10
56+ )
5357
5458samples, evals, seconds = 10000 , 1 , 60
5559UNIT_MPC[" NonLinMPC" ][" moveinput!" ][" LinModel" ][" SingleShooting" ] =
@@ -76,6 +80,12 @@ UNIT_MPC["NonLinMPC"]["moveinput!"]["NonLinModel"]["MultipleShooting"] =
7680 setup= preparestate! ($ nmpc_nonlin_ms, $ y, $ d),
7781 samples= samples, evals= evals, seconds= seconds
7882 )
83+ UNIT_MPC[" NonLinMPC" ][" moveinput!" ][" NonLinModel" ][" TrapezoidalCollocation" ] =
84+ @benchmarkable (
85+ moveinput! ($ nmpc_nonlin_tc, $ y_c, $ d_c),
86+ setup= preparestate! ($ nmpc_nonlin_tc, $ y_c, $ d_c),
87+ samples= samples, evals= evals, seconds= seconds
88+ )
7989
8090# # ----------------------------------------------------------------------------------------
8191# # ---------------------- CASE STUDIES ----------------------------------------------------
@@ -230,7 +240,6 @@ CASE_MPC["CSTR"]["LinMPC"]["With feedforward"]["Ipopt"]["MultipleShooting"] =
230240 samples= samples, evals= evals
231241 )
232242
233-
234243# ----------------- Case study: Pendulum noneconomic -----------------------------
235244model, p = pendulum_model, pendulum_p
236245σQ = [0.1 , 1.0 ]; σR= [5.0 ]; nint_u= [1 ]; σQint_u= [0.1 ]
@@ -255,13 +264,20 @@ nmpc_ipopt_ms = NonLinMPC(estim; Hp, Hc, Mwt, Nwt, Cwt, optim, transcription)
255264nmpc_ipopt_ms = setconstraint! (nmpc_ipopt_ms; umin, umax)
256265JuMP. unset_time_limit_sec (nmpc_ipopt_ms. optim)
257266
267+ optim = JuMP. Model (optimizer_with_attributes (Ipopt. Optimizer," sb" => " yes" ), add_bridges= false )
268+ transcription = TrapezoidalCollocation ()
269+ nmpc_ipopt_tc = NonLinMPC (estim; Hp, Hc, Mwt, Nwt, Cwt, optim, transcription)
270+ nmpc_ipopt_tc = setconstraint! (nmpc_ipopt_tc; umin, umax)
271+ JuMP. unset_time_limit_sec (nmpc_ipopt_tc. optim)
272+
258273optim = JuMP. Model (MadNLP. Optimizer, add_bridges= false )
259274transcription = SingleShooting ()
260275nmpc_madnlp_ss = NonLinMPC (estim; Hp, Hc, Mwt, Nwt, Cwt, optim, transcription)
261276nmpc_madnlp_ss = setconstraint! (nmpc_madnlp_ss; umin, umax)
262277JuMP. unset_time_limit_sec (nmpc_madnlp_ss. optim)
263278
264- # TODO : does not work well with MadNLP and MultipleShooting, figure out why. Current theory:
279+ # TODO : does not work well with MadNLP and MultipleShooting or TrapezoidalCollocation,
280+ # figure out why. Current theory:
265281# MadNLP LBFGS approximation is less robust than Ipopt version. Re-test when exact Hessians
266282# will be supported in ModelPredictiveControl.jl. The following attributes kinda work with
267283# the MadNLP LBFGS approximation but super slow (~1000 times slower than Ipopt):
@@ -285,6 +301,11 @@ CASE_MPC["Pendulum"]["NonLinMPC"]["Noneconomic"]["Ipopt"]["MultipleShooting"] =
285301 sim! ($ nmpc_ipopt_ms, $ N, $ ry; plant= $ plant, x_0= $ x_0, x̂_0= $ x̂_0),
286302 samples= samples, evals= evals, seconds= seconds
287303 )
304+ CASE_MPC[" Pendulum" ][" NonLinMPC" ][" Noneconomic" ][" Ipopt" ][" TrapezoidalCollocation" ] =
305+ @benchmarkable (
306+ sim! ($ nmpc_ipopt_tc, $ N, $ ry; plant= $ plant, x_0= $ x_0, x̂_0= $ x̂_0),
307+ samples= samples, evals= evals, seconds= seconds
308+ )
288309CASE_MPC[" Pendulum" ][" NonLinMPC" ][" Noneconomic" ][" MadNLP" ][" SingleShooting" ] =
289310 @benchmarkable (
290311 sim! ($ nmpc_madnlp_ss, $ N, $ ry; plant= $ plant, x_0= $ x_0, x̂_0= $ x̂_0),
@@ -316,13 +337,19 @@ empc_ipopt_ms = NonLinMPC(estim2; Hp, Hc, Nwt, Mwt=Mwt2, Cwt, JE, Ewt, optim, tr
316337empc_ipopt_ms = setconstraint! (empc_ipopt_ms; umin, umax)
317338JuMP. unset_time_limit_sec (empc_ipopt_ms. optim)
318339
340+ optim = JuMP. Model (optimizer_with_attributes (Ipopt. Optimizer," sb" => " yes" ), add_bridges= false )
341+ transcription = TrapezoidalCollocation ()
342+ empc_ipopt_tc = NonLinMPC (estim2; Hp, Hc, Nwt, Mwt= Mwt2, Cwt, JE, Ewt, optim, transcription, p)
343+ empc_ipopt_tc = setconstraint! (empc_ipopt_tc; umin, umax)
344+ JuMP. unset_time_limit_sec (empc_ipopt_tc. optim)
345+
319346optim = JuMP. Model (MadNLP. Optimizer, add_bridges= false )
320347transcription = SingleShooting ()
321348empc_madnlp_ss = NonLinMPC (estim2; Hp, Hc, Nwt, Mwt= Mwt2, Cwt, JE, Ewt, optim, transcription, p)
322349empc_madnlp_ss = setconstraint! (empc_madnlp_ss; umin, umax)
323350JuMP. unset_time_limit_sec (empc_madnlp_ss. optim)
324351
325- # TODO : test EMPC with MadNLP and MultipleShooting, see comment above.
352+ # TODO : test EMPC with MadNLP and MultipleShooting and TrapezoidalCollocation , see comment above.
326353
327354samples, evals, seconds = 100 , 1 , 15 * 60
328355CASE_MPC[" Pendulum" ][" NonLinMPC" ][" Economic" ][" Ipopt" ][" SingleShooting" ] =
@@ -335,6 +362,11 @@ CASE_MPC["Pendulum"]["NonLinMPC"]["Economic"]["Ipopt"]["MultipleShooting"] =
335362 sim! ($ empc_ipopt_ms, $ N, $ ry; plant= $ plant2, x_0= $ x_0, x̂_0= $ x̂_0),
336363 samples= samples, evals= evals, seconds= seconds
337364 )
365+ CASE_MPC[" Pendulum" ][" NonLinMPC" ][" Economic" ][" Ipopt" ][" TrapezoidalCollocation" ] =
366+ @benchmarkable (
367+ sim! ($ empc_ipopt_tc, $ N, $ ry; plant= $ plant2, x_0= $ x_0, x̂_0= $ x̂_0),
368+ samples= samples, evals= evals, seconds= seconds
369+ )
338370CASE_MPC[" Pendulum" ][" NonLinMPC" ][" Economic" ][" MadNLP" ][" SingleShooting" ] =
339371 @benchmarkable (
340372 sim! ($ empc_madnlp_ss, $ N, $ ry; plant= $ plant2, x_0= $ x_0, x̂_0= $ x̂_0),
@@ -373,8 +405,17 @@ nmpc2_ipopt_ms = NonLinMPC(estim2;
373405nmpc2_ipopt_ms = setconstraint! (nmpc2_ipopt_ms; umin, umax)
374406JuMP. unset_time_limit_sec (nmpc2_ipopt_ms. optim)
375407
408+ optim = JuMP. Model (optimizer_with_attributes (Ipopt. Optimizer," sb" => " yes" ), add_bridges= false )
409+ transcription = TrapezoidalCollocation ()
410+ nmpc2_ipopt_tc = NonLinMPC (estim2;
411+ Hp, Hc, Nwt= Nwt, Mwt= [0.5 , 0 ], Cwt, gc!, nc, p= Pmax, optim, transcription
412+ )
413+ nmpc2_ipopt_tc = setconstraint! (nmpc2_ipopt_tc; umin, umax)
414+ JuMP. unset_time_limit_sec (nmpc2_ipopt_tc. optim)
415+
376416# TODO : test custom constraints with MadNLP and SingleShooting, see comment above.
377417# TODO : test custom constraints with MadNLP and MultipleShooting, see comment above.
418+ # TODO : test custom constraints with MadNLP and TrapezoidalCollocation, see comment above.
378419
379420samples, evals, seconds = 100 , 1 , 15 * 60
380421CASE_MPC[" Pendulum" ][" NonLinMPC" ][" Custom constraints" ][" Ipopt" ][" SingleShooting" ] =
@@ -387,6 +428,11 @@ CASE_MPC["Pendulum"]["NonLinMPC"]["Custom constraints"]["Ipopt"]["MultipleShooti
387428 sim! ($ nmpc2_ipopt_ms, $ N, $ ry; plant= $ plant2, x_0= $ x_0, x̂_0= $ x̂_0),
388429 samples= samples, evals= evals, seconds= seconds
389430 )
431+ CASE_MPC[" Pendulum" ][" NonLinMPC" ][" Custom constraints" ][" Ipopt" ][" TrapezoidalCollocation" ] =
432+ @benchmarkable (
433+ sim! ($ nmpc2_ipopt_tc, $ N, $ ry; plant= $ plant2, x_0= $ x_0, x̂_0= $ x̂_0),
434+ samples= samples, evals= evals, seconds= seconds
435+ )
390436
391437# ----------------- Case study: Pendulum successive linearization -------------------------
392438linmodel = linearize (model, x= [0 , 0 ], u= [0 ])
0 commit comments