@@ -566,25 +566,35 @@ end
566
566
567
567
@testset " NonLinMPC moves and getinfo" begin
568
568
linmodel = setop! (LinModel (tf (5 , [2000 , 1 ]), 3000.0 ), yop= [10 ])
569
- nmpc_lin = NonLinMPC (linmodel, Nwt= [0 ], Hp= 1000 , Hc= 1 )
570
- r = [15 ]
569
+ Hp = 1000
570
+ nmpc_lin = NonLinMPC (linmodel, Nwt= [0 ], Hp= Hp, Hc= 1 )
571
+ ry, ru = [15 ], [4 ]
571
572
preparestate! (nmpc_lin, [10 ])
572
- u = moveinput! (nmpc_lin, r )
573
+ u = moveinput! (nmpc_lin, ry )
573
574
@test u ≈ [1 ] atol= 5e-2
574
- u = nmpc_lin (r )
575
+ u = nmpc_lin (ry )
575
576
@test u ≈ [1 ] atol= 5e-2
576
577
info = getinfo (nmpc_lin)
577
578
@test info[:u ] ≈ u
578
- @test info[:Ŷ ][end ] ≈ r[1 ] atol= 5e-2
579
- Hp = 1000
580
- R̂y = fill (r[1 ], Hp)
581
- JE = (_ , Ŷe, _ , R̂y) -> sum ((Ŷe[2 : end ] - R̂y). ^ 2 )
582
- nmpc = NonLinMPC (linmodel, Mwt= [0 ], Nwt= [0 ], Cwt= Inf , Ewt= 1 , JE= JE, p= R̂y, Hp= Hp, Hc= 1 )
579
+ @test info[:Ŷ ][end ] ≈ ry[1 ] atol= 5e-2
580
+ setmodel! (nmpc_lin; Mwt= [0 ], Lwt= [1 ])
581
+ u = moveinput! (nmpc_lin; R̂u= fill (ru[1 ], Hp))
582
+ @test u ≈ [4 ] atol= 5e-2
583
+ function JE (Ue, Ŷe, _ , p)
584
+ Wy, R̂y, Wu, R̂u = p
585
+ return Wy* sum ((R̂y- Ŷe[2 : end ]). ^ 2 ) + Wu* sum ((R̂u- Ue[1 : end - 1 ]). ^ 2 )
586
+ end
587
+ R̂y, R̂u = fill (ry[1 ], Hp), fill (ru[1 ], Hp)
588
+ p = [1 , R̂y, 0 , R̂u]
589
+ nmpc = NonLinMPC (linmodel, Mwt= [0 ], Nwt= [0 ], Cwt= Inf , Ewt= 1 , JE= JE, p= p, Hp= Hp, Hc= 1 )
583
590
preparestate! (nmpc, [10 ])
584
591
u = moveinput! (nmpc)
585
592
@test u ≈ [1 ] atol= 5e-2
586
593
# ensure that the current estimated output is updated for correct JE values:
587
594
@test nmpc. ŷ ≈ evaloutput (nmpc. estim, Float64[])
595
+ nmpc. p .= [0 , R̂y, 1 , R̂u]
596
+ u = moveinput! (nmpc)
597
+ @test u ≈ [4 ] atol= 5e-2
588
598
linmodel2 = LinModel ([tf (5 , [2000 , 1 ]) tf (7 , [8000 ,1 ])], 3000.0 , i_d= [2 ])
589
599
f = (x,u,d,_) -> linmodel2. A* x + linmodel2. Bu* u + linmodel2. Bd* d
590
600
h = (x,d,_) -> linmodel2. C* x + linmodel2. Dd* d
613
623
@test g_Y0min_end (20.0 , 10.0 ) ≤ 0.0
614
624
# test gfunc_i(i,::NTuple{N, ForwardDiff.Dual}) :
615
625
@test ForwardDiff. gradient (vec-> g_Y0min_end (vec... ), [20.0 , 10.0 ]) ≈ [- 5 , - 5 ] atol= 1e-3
616
- linmodel3 = LinModel {Float32} (0.5 * ones (1 ,1 ), ones (1 ,1 ), ones (1 ,1 ), zeros ( 1 , 0 ), zeros ( 1 , 0 ), 1 .0 )
626
+ linmodel3 = LinModel {Float32} (0.5 * ones (1 ,1 ), ones (1 ,1 ), ones (1 ,1 ), 0 , 0 , 3000 .0 )
617
627
nmpc6 = NonLinMPC (linmodel3, Hp= 10 )
618
628
preparestate! (nmpc6, [0 ])
619
629
@test moveinput! (nmpc6, [0 ]) ≈ [0.0 ]
0 commit comments