@@ -566,25 +566,35 @@ end
566566
567567@testset " NonLinMPC moves and getinfo" begin
568568 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 ]
571572 preparestate! (nmpc_lin, [10 ])
572- u = moveinput! (nmpc_lin, r )
573+ u = moveinput! (nmpc_lin, ry )
573574 @test u ≈ [1 ] atol= 5e-2
574- u = nmpc_lin (r )
575+ u = nmpc_lin (ry )
575576 @test u ≈ [1 ] atol= 5e-2
576577 info = getinfo (nmpc_lin)
577578 @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 )
583590 preparestate! (nmpc, [10 ])
584591 u = moveinput! (nmpc)
585592 @test u ≈ [1 ] atol= 5e-2
586593 # ensure that the current estimated output is updated for correct JE values:
587594 @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
588598 linmodel2 = LinModel ([tf (5 , [2000 , 1 ]) tf (7 , [8000 ,1 ])], 3000.0 , i_d= [2 ])
589599 f = (x,u,d,_) -> linmodel2. A* x + linmodel2. Bu* u + linmodel2. Bd* d
590600 h = (x,d,_) -> linmodel2. C* x + linmodel2. Dd* d
613623 @test g_Y0min_end (20.0 , 10.0 ) ≤ 0.0
614624 # test gfunc_i(i,::NTuple{N, ForwardDiff.Dual}) :
615625 @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 )
617627 nmpc6 = NonLinMPC (linmodel3, Hp= 10 )
618628 preparestate! (nmpc6, [0 ])
619629 @test moveinput! (nmpc6, [0 ]) ≈ [0.0 ]
0 commit comments