@@ -68,15 +68,22 @@ connections = [f.y ~ c.r # filtered reference to controller reference
68
68
69
69
@named cl = ODESystem (connections, t, systems = [f, c, p])
70
70
71
- lsys , ssys = linearize (cl, [f. u], [p. x])
71
+ lsys0 , ssys = linearize (cl, [f. u], [p. x])
72
72
desired_order = [f. x, p. x]
73
- lsys = ModelingToolkit. reorder_states (lsys , states (ssys), desired_order)
73
+ lsys = ModelingToolkit. reorder_states (lsys0 , states (ssys), desired_order)
74
74
75
75
@test lsys. A == [- 2 0 ; 1 - 2 ]
76
76
@test lsys. B == reshape ([1 , 0 ], 2 , 1 )
77
77
@test lsys. C == [0 1 ]
78
78
@test lsys. D[] == 0
79
79
80
+ # # Symbolic linearization
81
+ lsyss, _ = ModelingToolkit. linearize_symbolic (cl, [f. u], [p. x])
82
+
83
+ @test substitute (lsyss. A, ModelingToolkit. defaults (cl)) == lsys. A
84
+ @test substitute (lsyss. B, ModelingToolkit. defaults (cl)) == lsys. B
85
+ @test substitute (lsyss. C, ModelingToolkit. defaults (cl)) == lsys. C
86
+ @test substitute (lsyss. D, ModelingToolkit. defaults (cl)) == lsys. D
80
87
# #
81
88
using ModelingToolkitStandardLibrary. Blocks: LimPID
82
89
k = 400
@@ -86,16 +93,24 @@ Nd = 10
86
93
@named pid = LimPID (; k, Ti, Td, Nd)
87
94
88
95
@unpack reference, measurement, ctr_output = pid
89
- lsys , ssys = linearize (pid, [reference. u, measurement. u], [ctr_output. u])
96
+ lsys0 , ssys = linearize (pid, [reference. u, measurement. u], [ctr_output. u])
90
97
@unpack int, der = pid
91
98
desired_order = [int. x, der. x]
92
- lsys = ModelingToolkit. reorder_states (lsys , states (ssys), desired_order)
99
+ lsys = ModelingToolkit. reorder_states (lsys0 , states (ssys), desired_order)
93
100
94
101
@test lsys. A == [0 0 ; 0 - 10 ]
95
102
@test lsys. B == [2 - 2 ; 10 - 10 ]
96
103
@test lsys. C == [400 - 4000 ]
97
104
@test lsys. D == [4400 - 4400 ]
98
105
106
+ lsyss, _ = ModelingToolkit. linearize_symbolic (pid, [reference. u, measurement. u],
107
+ [ctr_output. u])
108
+
109
+ @test substitute (lsyss. A, ModelingToolkit. defaults (pid)) == lsys. A
110
+ @test substitute (lsyss. B, ModelingToolkit. defaults (pid)) == lsys. B
111
+ @test substitute (lsyss. C, ModelingToolkit. defaults (pid)) == lsys. C
112
+ @test substitute (lsyss. D, ModelingToolkit. defaults (pid)) == lsys. D
113
+
99
114
# Test with the reverse desired state order as well to verify that similarity transform and reoreder_states really works
100
115
lsys = ModelingToolkit. reorder_states (lsys, states (ssys), reverse (desired_order))
101
116
@@ -151,6 +166,12 @@ lsys, ssys = linearize(sat, [u], [y])
151
166
@test isempty (lsys. C)
152
167
@test lsys. D[] == 1
153
168
169
+ @test_skip lsyss, _ = ModelingToolkit. linearize_symbolic (sat, [u], [y]) # Code gen replaces ifelse with if statements causing symbolic evaluation to fail
170
+ # @test substitute(lsyss.A, ModelingToolkit.defaults(sat)) == lsys.A
171
+ # @test substitute(lsyss.B, ModelingToolkit.defaults(sat)) == lsys.B
172
+ # @test substitute(lsyss.C, ModelingToolkit.defaults(sat)) == lsys.C
173
+ # @test substitute(lsyss.D, ModelingToolkit.defaults(sat)) == lsys.D
174
+
154
175
# outside the linear region the derivative is 0
155
176
lsys, ssys = linearize (sat, [u], [y]; op = Dict (u => 2 ))
156
177
@test isempty (lsys. A) # there are no differential variables in this system
0 commit comments