@@ -13,18 +13,20 @@ eqs = [u ~ kp * (r - y)
1313 y ~ x]
1414
1515@named sys = ODESystem (eqs, t)
16+ sys1 = structural_simplify (sys, inputs = [r], outputs = [y])
1617
17- lsys, ssys = linearize (sys, [r], [y] )
18- lprob = LinearizationProblem (sys, [r], [y] )
18+ lsys = linearize (sys1 )
19+ lprob = LinearizationProblem (sys1 )
1920lsys2 = solve (lprob)
20- lsys3, _ = linearize (sys, [r], [y] ; autodiff = AutoFiniteDiff ())
21+ lsys3 = linearize (sys1 ; autodiff = AutoFiniteDiff ())
2122
2223@test lsys. A[] == lsys2. A[] == lsys3. A[] == - 2
2324@test lsys. B[] == lsys2. B[] == lsys3. B[] == 1
2425@test lsys. C[] == lsys2. C[] == lsys3. C[] == 1
2526@test lsys. D[] == lsys2. D[] == lsys3. D[] == 0
2627
27- lsys = linearize (sys, [r], [r])
28+ sys2 = structural_simplify (sys, inputs = [r], outputs = [r])
29+ lsys = linearize (sys2)
2830
2931@test lsys. A[] == - 2
3032@test lsys. B[] == 1
@@ -86,8 +88,9 @@ connections = [f.y ~ c.r # filtered reference to controller reference
8688 p. y ~ c. y]
8789
8890@named cl = ODESystem (connections, t, systems = [f, c, p])
91+ cl = structural_simplify (cl, inputs = [f. u], outputs = [p. x])
8992
90- lsys0 = linearize (cl, [f . u], [p . x] )
93+ lsys0 = linearize (cl)
9194desired_order = [f. x, p. x]
9295lsys = ModelingToolkit. reorder_unknowns (lsys0, unknowns (cl), desired_order)
9396lsys1 = linearize (cl, [f. u], [p. x]; autodiff = AutoFiniteDiff ())
@@ -99,7 +102,7 @@ lsys2 = ModelingToolkit.reorder_unknowns(lsys1, unknowns(cl), desired_order)
99102@test lsys. D[] == lsys2. D[] == 0
100103
101104# # Symbolic linearization
102- lsyss = ModelingToolkit. linearize_symbolic (cl, [f . u], [p . x] )
105+ lsyss = ModelingToolkit. linearize_symbolic (cl)
103106
104107@test ModelingToolkit. fixpoint_sub (lsyss. A, ModelingToolkit. defaults (cl)) == lsys. A
105108@test ModelingToolkit. fixpoint_sub (lsyss. B, ModelingToolkit. defaults (cl)) == lsys. B
@@ -114,12 +117,11 @@ Nd = 10
114117@named pid = LimPID (; k, Ti, Td, Nd)
115118
116119@unpack reference, measurement, ctr_output = pid
117- pid = structural_simplify (pid, inputs = [reference. u, measurement. u], outputs = [ctr_output. u])
118- lsys0 = linearize (pid, [reference. u, measurement. u], [ctr_output. u];
119- op = Dict (reference. u => 0.0 , measurement. u => 0.0 ))
120- @unpack int, der = 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
121123desired_order = [int. x, der. x]
122- lsys = ModelingToolkit. reorder_unknowns (lsys0, unknowns (pid ), desired_order)
124+ lsys = ModelingToolkit. reorder_unknowns (lsys0, unknowns (pid_s ), desired_order)
123125
124126@test lsys. A == [0 0 ; 0 - 10 ]
125127@test lsys. B == [2 - 2 ; 10 - 10 ]
@@ -149,17 +151,17 @@ lsys = ModelingToolkit.reorder_unknowns(lsys, desired_order, reverse(desired_ord
149151
150152# # Test that there is a warning when input is misspecified
151153if VERSION >= v " 1.8"
152- @test_throws " Some parameters are missing from the variable map. " linearize (pid,
154+ @test_throws " Some specified inputs were not found in system. The following variables were not found " structural_simplify (pid, inputs =
153155 [
154156 pid. reference. u,
155157 pid. measurement. u
156- ], [ctr_output. u])
157- @test_throws " Some parameters are missing from the variable map ." linearize (pid,
158- [
158+ ], outputs = [ctr_output. u])
159+ @test_throws " Some specified outputs were not found in system ." structural_simplify (pid,
160+ inputs = [
159161 reference. u,
160162 measurement. u
161163 ],
162- [pid. ctr_output. u])
164+ outputs = [pid. ctr_output. u])
163165else # v1.6 does not have the feature to match error message
164166 @test_throws ErrorException linearize (pid,
165167 [
@@ -201,7 +203,7 @@ lsys = linearize(sat, [u], [y])
201203# @test substitute(lsyss.D, ModelingToolkit.defaults(sat)) == lsys.D
202204
203205# outside the linear region the derivative is 0
204- lsys, ssys = linearize (sat, [u], [y]; op = Dict (u => 2 ))
206+ lsys = linearize (sat, [u], [y]; op = Dict (u => 2 ))
205207@test isempty (lsys. A) # there are no differential variables in this system
206208@test isempty (lsys. B)
207209@test isempty (lsys. C)
@@ -307,12 +309,12 @@ m_ss = 2.4000000003229878
307309eqs = [D (x) ~ p * u, x ~ y]
308310@named sys = ODESystem (eqs, t)
309311
310- matrices1, _ = linearize (sys, [u], []; op = Dict (x => 2.0 ))
311- matrices2, _ = linearize (sys, [u], []; op = Dict (y => 2.0 ))
312+ matrices1 = linearize (sys, [u], []; op = Dict (x => 2.0 ))
313+ matrices2 = linearize (sys, [u], []; op = Dict (y => 2.0 ))
312314@test matrices1 == matrices2
313315
314316# Ensure parameter values passed as `Dict` are respected
315- linfun, _ = linearization_function (sys, [u], []; op = Dict (x => 2.0 ))
317+ linfun = linearization_function (sys, [u], []; op = Dict (x => 2.0 ))
316318matrices = linfun ([1.0 ], Dict (p => 3.0 ), 1.0 )
317319# this would be 1 if the parameter value isn't respected
318320@test matrices. f_u[] == 3.0
@@ -328,26 +330,28 @@ end
328330 @parameters p
329331 eqs = [0 ~ x * log (y) - p]
330332 @named sys = ODESystem (eqs, t; defaults = [p => 1.0 ])
331- sys = complete (sys)
333+ sys = structural_simplify (sys, inputs = [x] )
332334 @test_throws ModelingToolkit. MissingVariablesError linearize (
333- sys, [x], [] ; op = Dict (x => 1.0 ), allow_input_derivatives = true )
335+ sys; op = Dict (x => 1.0 ), allow_input_derivatives = true )
334336 @test_nowarn linearize (
335- sys, [x], [] ; op = Dict (x => 1.0 ), guesses = Dict (y => 1.0 ),
337+ sys; op = Dict (x => 1.0 ), guesses = Dict (y => 1.0 ),
336338 allow_input_derivatives = true )
337339end
338340
339341@testset " Symbolic values for parameters in `linearize`" begin
340342 @named tank_noi = Tank_noi ()
341343 @unpack md_i, h, m, ρ, A, K = tank_noi
344+ tank_noi = structural_simplify (tank_noi, inputs = [md_i], outputs = [h])
342345 m_ss = 2.4000000003229878
343346 @test_nowarn linearize (
344- tank_noi, [md_i], [h] ; op = Dict (m => m_ss, md_i => 2 , ρ => A / K, A => 5 ))
347+ tank_noi; op = Dict (m => m_ss, md_i => 2 , ρ => A / K, A => 5 ))
345348end
346349
347350@testset " Warn on empty operating point" begin
348351 @named tank_noi = Tank_noi ()
349352 @unpack md_i, h, m = tank_noi
353+ tank_noi = structural_simplify (tank_noi, inputs = [md_i], outputs = [h])
350354 m_ss = 2.4000000003229878
351355 @test_warn [" empty operating point" , " warn_empty_op" ] linearize (
352- tank_noi, [md_i], [h] ; p = [md_i => 1.0 ])
356+ tank_noi; p = [md_i => 1.0 ])
353357end
0 commit comments