@@ -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,11 +114,11 @@ 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 ]
@@ -151,17 +148,17 @@ lsys = ModelingToolkit.reorder_unknowns(lsys, desired_order, reverse(desired_ord
151148
152149# # Test that there is a warning when input is misspecified
153150if VERSION >= v " 1.8"
154- @test_throws " Some specified inputs were not found in system. The following variables were not found " structural_simplify (pid, inputs =
151+ @test_throws " Some specified inputs were not found" linearize (pid,
155152 [
156153 pid. reference. u,
157154 pid. measurement. u
158- ], outputs = [ctr_output. u])
159- @test_throws " Some specified outputs were not found in system. " structural_simplify (pid,
160- inputs = [
155+ ], [ctr_output. u])
156+ @test_throws " Some specified outputs were not found" linearize (pid,
157+ [
161158 reference. u,
162159 measurement. u
163160 ],
164- outputs = [pid. ctr_output. u])
161+ [pid. ctr_output. u])
165162else # v1.6 does not have the feature to match error message
166163 @test_throws ErrorException linearize (pid,
167164 [
@@ -187,23 +184,22 @@ function saturation(; y_max, y_min = y_max > 0 ? -y_max : -Inf, name)
187184 ODESystem (eqs, t, name = name)
188185end
189186@named sat = saturation (; y_max = 1 )
190- sat = structural_simplify (sat, inputs = [u], outputs = [y])
191187# inside the linear region, the function is identity
192188@unpack u, y = sat
193- lsys = linearize (sat, [u], [y])
189+ lsys, ssys = linearize (sat, [u], [y])
194190@test isempty (lsys. A) # there are no differential variables in this system
195191@test isempty (lsys. B)
196192@test isempty (lsys. C)
197193@test lsys. D[] == 1
198194
199- @test_skip lsyss = ModelingToolkit. linearize_symbolic (sat, [u], [y]) # Code gen replaces ifelse with if statements causing symbolic evaluation to fail
195+ @test_skip lsyss, _ = ModelingToolkit. linearize_symbolic (sat, [u], [y]) # Code gen replaces ifelse with if statements causing symbolic evaluation to fail
200196# @test substitute(lsyss.A, ModelingToolkit.defaults(sat)) == lsys.A
201197# @test substitute(lsyss.B, ModelingToolkit.defaults(sat)) == lsys.B
202198# @test substitute(lsyss.C, ModelingToolkit.defaults(sat)) == lsys.C
203199# @test substitute(lsyss.D, ModelingToolkit.defaults(sat)) == lsys.D
204200
205201# outside the linear region the derivative is 0
206- lsys = linearize (sat, [u], [y]; op = Dict (u => 2 ))
202+ lsys, ssys = linearize (sat, [u], [y]; op = Dict (u => 2 ))
207203@test isempty (lsys. A) # there are no differential variables in this system
208204@test isempty (lsys. B)
209205@test isempty (lsys. C)
@@ -270,8 +266,7 @@ closed_loop = ODESystem(connections, t, systems = [model, pid, filt, sensor, r,
270266 filt. xd => 0.0
271267 ])
272268
273- closed_loop = structural_simplify (closed_loop, inputs = :r , outputs = :y )
274- linearize (closed_loop; warn_empty_op = false )
269+ @test_nowarn linearize (closed_loop, :r , :y ; warn_empty_op = false )
275270
276271# https://discourse.julialang.org/t/mtk-change-in-linearize/115760/3
277272@mtkmodel Tank_noi begin
301296
302297@named tank_noi = Tank_noi ()
303298@unpack md_i, h, m = tank_noi
304- tank_noi = structural_simplify (tank_noi, inputs = [md_i], outputs = [h])
305299m_ss = 2.4000000003229878
306300@test_nowarn linearize (tank_noi, [md_i], [h]; op = Dict (m => m_ss, md_i => 2 ))
307301
@@ -310,14 +304,13 @@ m_ss = 2.4000000003229878
310304@parameters p = 1.0
311305eqs = [D (x) ~ p * u, x ~ y]
312306@named sys = ODESystem (eqs, t)
313- sys = structural_simplify (sys, inputs = [u])
314307
315- matrices1 = linearize (sys, [u], []; op = Dict (x => 2.0 ))
316- matrices2 = linearize (sys, [u], []; op = Dict (y => 2.0 ))
308+ matrices1, _ = linearize (sys, [u], []; op = Dict (x => 2.0 ))
309+ matrices2, _ = linearize (sys, [u], []; op = Dict (y => 2.0 ))
317310@test matrices1 == matrices2
318311
319312# Ensure parameter values passed as `Dict` are respected
320- linfun = linearization_function (sys, [u], []; op = Dict (x => 2.0 ))
313+ linfun, _ = linearization_function (sys, [u], []; op = Dict (x => 2.0 ))
321314matrices = linfun ([1.0 ], Dict (p => 3.0 ), 1.0 )
322315# this would be 1 if the parameter value isn't respected
323316@test matrices. f_u[] == 3.0
@@ -333,28 +326,26 @@ end
333326 @parameters p
334327 eqs = [0 ~ x * log (y) - p]
335328 @named sys = ODESystem (eqs, t; defaults = [p => 1.0 ])
336- sys = structural_simplify (sys, inputs = [x] )
329+ sys = complete (sys)
337330 @test_throws ModelingToolkit. MissingVariablesError linearize (
338- sys; op = Dict (x => 1.0 ), allow_input_derivatives = true )
331+ sys, [x], [] ; op = Dict (x => 1.0 ), allow_input_derivatives = true )
339332 @test_nowarn linearize (
340- sys; op = Dict (x => 1.0 ), guesses = Dict (y => 1.0 ),
333+ sys, [x], [] ; op = Dict (x => 1.0 ), guesses = Dict (y => 1.0 ),
341334 allow_input_derivatives = true )
342335end
343336
344337@testset " Symbolic values for parameters in `linearize`" begin
345338 @named tank_noi = Tank_noi ()
346339 @unpack md_i, h, m, ρ, A, K = tank_noi
347- tank_noi = structural_simplify (tank_noi, inputs = [md_i], outputs = [h])
348340 m_ss = 2.4000000003229878
349341 @test_nowarn linearize (
350- tank_noi; op = Dict (m => m_ss, md_i => 2 , ρ => A / K, A => 5 ))
342+ tank_noi, [md_i], [h] ; op = Dict (m => m_ss, md_i => 2 , ρ => A / K, A => 5 ))
351343end
352344
353345@testset " Warn on empty operating point" begin
354346 @named tank_noi = Tank_noi ()
355347 @unpack md_i, h, m = tank_noi
356- tank_noi = structural_simplify (tank_noi, inputs = [md_i], outputs = [h])
357348 m_ss = 2.4000000003229878
358349 @test_warn [" empty operating point" , " warn_empty_op" ] linearize (
359- tank_noi; p = [md_i => 1.0 ])
350+ tank_noi, [md_i], [h] ; p = [md_i => 1.0 ])
360351end
0 commit comments