@@ -241,28 +241,26 @@ ci, varmap = infer_clocks(cl)
241
241
@test varmap[p. u] == Continuous ()
242
242
@test varmap[c. r] == Clock (t, 0.5 )
243
243
244
-
245
244
# # Multiple clock rates
246
245
@info " Testing multi-rate hybrid system"
247
246
dt = 0.1
248
247
dt2 = 0.2
249
- @variables t x (t)= 0 y (t)= 0 u (t)= 0 r (t) = 1 yd1 (t)= 0 ud1 (t)= 0 yd2 (t)= 0 ud2 (t)= 0
250
- @parameters kp= 1
248
+ @variables t x (t)= 0 y (t)= 0 u (t)= 0 yd1 (t)= 0 ud1 (t)= 0 yd2 (t)= 0 ud2 (t)= 0
249
+ @parameters kp= 1 r = 1
251
250
D = Differential (t)
252
251
253
252
eqs = [
254
- # controller (time discrete part `dt=0.1`)
255
- yd1 ~ Sample (t, dt)(y)
256
- ud1 ~ kp * (Sample (t, dt)(r) - yd1)
257
- # controller (time discrete part `dt=0.2`)
258
- yd2 ~ Sample (t, dt2)(y)
259
- ud2 ~ kp * (Sample (t, dt2)(r) - yd2)
260
-
261
- # plant (time continuous part)
262
- u ~ Hold (ud1) + Hold (ud2)
263
- D (x) ~ - x + u
264
- y ~ x
265
- ]
253
+ # controller (time discrete part `dt=0.1`)
254
+ yd1 ~ Sample (t, dt)(y)
255
+ ud1 ~ kp * (r - yd1)
256
+ # controller (time discrete part `dt=0.2`)
257
+ yd2 ~ Sample (t, dt2)(y)
258
+ ud2 ~ kp * (r - yd2)
259
+
260
+ # plant (time continuous part)
261
+ u ~ Hold (ud1) + Hold (ud2)
262
+ D (x) ~ - x + u
263
+ y ~ x]
266
264
267
265
@named cl = ODESystem (eqs, t)
268
266
@@ -274,53 +272,42 @@ ci, varmap = infer_clocks(cl)
274
272
@test varmap[ud1] == d
275
273
@test varmap[yd2] == d2
276
274
@test varmap[ud2] == d2
277
- @test varmap[r] == Continuous ()
278
275
@test varmap[x] == Continuous ()
279
276
@test varmap[y] == Continuous ()
280
277
@test varmap[u] == Continuous ()
281
278
282
279
ss = structural_simplify (cl)
283
280
284
- prob = ODEProblem (ss, [x=> 0.0 ], (0.0 , 1.0 ), [kp => 1.0 ])
285
- sol = solve (prob, Tsit5 (), kwargshandle = KeywordArgSilent)
286
-
287
- function foo! (dx, x, p, t)
288
- kp, ud1, ud2 = p
289
- dx[1 ] = - x[1 ] + ud1 + ud2
290
- end
291
-
292
- function affect1! (integrator, saved_values)
293
- kp = integrator. p[1 ]
294
- y = integrator. u[1 ]
295
- r = 1.0
296
- ud1 = kp * (r - y)
297
- push! (saved_values. t, integrator. t)
298
- push! (saved_values. saveval, [integrator. p[4 ]])
299
- integrator. p[2 ] = ud1
300
- nothing
301
- end
302
- function affect2! (integrator, saved_values)
303
- kp = integrator. p[1 ]
304
- y = integrator. u[1 ]
305
- r = 1.0
306
- ud2 = kp * (r - y)
307
- push! (saved_values. t, integrator. t)
308
- push! (saved_values. saveval, [integrator. p[5 ]])
309
- integrator. p[3 ] = ud2
310
- nothing
311
- end
312
- saved_values1 = SavedValues (Float64, Vector{Float64})
313
- saved_values2 = SavedValues (Float64, Vector{Float64})
314
- cb1 = PeriodicCallback (Base. Fix2 (affect1!, saved_values1), dt)
315
- cb2 = PeriodicCallback (Base. Fix2 (affect2!, saved_values2), dt2)
316
- cb = CallbackSet (cb1, cb2)
317
- prob = ODEProblem (foo!, [0.0 ], (0.0 , 1.0 ), [1.0 , 0.0 , 0.0 , 0.0 , 0.0 ], callback = cb)
318
- sol2 = solve (prob, Tsit5 ())
281
+ if VERSION >= v " 1.7"
282
+ prob = ODEProblem (ss, [x => 0.0 ], (0.0 , 1.0 ), [kp => 1.0 ])
283
+ sol = solve (prob, Tsit5 (), kwargshandle = KeywordArgSilent)
319
284
285
+ function foo! (dx, x, p, t)
286
+ kp, ud1, ud2 = p
287
+ dx[1 ] = - x[1 ] + ud1 + ud2
288
+ end
320
289
321
- @test sol. u == sol2. u
322
- @test saved_values1. t == sol. prob. kwargs[:disc_saved_values ][1 ]. t
323
- @test saved_values1. saveval == sol. prob. kwargs[:disc_saved_values ][1 ]. saveval
290
+ function affect1! (integrator)
291
+ kp = integrator. p[1 ]
292
+ y = integrator. u[1 ]
293
+ r = 1.0
294
+ ud1 = kp * (r - y)
295
+ integrator. p[2 ] = ud1
296
+ nothing
297
+ end
298
+ function affect2! (integrator)
299
+ kp = integrator. p[1 ]
300
+ y = integrator. u[1 ]
301
+ r = 1.0
302
+ ud2 = kp * (r - y)
303
+ integrator. p[3 ] = ud2
304
+ nothing
305
+ end
306
+ cb1 = PeriodicCallback (affect1!, dt)
307
+ cb2 = PeriodicCallback (affect2!, dt2)
308
+ cb = CallbackSet (cb1, cb2)
309
+ prob = ODEProblem (foo!, [0.0 ], (0.0 , 1.0 ), [1.0 , 0.0 , 0.0 ], callback = cb)
310
+ sol2 = solve (prob, Tsit5 ())
324
311
325
- @test saved_values2 . t == sol . prob . kwargs[ :disc_saved_values ][ 2 ] . t
326
- @test saved_values2 . saveval == sol . prob . kwargs[ :disc_saved_values ][ 2 ] . saveval
312
+ @test sol . u ≈ sol2 . u
313
+ end
0 commit comments