@@ -122,27 +122,32 @@ connections = [
122122
123123@named cl = System (connections, t, systems = [f, c, p])
124124
125- lsys0, ssys = linearize (cl, [f. u], [p. x])
126- desired_order = [f. x, p. x]
127- lsys = ModelingToolkit. reorder_unknowns (lsys0, unknowns (ssys), desired_order)
128- lsys1, ssys = linearize (cl, [f. u], [p. x]; autodiff = AutoFiniteDiff ())
129- lsys2 = ModelingToolkit. reorder_unknowns (lsys1, unknowns (ssys), desired_order)
125+ function compare_matrices (reference, value)
126+ @assert size (reference. A) == (2 , 2 ) " This testing function is only valid for `2x2` systems"
127+ @test isapprox (reference. C, value. C) || isapprox (reverse (reference. C), value. C)
128+ colorder = isapprox (reference. C, value. C) ? [1 , 2 ] : [2 , 1 ]
129+ @test isapprox (reference. B, value. B) || isapprox (reverse (reference. B), value. B)
130+ roworder = isapprox (reference. B, value. B) ? [1 , 2 ] : [2 , 1 ]
131+ @test isapprox (reference. D, value. D)
132+ @test isapprox (reference. A[roworder, colorder], value. A)
133+ end
134+ lsys, ssys = linearize (cl, [f. u], [p. x])
135+ lsys2, ssys = linearize (cl, [f. u], [p. x]; autodiff = AutoFiniteDiff ())
130136
131- @test lsys. A == lsys2. A == [- 2 0 ; 1 - 2 ]
132- @test lsys. B == lsys2. B == reshape ([1 , 0 ], 2 , 1 )
133- @test lsys. C == lsys2. C == [0 1 ]
134- @test lsys. D[] == lsys2. D[] == 0
137+ compare_matrices (lsys, lsys2)
138+ compare_matrices (lsys, (; A = [- 2 0 ; 1 - 2 ], B = reshape ([1 , 0 ], 2 , 1 ), C = [0 1 ], D = [0 ;;]))
135139
136140# # Symbolic linearization
137141lsyss_ns, ssys_ns = ModelingToolkit. linearize_symbolic (cl, [f. u], [p. x], split = false )
138142lsyss, ssys = ModelingToolkit. linearize_symbolic (cl, [f. u], [p. x])
139143@test isequal (lsyss. A, lsyss_ns. A)
140144
141- lsyss = ModelingToolkit. reorder_unknowns (lsyss, unknowns (ssys), [f. x, p. x])
142- @test value .(ModelingToolkit. fixpoint_sub (lsyss. A, ModelingToolkit. initial_conditions (cl))) == lsys. A
143- @test value .(ModelingToolkit. fixpoint_sub (lsyss. B, ModelingToolkit. initial_conditions (cl))) == lsys. B
144- @test value .(ModelingToolkit. fixpoint_sub (lsyss. C, ModelingToolkit. initial_conditions (cl))) == lsys. C
145- @test value .(ModelingToolkit. fixpoint_sub (lsyss. D, ModelingToolkit. initial_conditions (cl))) == lsys. D
145+ _substituter (M, sys) = value .(ModelingToolkit. fixpoint_sub (M, ModelingToolkit. initial_conditions_and_guesses (sys); fold = Val (true )))
146+ lsys_m = (;
147+ A = _substituter (lsyss. A, cl), B = _substituter (lsyss. B, cl),
148+ C = _substituter (lsyss. C, cl), D = _substituter (lsyss. D, cl)
149+ )
150+ compare_matrices (lsys, lsys_m)
146151# #
147152using ModelingToolkitStandardLibrary. Blocks: LimPID
148153k = 400
@@ -152,14 +157,12 @@ Nd = 10
152157@named pid = LimPID (; k, Ti, Td, Nd)
153158
154159@unpack reference, measurement, ctr_output = pid
155- lsys0 ,
160+ lsys ,
156161 ssys = linearize (
157162 pid, [reference. u, measurement. u], [ctr_output. u];
158163 op = Dict (reference. u => 0.0 , measurement. u => 0.0 )
159164)
160165@unpack int, der = pid
161- desired_order = [int. x, der. x]
162- lsys = ModelingToolkit. reorder_unknowns (lsys0, unknowns (ssys), desired_order)
163166
164167@test lsys. A == [0 0 ; 0 - 10 ]
165168@test lsys. B == [2 - 2 ; 10 - 10 ]
@@ -171,31 +174,14 @@ lsyss0,
171174 pid, [reference. u, measurement. u],
172175 [ctr_output. u]
173176)
174- lsyss = ModelingToolkit. reorder_unknowns (lsyss0, unknowns (ssys2), desired_order)
175-
176- @test value .(
177- ModelingToolkit. fixpoint_sub (
178- lsyss. A, ModelingToolkit. initial_conditions_and_guesses (pid); fold = Val (true )
179- )
180- ) == lsys. A
181- @test value .(
182- ModelingToolkit. fixpoint_sub (
183- lsyss. B, ModelingToolkit. initial_conditions_and_guesses (pid); fold = Val (true )
184- )
185- ) == lsys. B
186- @test value .(
187- ModelingToolkit. fixpoint_sub (
188- lsyss. C, ModelingToolkit. initial_conditions_and_guesses (pid); fold = Val (true )
189- )
190- ) == lsys. C
191- @test value .(
192- ModelingToolkit. fixpoint_sub (
193- lsyss. D, ModelingToolkit. initial_conditions_and_guesses (pid); fold = Val (true )
194- )
195- ) == lsys. D
177+ lsyss = (;
178+ A = _substituter (lsyss0. A, pid), B = _substituter (lsyss0. B, pid),
179+ C = _substituter (lsyss0. C, pid), D = _substituter (lsyss0. D, pid)
180+ )
181+ compare_matrices (lsys, lsyss)
196182
197183# Test with the reverse desired unknown order as well to verify that similarity transform and reoreder_unknowns really works
198- lsys = ModelingToolkit. reorder_unknowns (lsys, desired_order , reverse (desired_order ))
184+ lsys = ModelingToolkit. reorder_unknowns (lsys, unknowns (ssys) , reverse (unknowns (ssys) ))
199185
200186@test lsys. A == [- 10 0 ; 0 0 ]
201187@test lsys. B == [10 - 10 ; 2 - 2 ]
0 commit comments