|
12 | 12 | u1 = [20.0, 20.0] |
13 | 13 | u2 = [20.0, 20.0] |
14 | 14 | model.x0 .= 0 |
15 | | - y_data = zeros(model.ny, N) |
16 | 15 | u_data1, u_data2 = zeros(model.nu, N), zeros(model.nu, N) |
17 | 16 | for k in 0:N-1 |
18 | 17 | k == 10 && (r .= [45; 30.0]) |
19 | 18 | k == 25 && (r .= [50; 45.0]) |
20 | 19 | y = model() |
21 | | - y_data[:, k+1] = y |
22 | 20 | preparestate!(mpc1, y) |
23 | 21 | x̂ = LinearMPC.correct_state!(mpc2, y) |
24 | 22 | u1 = moveinput!(mpc1, r) |
|
28 | 26 | updatestate!(mpc1, u1, y) |
29 | 27 | LinearMPC.predict_state!(mpc2, u2) |
30 | 28 | end |
31 | | - return y_data, u_data1, u_data2 |
| 29 | + return u_data1, u_data2 |
32 | 30 | end |
33 | 31 | N = 50 |
34 | | - y_data, u_data1, u_data2 = sim_both(model, mpc1, mpc2, N) |
35 | | - @test u_data1 ≈ u_data2 atol=1e-3 rtol=1e-3 |
| 32 | + u_data1, u_data2 = sim_both(model, mpc1, mpc2, N) |
| 33 | + @test u_data1 ≈ u_data2 atol=1e-3 rtol=1e-3 # looser tol due to different softening |
| 34 | + |
| 35 | + mpc1_hard = LinMPC(model, Hp=15, Cwt=Inf, optim=optim) |
| 36 | + mpc1_hard = setconstraint!(mpc1_hard, ymin=[48, -Inf], umax=[Inf, 30]) |
| 37 | + mpc2_hard = LinearMPC.MPC(mpc1_hard) |
| 38 | + u_data1_hard, u_data2_hard = sim_both( |
| 39 | + model, mpc1_hard, mpc2_hard, N |
| 40 | + ) |
| 41 | + @test u_data1_hard ≈ u_data2_hard atol=1e-12 # exact match for hard constraints |
36 | 42 |
|
37 | 43 | mpc_ms = LinMPC(model; transcription=MultipleShooting(), optim) |
38 | 44 | @test_throws ErrorException LinearMPC.MPC(mpc_ms) |
|
0 commit comments