@@ -1472,3 +1472,42 @@ end
14721472 @test U_linmpc ≈ U_nonlinmpc2 rtol= 1e-3 atol= 1e-3
14731473 @test U_nonlinmpc1 ≈ U_nonlinmpc2 rtol= 1e-3 atol= 1e-3
14741474end
1475+
1476+ @testitem " LinMPC v.s. NonLinMPC with move blocking" setup= [SetupMPCtests] begin
1477+ using . SetupMPCtests, ControlSystemsBase, LinearAlgebra
1478+ linmodel = setop! (LinModel (sys,Ts,i_d= [3 ]), uop= [10 ,50 ], yop= [50 ,30 ], dop= [20 ])
1479+ G = tf ( 10 , [400 , 1 ])
1480+ Ts = 100.0
1481+ linmodel = LinModel (G, Ts)
1482+ f = (x, u, _, p) -> p. A * x + p. Bu * u
1483+ h = (x, _, p) -> p. C * x
1484+ nonlinmodel = NonLinModel (f, h, Ts, 1 , 1 , 1 , p= linmodel, solver= nothing )
1485+ Mwt, Nwt, Hp, Hc = [1 ], [0 ], 30 , [1 , 2 , 3 , 24 ]
1486+ N = 25
1487+ mpc1 = LinMPC (linmodel; Mwt, Nwt, Hp, Hc, transcription= SingleShooting ())
1488+ mpc2 = LinMPC (linmodel; Mwt, Nwt, Hp, Hc, transcription= MultipleShooting ())
1489+ mpc3 = NonLinMPC (linmodel; Mwt, Nwt, Hp, Hc, transcription= SingleShooting ())
1490+ mpc4 = NonLinMPC (linmodel; Mwt, Nwt, Hp, Hc, transcription= MultipleShooting ())
1491+ mpc5 = NonLinMPC (nonlinmodel; Mwt, Nwt, Hp, Hc, transcription= SingleShooting ())
1492+ mpc6 = NonLinMPC (nonlinmodel; Mwt, Nwt, Hp, Hc, transcription= MultipleShooting ())
1493+ U1, U2, U3 = zeros (1 , N), zeros (1 , N), zeros (1 , N)
1494+ U4, U5, U6 = zeros (1 , N), zeros (1 , N), zeros (1 , N)
1495+ for i= 1 : N
1496+ r = [5.0 ]
1497+ y = linmodel ()
1498+ preparestate! (mpc1, y); preparestate! (mpc2, y); preparestate! (mpc3, y);
1499+ preparestate! (mpc4, y); preparestate! (mpc5, y); preparestate! (mpc6, y);
1500+ u1 = moveinput! (mpc1, r); u2 = moveinput! (mpc2, r); u3 = moveinput! (mpc3, r);
1501+ u4 = moveinput! (mpc4, r); u5 = moveinput! (mpc5, r); u6 = moveinput! (mpc6, r);
1502+ U1[:, i] = u1; U2[:, i] = u2; U3[:, i] = u3;
1503+ U4[:, i] = u4; U5[:, i] = u5; U6[:, i] = u6;
1504+ updatestate! (mpc1, u1, y); updatestate! (mpc2, u2, y); updatestate! (mpc3, u3, y);
1505+ updatestate! (mpc4, u4, y); updatestate! (mpc5, u5, y); updatestate! (mpc6, u6, y);
1506+ updatestate! (linmodel, u1);
1507+ end
1508+ @test U1 ≈ U2 rtol= 1e-3 atol= 1e-3
1509+ @test U1 ≈ U3 rtol= 1e-3 atol= 1e-3
1510+ @test U1 ≈ U4 rtol= 1e-3 atol= 1e-3
1511+ @test U1 ≈ U5 rtol= 1e-3 atol= 1e-3
1512+ @test U1 ≈ U6 rtol= 1e-3 atol= 1e-3
1513+ end
0 commit comments