|
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