|
65 | 65 | using .SetupMPCtests, ControlSystemsBase, LinearAlgebra |
66 | 66 | linmodel1 = setop!(LinModel(sys,Ts,i_u=[1,2]), uop=[10,50], yop=[50,30]) |
67 | 67 | skalmanfilter1 = SteadyKalmanFilter(linmodel1, nint_ym=[1, 1]) |
68 | | - preparestate!(skalmanfilter1, [50, 30]) |
69 | | - @test updatestate!(skalmanfilter1, [10, 50], [50, 30]) ≈ zeros(4) |
70 | | - preparestate!(skalmanfilter1, [50, 30]) |
71 | | - @test updatestate!(skalmanfilter1, [10, 50], [50, 30], Float64[]) ≈ zeros(4) |
| 68 | + u, y, d = [10, 50], [50, 30], Float64[] |
| 69 | + preparestate!(skalmanfilter1, y) |
| 70 | + @test updatestate!(skalmanfilter1, u, y) ≈ zeros(4) |
| 71 | + preparestate!(skalmanfilter1, y) |
| 72 | + @test updatestate!(skalmanfilter1, u, y, d) ≈ zeros(4) |
72 | 73 | @test skalmanfilter1.x̂0 ≈ zeros(4) |
| 74 | + @test @allocations(preparestate!(skalmanfilter1, y)) == 0 |
| 75 | + @test @allocations(updatestate!(skalmanfilter1, u, y)) == 0 |
73 | 76 | preparestate!(skalmanfilter1, [50, 30]) |
74 | 77 | @test evaloutput(skalmanfilter1) ≈ skalmanfilter1() ≈ [50, 30] |
75 | 78 | @test evaloutput(skalmanfilter1, Float64[]) ≈ skalmanfilter1(Float64[]) ≈ [50, 30] |
@@ -194,11 +197,14 @@ end |
194 | 197 | using .SetupMPCtests, ControlSystemsBase, LinearAlgebra |
195 | 198 | linmodel1 = setop!(LinModel(sys,Ts,i_u=[1,2]), uop=[10,50], yop=[50,30]) |
196 | 199 | kalmanfilter1 = KalmanFilter(linmodel1) |
197 | | - preparestate!(kalmanfilter1, [50, 30]) |
198 | | - @test updatestate!(kalmanfilter1, [10, 50], [50, 30]) ≈ zeros(4) |
199 | | - preparestate!(kalmanfilter1, [50, 30]) |
200 | | - @test updatestate!(kalmanfilter1, [10, 50], [50, 30], Float64[]) ≈ zeros(4) |
| 200 | + u, y, d = [10, 50], [50, 30], Float64[] |
| 201 | + preparestate!(kalmanfilter1, y) |
| 202 | + @test updatestate!(kalmanfilter1, u, y) ≈ zeros(4) |
| 203 | + preparestate!(kalmanfilter1, y) |
| 204 | + @test updatestate!(kalmanfilter1, u, y, d) ≈ zeros(4) |
201 | 205 | @test kalmanfilter1.x̂0 ≈ zeros(4) |
| 206 | + @test @allocations(preparestate!(kalmanfilter1, y)) == 0 |
| 207 | + @test @allocations(updatestate!(kalmanfilter1, u, y)) == 0 |
202 | 208 | preparestate!(kalmanfilter1, [50, 30]) |
203 | 209 | @test evaloutput(kalmanfilter1) ≈ kalmanfilter1() ≈ [50, 30] |
204 | 210 | @test evaloutput(kalmanfilter1, Float64[]) ≈ kalmanfilter1(Float64[]) ≈ [50, 30] |
@@ -311,11 +317,14 @@ end |
311 | 317 | using .SetupMPCtests, ControlSystemsBase, LinearAlgebra |
312 | 318 | linmodel1 = setop!(LinModel(sys,Ts,i_u=[1,2]), uop=[10,50], yop=[50,30]) |
313 | 319 | lo1 = Luenberger(linmodel1, nint_ym=[1, 1]) |
314 | | - preparestate!(lo1, [50, 30]) |
315 | | - @test updatestate!(lo1, [10, 50], [50, 30]) ≈ zeros(4) |
316 | | - preparestate!(lo1, [50, 30]) |
317 | | - @test updatestate!(lo1, [10, 50], [50, 30], Float64[]) ≈ zeros(4) |
| 320 | + u, y, d = [10, 50], [50, 30], Float64[] |
| 321 | + preparestate!(lo1, y) |
| 322 | + @test updatestate!(lo1, u, y) ≈ zeros(4) |
| 323 | + preparestate!(lo1, y) |
| 324 | + @test updatestate!(lo1, u, y, d) ≈ zeros(4) |
318 | 325 | @test lo1.x̂0 ≈ zeros(4) |
| 326 | + @test @allocations(preparestate!(lo1, y)) == 0 |
| 327 | + @test @allocations(updatestate!(lo1, u, y)) == 0 |
319 | 328 | preparestate!(lo1, [50, 30]) |
320 | 329 | @test evaloutput(lo1) ≈ lo1() ≈ [50, 30] |
321 | 330 | @test evaloutput(lo1, Float64[]) ≈ lo1(Float64[]) ≈ [50, 30] |
@@ -436,12 +445,15 @@ end |
436 | 445 | using .SetupMPCtests, ControlSystemsBase, LinearAlgebra |
437 | 446 | linmodel1 = setop!(LinModel(sys,Ts,i_u=[1,2]) , uop=[10,50], yop=[50,30]) |
438 | 447 | internalmodel1 = InternalModel(linmodel1) |
439 | | - preparestate!(internalmodel1, [50, 30] .+ 1) |
440 | | - @test updatestate!(internalmodel1, [10, 50], [50, 30] .+ 1) ≈ zeros(2) |
441 | | - preparestate!(internalmodel1, [50, 30] .+ 1) |
442 | | - @test updatestate!(internalmodel1, [10, 50], [50, 30] .+ 1, Float64[]) ≈ zeros(2) |
| 448 | + u, y, d = [10, 50], [50, 30] .+ 1, Float64[] |
| 449 | + preparestate!(internalmodel1, y) |
| 450 | + @test updatestate!(internalmodel1, u, y) ≈ zeros(2) |
| 451 | + preparestate!(internalmodel1, y) |
| 452 | + @test updatestate!(internalmodel1, u, y, d) ≈ zeros(2) |
443 | 453 | @test internalmodel1.x̂d ≈ internalmodel1.x̂0 ≈ zeros(2) |
444 | 454 | @test internalmodel1.x̂s ≈ ones(2) |
| 455 | + @test @allocations(preparestate!(internalmodel1, y)) == 0 |
| 456 | + @test @allocations(updatestate!(internalmodel1, u, y)) == 0 |
445 | 457 | preparestate!(internalmodel1, [51, 31]) |
446 | 458 | @test evaloutput(internalmodel1, Float64[]) ≈ [51,31] |
447 | 459 | @test initstate!(internalmodel1, [10, 50], [50, 30]) ≈ zeros(2) |
@@ -557,16 +569,26 @@ end |
557 | 569 | @testitem "UnscentedKalmanFilter estimator methods" setup=[SetupMPCtests] begin |
558 | 570 | using .SetupMPCtests, ControlSystemsBase, LinearAlgebra |
559 | 571 | linmodel1 = LinModel(sys,Ts,i_u=[1,2]) |
560 | | - f(x,u,_,model) = model.A*x + model.Bu*u |
561 | | - h(x,_,model) = model.C*x |
562 | | - nonlinmodel = NonLinModel(f, h, Ts, 2, 2, 2, solver=nothing, p=linmodel1) |
| 572 | + function f!(xnext, x,u,_,model) |
| 573 | + mul!(xnext, model.A, x) |
| 574 | + mul!(xnext, model.Bu, u, 1, 1) |
| 575 | + return nothing |
| 576 | + end |
| 577 | + function h!(y, x,_,model) |
| 578 | + mul!(y, model.C, x) |
| 579 | + return nothing |
| 580 | + end |
| 581 | + nonlinmodel = NonLinModel(f!, h!, Ts, 2, 2, 2, solver=nothing, p=linmodel1) |
563 | 582 | nonlinmodel = setop!(nonlinmodel, uop=[10,50], yop=[50,30]) |
564 | 583 | ukf1 = UnscentedKalmanFilter(nonlinmodel) |
565 | | - preparestate!(ukf1, [50, 30]) |
566 | | - @test updatestate!(ukf1, [10, 50], [50, 30]) ≈ zeros(4) atol=1e-9 |
567 | | - preparestate!(ukf1, [50, 30]) |
568 | | - @test updatestate!(ukf1, [10, 50], [50, 30], Float64[]) ≈ zeros(4) atol=1e-9 |
| 584 | + u, y, d = [10, 50], [50, 30], Float64[] |
| 585 | + preparestate!(ukf1, y) |
| 586 | + @test updatestate!(ukf1, u, y) ≈ zeros(4) atol=1e-9 |
| 587 | + preparestate!(ukf1, y) |
| 588 | + @test updatestate!(ukf1, u, y, d) ≈ zeros(4) atol=1e-9 |
569 | 589 | @test ukf1.x̂0 ≈ zeros(4) atol=1e-9 |
| 590 | + @test @allocations(preparestate!(ukf1, y)) == 0 |
| 591 | + @test @allocations(updatestate!(ukf1, u, y)) == 0 |
570 | 592 | preparestate!(ukf1, [50, 30]) |
571 | 593 | @test evaloutput(ukf1) ≈ ukf1() ≈ [50, 30] |
572 | 594 | @test evaloutput(ukf1, Float64[]) ≈ ukf1(Float64[]) ≈ [50, 30] |
@@ -705,16 +727,26 @@ end |
705 | 727 | using DifferentiationInterface |
706 | 728 | import FiniteDiff |
707 | 729 | linmodel1 = LinModel(sys,Ts,i_u=[1,2]) |
708 | | - f(x,u,_,model) = model.A*x + model.Bu*u |
709 | | - h(x,_,model) = model.C*x |
710 | | - nonlinmodel = NonLinModel(f, h, Ts, 2, 2, 2, solver=nothing, p=linmodel1) |
| 730 | + function f!(xnext, x,u,_,model) |
| 731 | + mul!(xnext, model.A, x) |
| 732 | + mul!(xnext, model.Bu, u, 1, 1) |
| 733 | + return nothing |
| 734 | + end |
| 735 | + function h!(y, x,_,model) |
| 736 | + mul!(y, model.C, x) |
| 737 | + return nothing |
| 738 | + end |
| 739 | + nonlinmodel = NonLinModel(f!, h!, Ts, 2, 2, 2, solver=nothing, p=linmodel1) |
711 | 740 | nonlinmodel = setop!(nonlinmodel, uop=[10,50], yop=[50,30]) |
712 | 741 | ekf1 = ExtendedKalmanFilter(nonlinmodel) |
713 | | - preparestate!(ekf1, [50, 30]) |
714 | | - @test updatestate!(ekf1, [10, 50], [50, 30]) ≈ zeros(4) atol=1e-9 |
715 | | - preparestate!(ekf1, [50, 30]) |
716 | | - @test updatestate!(ekf1, [10, 50], [50, 30], Float64[]) ≈ zeros(4) atol=1e-9 |
| 742 | + u, y, d = [10, 50], [50, 30], Float64[] |
| 743 | + preparestate!(ekf1, y) |
| 744 | + @test updatestate!(ekf1, u, y) ≈ zeros(4) atol=1e-9 |
| 745 | + preparestate!(ekf1, y) |
| 746 | + @test updatestate!(ekf1, u, y, d) ≈ zeros(4) atol=1e-9 |
717 | 747 | @test ekf1.x̂0 ≈ zeros(4) atol=1e-9 |
| 748 | + @test @allocations(preparestate!(ekf1, y)) == 0 |
| 749 | + @test @allocations(updatestate!(ekf1, u, y)) == 0 |
718 | 750 | preparestate!(ekf1, [50, 30]) |
719 | 751 | @test evaloutput(ekf1) ≈ ekf1() ≈ [50, 30] |
720 | 752 | @test evaloutput(ekf1, Float64[]) ≈ ekf1(Float64[]) ≈ [50, 30] |
|
0 commit comments