@@ -13,27 +13,25 @@ eqs = [u ~ kp * (r - y)
1313 y ~ x]
1414
1515@named sys = ODESystem (eqs, t)
16- sys1 = structural_simplify (sys, inputs = [r], outputs = [y])
1716
18- lsys = linearize (sys1 )
19- lprob = LinearizationProblem (sys1 )
17+ lsys, ssys = linearize (sys, [r], [y] )
18+ lprob = LinearizationProblem (sys, [r], [y] )
2019lsys2 = solve (lprob)
21- lsys3 = linearize (sys1 ; autodiff = AutoFiniteDiff ())
20+ lsys3, _ = linearize (sys, [r], [y] ; autodiff = AutoFiniteDiff ())
2221
2322@test lsys. A[] == lsys2. A[] == lsys3. A[] == - 2
2423@test lsys. B[] == lsys2. B[] == lsys3. B[] == 1
2524@test lsys. C[] == lsys2. C[] == lsys3. C[] == 1
2625@test lsys. D[] == lsys2. D[] == lsys3. D[] == 0
2726
28- sys2 = structural_simplify (sys, inputs = [r], outputs = [r])
29- lsys = linearize (sys2)
27+ lsys, ssys = linearize (sys, [r], [r])
3028
3129@test lsys. A[] == - 2
3230@test lsys. B[] == 1
3331@test lsys. C[] == 0
3432@test lsys. D[] == 1
3533
36- lsys = linearize (sys2 , r, r) # Test allow scalars
34+ lsys, ssys = linearize (sys , r, r) # Test allow scalars
3735
3836@test lsys. A[] == - 2
3937@test lsys. B[] == 1
@@ -88,21 +86,20 @@ connections = [f.y ~ c.r # filtered reference to controller reference
8886 p. y ~ c. y]
8987
9088@named cl = ODESystem (connections, t, systems = [f, c, p])
91- cl = structural_simplify (cl, inputs = [f. u], outputs = [p. x])
9289
93- lsys0 = linearize (cl)
90+ lsys0, ssys = linearize (cl, [f . u], [p . x] )
9491desired_order = [f. x, p. x]
95- lsys = ModelingToolkit. reorder_unknowns (lsys0, unknowns (cl ), desired_order)
96- lsys1 = linearize (cl, [f. u], [p. x]; autodiff = AutoFiniteDiff ())
97- lsys2 = ModelingToolkit. reorder_unknowns (lsys1, unknowns (cl ), desired_order)
92+ lsys = ModelingToolkit. reorder_unknowns (lsys0, unknowns (ssys ), desired_order)
93+ lsys1, ssys = linearize (cl, [f. u], [p. x]; autodiff = AutoFiniteDiff ())
94+ lsys2 = ModelingToolkit. reorder_unknowns (lsys1, unknowns (ssys ), desired_order)
9895
9996@test lsys. A == lsys2. A == [- 2 0 ; 1 - 2 ]
10097@test lsys. B == lsys2. B == reshape ([1 , 0 ], 2 , 1 )
10198@test lsys. C == lsys2. C == [0 1 ]
10299@test lsys. D[] == lsys2. D[] == 0
103100
104101# # Symbolic linearization
105- lsyss = ModelingToolkit. linearize_symbolic (cl)
102+ lsyss, _ = ModelingToolkit. linearize_symbolic (cl, [f . u], [p . x] )
106103
107104@test ModelingToolkit. fixpoint_sub (lsyss. A, ModelingToolkit. defaults (cl)) == lsys. A
108105@test ModelingToolkit. fixpoint_sub (lsyss. B, ModelingToolkit. defaults (cl)) == lsys. B
@@ -117,18 +114,18 @@ Nd = 10
117114@named pid = LimPID (; k, Ti, Td, Nd)
118115
119116@unpack reference, measurement, ctr_output = pid
120- pid_s = structural_simplify (pid, inputs = [reference. u, measurement. u], outputs = [ctr_output. u])
121- lsys0 = linearize (pid_s; op = Dict (reference. u => 0.0 , measurement. u => 0.0 ))
122- @unpack int, der = pid_s
117+ lsys0, ssys = linearize (pid, [reference. u, measurement. u], [ctr_output. u];
118+ op = Dict (reference. u => 0.0 , measurement. u => 0.0 ))
119+ @unpack int, der = pid
123120desired_order = [int. x, der. x]
124- lsys = ModelingToolkit. reorder_unknowns (lsys0, unknowns (pid_s ), desired_order)
121+ lsys = ModelingToolkit. reorder_unknowns (lsys0, unknowns (ssys ), desired_order)
125122
126123@test lsys. A == [0 0 ; 0 - 10 ]
127124@test lsys. B == [2 - 2 ; 10 - 10 ]
128125@test lsys. C == [400 - 4000 ]
129126@test lsys. D == [4400 - 4400 ]
130127
131- lsyss = ModelingToolkit. linearize_symbolic (pid_s , [reference. u, measurement. u],
128+ lsyss, _ = ModelingToolkit. linearize_symbolic (pid , [reference. u, measurement. u],
132129 [ctr_output. u])
133130
134131@test ModelingToolkit. fixpoint_sub (
@@ -141,7 +138,7 @@ lsyss = ModelingToolkit.linearize_symbolic(pid_s, [reference.u, measurement.u],
141138 lsyss. D, ModelingToolkit. defaults_and_guesses (pid)) == lsys. D
142139
143140# Test with the reverse desired unknown order as well to verify that similarity transform and reoreder_unknowns really works
144- lsys = ModelingToolkit. reorder_unknowns (lsys, unknowns (pid_s ), reverse (desired_order))
141+ lsys = ModelingToolkit. reorder_unknowns (lsys, unknowns (ssys ), reverse (desired_order))
145142
146143@test lsys. A == [- 10 0 ; 0 0 ]
147144@test lsys. B == [10 - 10 ; 2 - 2 ]
@@ -150,17 +147,17 @@ lsys = ModelingToolkit.reorder_unknowns(lsys, unknowns(pid_s), reverse(desired_o
150147
151148# # Test that there is a warning when input is misspecified
152149if VERSION >= v " 1.8"
153- @test_throws " Some specified inputs were not found in system. The following variables were not found " structural_simplify (pid, inputs =
150+ @test_throws " Some specified inputs were not found" linearize (pid,
154151 [
155152 pid. reference. u,
156153 pid. measurement. u
157- ], outputs = [ctr_output. u])
158- @test_throws " Some specified outputs were not found in system. " structural_simplify (pid,
159- inputs = [
154+ ], [ctr_output. u])
155+ @test_throws " Some specified outputs were not found" linearize (pid,
156+ [
160157 reference. u,
161158 measurement. u
162159 ],
163- outputs = [pid. ctr_output. u])
160+ [pid. ctr_output. u])
164161else # v1.6 does not have the feature to match error message
165162 @test_throws ErrorException linearize (pid,
166163 [
@@ -186,23 +183,22 @@ function saturation(; y_max, y_min = y_max > 0 ? -y_max : -Inf, name)
186183 ODESystem (eqs, t, name = name)
187184end
188185@named sat = saturation (; y_max = 1 )
189- sat = structural_simplify (sat, inputs = [u], outputs = [y])
190186# inside the linear region, the function is identity
191187@unpack u, y = sat
192- lsys = linearize (sat, [u], [y])
188+ lsys, ssys = linearize (sat, [u], [y])
193189@test isempty (lsys. A) # there are no differential variables in this system
194190@test isempty (lsys. B)
195191@test isempty (lsys. C)
196192@test lsys. D[] == 1
197193
198- @test_skip lsyss = ModelingToolkit. linearize_symbolic (sat, [u], [y]) # Code gen replaces ifelse with if statements causing symbolic evaluation to fail
194+ @test_skip lsyss, _ = ModelingToolkit. linearize_symbolic (sat, [u], [y]) # Code gen replaces ifelse with if statements causing symbolic evaluation to fail
199195# @test substitute(lsyss.A, ModelingToolkit.defaults(sat)) == lsys.A
200196# @test substitute(lsyss.B, ModelingToolkit.defaults(sat)) == lsys.B
201197# @test substitute(lsyss.C, ModelingToolkit.defaults(sat)) == lsys.C
202198# @test substitute(lsyss.D, ModelingToolkit.defaults(sat)) == lsys.D
203199
204200# outside the linear region the derivative is 0
205- lsys = linearize (sat, [u], [y]; op = Dict (u => 2 ))
201+ lsys, ssys = linearize (sat, [u], [y]; op = Dict (u => 2 ))
206202@test isempty (lsys. A) # there are no differential variables in this system
207203@test isempty (lsys. B)
208204@test isempty (lsys. C)
@@ -269,8 +265,7 @@ closed_loop = ODESystem(connections, t, systems = [model, pid, filt, sensor, r,
269265 filt. xd => 0.0
270266 ])
271267
272- closed_loop = structural_simplify (closed_loop, inputs = :r , outputs = :y )
273- linearize (closed_loop; warn_empty_op = false )
268+ @test_nowarn linearize (closed_loop, :r , :y ; warn_empty_op = false )
274269
275270# https://discourse.julialang.org/t/mtk-change-in-linearize/115760/3
276271@mtkmodel Tank_noi begin
300295
301296@named tank_noi = Tank_noi ()
302297@unpack md_i, h, m = tank_noi
303- tank_noi = structural_simplify (tank_noi, inputs = [md_i], outputs = [h])
304298m_ss = 2.4000000003229878
305299@test_nowarn linearize (tank_noi, [md_i], [h]; op = Dict (m => m_ss, md_i => 2 ))
306300
@@ -309,14 +303,13 @@ m_ss = 2.4000000003229878
309303@parameters p = 1.0
310304eqs = [D (x) ~ p * u, x ~ y]
311305@named sys = ODESystem (eqs, t)
312- sys = structural_simplify (sys, inputs = [u])
313306
314- matrices1 = linearize (sys, [u], []; op = Dict (x => 2.0 ))
315- matrices2 = linearize (sys, [u], []; op = Dict (y => 2.0 ))
307+ matrices1, _ = linearize (sys, [u], []; op = Dict (x => 2.0 ))
308+ matrices2, _ = linearize (sys, [u], []; op = Dict (y => 2.0 ))
316309@test matrices1 == matrices2
317310
318311# Ensure parameter values passed as `Dict` are respected
319- linfun = linearization_function (sys, [u], []; op = Dict (x => 2.0 ))
312+ linfun, _ = linearization_function (sys, [u], []; op = Dict (x => 2.0 ))
320313matrices = linfun ([1.0 ], Dict (p => 3.0 ), 1.0 )
321314# this would be 1 if the parameter value isn't respected
322315@test matrices. f_u[] == 3.0
@@ -332,28 +325,26 @@ end
332325 @parameters p
333326 eqs = [0 ~ x * log (y) - p]
334327 @named sys = ODESystem (eqs, t; defaults = [p => 1.0 ])
335- sys = structural_simplify (sys, inputs = [x] )
328+ sys = complete (sys)
336329 @test_throws ModelingToolkit. MissingVariablesError linearize (
337- sys; op = Dict (x => 1.0 ), allow_input_derivatives = true )
330+ sys, [x], [] ; op = Dict (x => 1.0 ), allow_input_derivatives = true )
338331 @test_nowarn linearize (
339- sys; op = Dict (x => 1.0 ), guesses = Dict (y => 1.0 ),
332+ sys, [x], [] ; op = Dict (x => 1.0 ), guesses = Dict (y => 1.0 ),
340333 allow_input_derivatives = true )
341334end
342335
343336@testset " Symbolic values for parameters in `linearize`" begin
344337 @named tank_noi = Tank_noi ()
345338 @unpack md_i, h, m, ρ, A, K = tank_noi
346- tank_noi = structural_simplify (tank_noi, inputs = [md_i], outputs = [h])
347339 m_ss = 2.4000000003229878
348340 @test_nowarn linearize (
349- tank_noi; op = Dict (m => m_ss, md_i => 2 , ρ => A / K, A => 5 ))
341+ tank_noi, [md_i], [h] ; op = Dict (m => m_ss, md_i => 2 , ρ => A / K, A => 5 ))
350342end
351343
352344@testset " Warn on empty operating point" begin
353345 @named tank_noi = Tank_noi ()
354346 @unpack md_i, h, m = tank_noi
355- tank_noi = structural_simplify (tank_noi, inputs = [md_i], outputs = [h])
356347 m_ss = 2.4000000003229878
357348 @test_warn [" empty operating point" , " warn_empty_op" ] linearize (
358- tank_noi; p = [md_i => 1.0 ])
349+ tank_noi, [md_i], [h] ; p = [md_i => 1.0 ])
359350end
0 commit comments