1
1
using ModelingToolkitStandardLibrary. Blocks
2
- using ModelingToolkit, OrdinaryDiffEq
2
+ using ModelingToolkit, OrdinaryDiffEq, Test
3
+ using ModelingToolkitStandardLibrary. Blocks: _clamp, _dead_zone
4
+ using ModelingToolkit: inputs, unbound_inputs, bound_inputs
3
5
4
6
@parameters t
5
7
6
-
7
8
@testset " Gain" begin
8
9
@named c = Constant (; k= 1 )
9
10
@named gain = Gain (1 ;)
10
11
@named int = Integrator (; k= 1 )
11
12
@named model = ODESystem ([connect (c. output, gain. input), connect (gain. output, int. input)], t, systems= [int, gain, c])
13
+
12
14
sys = structural_simplify (model)
13
-
14
15
prob = ODEProblem (sys, Pair[int. x=> 1.0 ], (0.0 , 1.0 ))
15
-
16
16
sol = solve (prob, Rodas4 ())
17
17
18
+ @test isequal (unbound_inputs (sys), [])
18
19
@test sol. retcode == :Success
19
20
@test all (sol[c. output. u] .≈ 1 )
20
21
@test sol[int. output. u][end ] ≈ 2 # expected solution after 1s
40
41
prob = ODEProblem (sys, Pair[int. x=> 0.0 ], (0.0 , 100.0 ))
41
42
42
43
sol = solve (prob, Rodas4 ())
44
+ @test isequal (unbound_inputs (sys), [])
43
45
@test sol. retcode == :Success
44
46
@test sol[int. output. u][end ] ≈ 2 # expected solution after 1s
45
47
end
61
63
sys = structural_simplify (model)
62
64
prob = ODEProblem (sys, Pair[int. x=> 0.0 ], (0.0 , 1.0 ))
63
65
sol = solve (prob, Rodas4 ())
66
+ @test isequal (unbound_inputs (sys), [])
64
67
@test sol. retcode == :Success
65
68
@test sol[add. output. u] ≈ 1 .+ sin .(2 * pi * sol. t)
66
69
80
83
sys = structural_simplify (model)
81
84
prob = ODEProblem (sys, Pair[int. x=> 0.0 ], (0.0 , 1.0 ))
82
85
sol = solve (prob, Rodas4 ())
86
+ @test isequal (unbound_inputs (sys), [])
83
87
@test sol. retcode == :Success
84
88
@test sol[add. output. u] ≈ k1 .* 1 .+ k2 .* sin .(2 * pi * sol. t)
85
89
end
104
108
sys = structural_simplify (model)
105
109
prob = ODEProblem (sys, Pair[int. x=> 0.0 ], (0.0 , 1.0 ))
106
110
sol = solve (prob, Rodas4 ())
111
+ @test isequal (unbound_inputs (sys), [])
107
112
@test sol. retcode == :Success
108
113
@test sol[add. output. u] ≈ 1 .+ sin .(2 * pi * sol. t) .+ sin .(2 * pi * 2 * sol. t)
109
114
125
130
sys = structural_simplify (model)
126
131
prob = ODEProblem (sys, Pair[int. x=> 0.0 ], (0.0 , 1.0 ))
127
132
sol = solve (prob, Rodas4 ())
133
+ @test isequal (unbound_inputs (sys), [])
128
134
@test sol. retcode == :Success
129
135
@test sol[add. output. u] ≈ k1 .* 1 .+ k2 .* sin .(2 * pi * sol. t) .+ k3 .* sin .(2 * pi * 2 * sol. t)
130
136
148
154
sys = structural_simplify (model)
149
155
prob = ODEProblem (sys, Pair[int. x=> 0.0 ], (0.0 , 1.0 ))
150
156
sol = solve (prob, Rodas4 ())
157
+ @test isequal (unbound_inputs (sys), [])
151
158
@test sol. retcode == :Success
152
159
@test sol[prod. output. u] ≈ 2 * sin .(2 * pi * sol. t)
153
160
end
169
176
sys = structural_simplify (model)
170
177
prob = ODEProblem (sys, Pair[int. x=> 0.0 ], (0.0 , 1.0 ))
171
178
sol = solve (prob, Rodas4 ())
179
+ @test isequal (unbound_inputs (sys), [])
172
180
@test sol. retcode == :Success
173
181
@test sol[div. output. u] ≈ sin .(2 * pi * sol. t) ./ 2
174
182
end
188
196
sys = structural_simplify (model)
189
197
prob = ODEProblem (sys, Pair[int. x=> 0.0 ], (0.0 , 1.0 ))
190
198
sol = solve (prob, Rodas4 ())
199
+ @test isequal (unbound_inputs (sys), [])
191
200
@test sol. retcode == :Success
192
201
@test sol[absb. output. u] ≈ abs .(sin .(2 * pi * sol. t))
193
202
end
@@ -207,34 +216,38 @@ end
207
216
208
217
@testset " Math" begin
209
218
for (block, func) in [(Abs, abs), (Sign, sign), (Sin, sin), (Cos, cos), (Tan, tan), (Asin, asin), (Acos, acos), (Atan, atan), (Sinh, sinh), (Cosh, cosh), (Tanh, tanh), (Exp, exp)]
210
- @named source = Sine (frequency= 1 )
219
+ @info " testing $block "
220
+ @named source = Sine (frequency= 1 , amplitude= 0.5 )
211
221
@named b = block ()
212
222
@named int = Integrator ()
213
223
@named model = ODESystem ([connect (source. output, b. input), connect (b. output, int. input)], t, systems= [int, b, source])
214
224
sys = structural_simplify (model)
215
225
prob = ODEProblem (sys, Pair[int. x=> 0.0 ], (0.0 , 1.0 ))
216
226
sol = solve (prob, Rodas4 ())
227
+ @test isequal (unbound_inputs (sys), [])
217
228
@test sol. retcode == :Success
218
229
@test sol[b. output. u] ≈ func .(sol[source. output. u])
219
230
end
220
231
221
232
# input must be positive
222
- for (block, func) in [(Sqrt, sqrt), (Log, log), (Log10, log10)]
223
- @named source = Sine (; frequency= 1 , offset= 2 )
233
+ for (block, func) in [(Sqrt, sqrt), (Log, log), (Log10, log10)]
234
+ @info " testing $block "
235
+ @named source = Sine (; frequency= 1 , offset= 2 , amplitude= 0.5 )
224
236
@named b = block ()
225
237
@named int = Integrator ()
226
238
@named model = ODESystem ([connect (source. output, b. input), connect (b. output, int. input)], t, systems= [int, b, source])
227
239
sys = structural_simplify (model)
228
- prob = ODEProblem (sys, Pair[int. x=> 0.0 ], (0.0 , 1.0 ))
240
+ prob = ODEProblem (sys, Pair[int. x=> 0.0 , b . input . u => 2.0 ], (0.0 , 1.0 ))
229
241
sol = solve (prob, Rodas4 ())
242
+ @test isequal (unbound_inputs (sys), [])
230
243
@test sol. retcode == :Success
231
244
@test sol[b. output. u] ≈ func .(sol[source. output. u])
232
245
end
233
246
end
234
247
235
248
@testset " Atan2" begin
236
- @named c1 = Constant (; k = 1 )
237
- @named c2 = Constant (; k = 2 )
249
+ @named c1 = Sine (; frequency = 1 , offset = 2 )
250
+ @named c2 = Sine (; frequency = 1 , offset = 1 )
238
251
@named b = Atan2 (;)
239
252
@named int = Integrator (; k= 1 )
240
253
@named model = ODESystem (
246
259
t,
247
260
systems= [int, b, c1, c2]
248
261
)
262
+
249
263
sys = structural_simplify (model)
250
- prob = ODEProblem (sys, Pair[int. x=> 0.0 ], (0.0 , 1.0 ))
264
+ prob = ODEProblem (sys, Pair[int. x=> 0.0 , b . input1 . u => 2 , b . input2 . u => 1 ], (0.0 , 1.0 ))
251
265
sol = solve (prob, Rodas4 ())
266
+
267
+ @test isequal (unbound_inputs (sys), [])
268
+ @test all (map (u-> u in Set ([b. input1. u, b. input2. u, int. input. u]), bound_inputs (sys)))
269
+ @test all (map (u-> u in Set ([b. input1. u, b. input2. u, int. input. u]), inputs (sys)))
252
270
@test sol. retcode == :Success
253
- @test sol[int. output . u][ end ] ≈ atan ( 1 , 2 )
271
+ @test sol[int. input . u] ≈ atan .(sol[c1 . output . u], sol[c2 . output . u] )
254
272
end
0 commit comments