@@ -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,32 @@ 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 = MultipleShooting (f_threads= true )
269+ nmpc_ipopt_mst = NonLinMPC (estim; Hp, Hc, Mwt, Nwt, Cwt, optim, transcription)
270+ nmpc_ipopt_mst = setconstraint! (nmpc_ipopt_mst; umin, umax)
271+ JuMP. unset_time_limit_sec (nmpc_ipopt_mst. optim)
272+
273+ optim = JuMP. Model (optimizer_with_attributes (Ipopt. Optimizer," sb" => " yes" ), add_bridges= false )
274+ transcription = TrapezoidalCollocation ()
275+ nmpc_ipopt_tc = NonLinMPC (estim; Hp, Hc, Mwt, Nwt, Cwt, optim, transcription)
276+ nmpc_ipopt_tc = setconstraint! (nmpc_ipopt_tc; umin, umax)
277+ JuMP. unset_time_limit_sec (nmpc_ipopt_tc. optim)
278+
279+ optim = JuMP. Model (optimizer_with_attributes (Ipopt. Optimizer," sb" => " yes" ), add_bridges= false )
280+ transcription = TrapezoidalCollocation (f_threads= true )
281+ nmpc_ipopt_tct = NonLinMPC (estim; Hp, Hc, Mwt, Nwt, Cwt, optim, transcription)
282+ nmpc_ipopt_tct = setconstraint! (nmpc_ipopt_tct; umin, umax)
283+ JuMP. unset_time_limit_sec (nmpc_ipopt_tct. optim)
284+
258285optim = JuMP. Model (MadNLP. Optimizer, add_bridges= false )
259286transcription = SingleShooting ()
260287nmpc_madnlp_ss = NonLinMPC (estim; Hp, Hc, Mwt, Nwt, Cwt, optim, transcription)
261288nmpc_madnlp_ss = setconstraint! (nmpc_madnlp_ss; umin, umax)
262289JuMP. unset_time_limit_sec (nmpc_madnlp_ss. optim)
263290
264- # TODO : does not work well with MadNLP and MultipleShooting, figure out why. Current theory:
291+ # TODO : does not work well with MadNLP and MultipleShooting or TrapezoidalCollocation,
292+ # figure out why. Current theory:
265293# MadNLP LBFGS approximation is less robust than Ipopt version. Re-test when exact Hessians
266294# will be supported in ModelPredictiveControl.jl. The following attributes kinda work with
267295# the MadNLP LBFGS approximation but super slow (~1000 times slower than Ipopt):
@@ -285,6 +313,21 @@ CASE_MPC["Pendulum"]["NonLinMPC"]["Noneconomic"]["Ipopt"]["MultipleShooting"] =
285313 sim! ($ nmpc_ipopt_ms, $ N, $ ry; plant= $ plant, x_0= $ x_0, x̂_0= $ x̂_0),
286314 samples= samples, evals= evals, seconds= seconds
287315 )
316+ CASE_MPC[" Pendulum" ][" NonLinMPC" ][" Noneconomic" ][" Ipopt" ][" MultipleShooting (threaded)" ] =
317+ @benchmarkable (
318+ sim! ($ nmpc_ipopt_mst, $ N, $ ry; plant= $ plant, x_0= $ x_0, x̂_0= $ x̂_0),
319+ samples= samples, evals= evals, seconds= seconds
320+ )
321+ CASE_MPC[" Pendulum" ][" NonLinMPC" ][" Noneconomic" ][" Ipopt" ][" TrapezoidalCollocation" ] =
322+ @benchmarkable (
323+ sim! ($ nmpc_ipopt_tc, $ N, $ ry; plant= $ plant, x_0= $ x_0, x̂_0= $ x̂_0),
324+ samples= samples, evals= evals, seconds= seconds
325+ )
326+ CASE_MPC[" Pendulum" ][" NonLinMPC" ][" Noneconomic" ][" Ipopt" ][" TrapezoidalCollocation (threaded)" ] =
327+ @benchmarkable (
328+ sim! ($ nmpc_ipopt_tct, $ N, $ ry; plant= $ plant, x_0= $ x_0, x̂_0= $ x̂_0),
329+ samples= samples, evals= evals, seconds= seconds
330+ )
288331CASE_MPC[" Pendulum" ][" NonLinMPC" ][" Noneconomic" ][" MadNLP" ][" SingleShooting" ] =
289332 @benchmarkable (
290333 sim! ($ nmpc_madnlp_ss, $ N, $ ry; plant= $ plant, x_0= $ x_0, x̂_0= $ x̂_0),
@@ -316,13 +359,19 @@ empc_ipopt_ms = NonLinMPC(estim2; Hp, Hc, Nwt, Mwt=Mwt2, Cwt, JE, Ewt, optim, tr
316359empc_ipopt_ms = setconstraint! (empc_ipopt_ms; umin, umax)
317360JuMP. unset_time_limit_sec (empc_ipopt_ms. optim)
318361
362+ optim = JuMP. Model (optimizer_with_attributes (Ipopt. Optimizer," sb" => " yes" ), add_bridges= false )
363+ transcription = TrapezoidalCollocation ()
364+ empc_ipopt_tc = NonLinMPC (estim2; Hp, Hc, Nwt, Mwt= Mwt2, Cwt, JE, Ewt, optim, transcription, p)
365+ empc_ipopt_tc = setconstraint! (empc_ipopt_tc; umin, umax)
366+ JuMP. unset_time_limit_sec (empc_ipopt_tc. optim)
367+
319368optim = JuMP. Model (MadNLP. Optimizer, add_bridges= false )
320369transcription = SingleShooting ()
321370empc_madnlp_ss = NonLinMPC (estim2; Hp, Hc, Nwt, Mwt= Mwt2, Cwt, JE, Ewt, optim, transcription, p)
322371empc_madnlp_ss = setconstraint! (empc_madnlp_ss; umin, umax)
323372JuMP. unset_time_limit_sec (empc_madnlp_ss. optim)
324373
325- # TODO : test EMPC with MadNLP and MultipleShooting, see comment above.
374+ # TODO : test EMPC with MadNLP and MultipleShooting and TrapezoidalCollocation , see comment above.
326375
327376samples, evals, seconds = 100 , 1 , 15 * 60
328377CASE_MPC[" Pendulum" ][" NonLinMPC" ][" Economic" ][" Ipopt" ][" SingleShooting" ] =
@@ -335,6 +384,11 @@ CASE_MPC["Pendulum"]["NonLinMPC"]["Economic"]["Ipopt"]["MultipleShooting"] =
335384 sim! ($ empc_ipopt_ms, $ N, $ ry; plant= $ plant2, x_0= $ x_0, x̂_0= $ x̂_0),
336385 samples= samples, evals= evals, seconds= seconds
337386 )
387+ CASE_MPC[" Pendulum" ][" NonLinMPC" ][" Economic" ][" Ipopt" ][" TrapezoidalCollocation" ] =
388+ @benchmarkable (
389+ sim! ($ empc_ipopt_tc, $ N, $ ry; plant= $ plant2, x_0= $ x_0, x̂_0= $ x̂_0),
390+ samples= samples, evals= evals, seconds= seconds
391+ )
338392CASE_MPC[" Pendulum" ][" NonLinMPC" ][" Economic" ][" MadNLP" ][" SingleShooting" ] =
339393 @benchmarkable (
340394 sim! ($ empc_madnlp_ss, $ N, $ ry; plant= $ plant2, x_0= $ x_0, x̂_0= $ x̂_0),
@@ -373,8 +427,17 @@ nmpc2_ipopt_ms = NonLinMPC(estim2;
373427nmpc2_ipopt_ms = setconstraint! (nmpc2_ipopt_ms; umin, umax)
374428JuMP. unset_time_limit_sec (nmpc2_ipopt_ms. optim)
375429
430+ optim = JuMP. Model (optimizer_with_attributes (Ipopt. Optimizer," sb" => " yes" ), add_bridges= false )
431+ transcription = TrapezoidalCollocation ()
432+ nmpc2_ipopt_tc = NonLinMPC (estim2;
433+ Hp, Hc, Nwt= Nwt, Mwt= [0.5 , 0 ], Cwt, gc!, nc, p= Pmax, optim, transcription
434+ )
435+ nmpc2_ipopt_tc = setconstraint! (nmpc2_ipopt_tc; umin, umax)
436+ JuMP. unset_time_limit_sec (nmpc2_ipopt_tc. optim)
437+
376438# TODO : test custom constraints with MadNLP and SingleShooting, see comment above.
377439# TODO : test custom constraints with MadNLP and MultipleShooting, see comment above.
440+ # TODO : test custom constraints with MadNLP and TrapezoidalCollocation, see comment above.
378441
379442samples, evals, seconds = 100 , 1 , 15 * 60
380443CASE_MPC[" Pendulum" ][" NonLinMPC" ][" Custom constraints" ][" Ipopt" ][" SingleShooting" ] =
@@ -387,6 +450,11 @@ CASE_MPC["Pendulum"]["NonLinMPC"]["Custom constraints"]["Ipopt"]["MultipleShooti
387450 sim! ($ nmpc2_ipopt_ms, $ N, $ ry; plant= $ plant2, x_0= $ x_0, x̂_0= $ x̂_0),
388451 samples= samples, evals= evals, seconds= seconds
389452 )
453+ CASE_MPC[" Pendulum" ][" NonLinMPC" ][" Custom constraints" ][" Ipopt" ][" TrapezoidalCollocation" ] =
454+ @benchmarkable (
455+ sim! ($ nmpc2_ipopt_tc, $ N, $ ry; plant= $ plant2, x_0= $ x_0, x̂_0= $ x̂_0),
456+ samples= samples, evals= evals, seconds= seconds
457+ )
390458
391459# ----------------- Case study: Pendulum successive linearization -------------------------
392460linmodel = linearize (model, x= [0 , 0 ], u= [0 ])
0 commit comments