@@ -89,40 +89,31 @@ d = Clock(t, dt)
8989
9090@info " Testing shift normalization"
9191dt = 0.1
92- @variables x (t) y (t) u (t) yd (t) ud (t) r (t) z (t)
92+ @variables x (t) y (t) u (t) yd (t) ud (t)
9393@parameters kp
9494d = Clock (t, dt)
9595k = ShiftIndex (d)
9696
9797eqs = [yd ~ Sample (t, dt)(y)
98- ud ~ kp * (r - yd) + z (k)
99- r ~ 1.0
98+ ud ~ kp * yd + ud (k - 2 )
10099
101100 # plant (time continuous part)
102101 u ~ Hold (ud)
103102 D (x) ~ - x + u
104- y ~ x
105- z (k + 2 ) ~ z (k) + yd
106- #=
107- z(k + 2) ~ z(k) + yd
108- =>
109- z′(k + 1) ~ z(k) + yd
110- z(k + 1) ~ z′(k)
111- =#
112- ]
103+ y ~ x]
113104@named sys = ODESystem (eqs, t)
114105ss = structural_simplify (sys);
115106
116107Tf = 1.0
117108prob = ODEProblem (ss, [x => 0.0 , y => 0.0 ], (0.0 , Tf),
118- [kp => 1.0 ; z => 3 .0 ; z (k + 1 ) => 2.0 ])
119- @test sort (vcat (prob. p... )) == [0 , 1.0 , 2.0 , 3 .0 , 4 .0 ] # yd, kp, z(k+1 ), z(k) , ud
109+ [kp => 1.0 ; ud (k - 1 ) => 2 .0 ; ud (k - 2 ) => 2.0 ])
110+ @test sort (vcat (prob. p... )) == [0 , 1.0 , 2.0 , 2 .0 , 2 .0 ] # yd, Hold(ud ), kp , ud(k - 1)
120111sol = solve (prob, Tsit5 (), kwargshandle = KeywordArgSilent)
121112
122113ss_nosplit = structural_simplify (sys; split = false )
123114prob_nosplit = ODEProblem (ss_nosplit, [x => 0.0 , y => 0.0 ], (0.0 , Tf),
124- [kp => 1.0 ; z => 3 .0 ; z (k + 1 ) => 2.0 ])
125- @test sort (prob_nosplit. p) == [0 , 1.0 , 2.0 , 3 .0 , 4 .0 ] # yd, kp, z(k+1 ), z(k) , ud
115+ [kp => 1.0 ; ud (k - 1 ) => 2 .0 ; ud (k - 2 ) => 2.0 ])
116+ @test sort (prob_nosplit. p) == [0 , 1.0 , 2.0 , 2 .0 , 2 .0 ] # yd, Hold(ud ), kp , ud(k - 1)
126117sol_nosplit = solve (prob_nosplit, Tsit5 (), kwargshandle = KeywordArgSilent)
127118# For all inputs in parameters, just initialize them to 0.0, and then set them
128119# in the callback.
@@ -134,30 +125,23 @@ function foo!(du, u, p, t)
134125 du[1 ] = - x + ud
135126end
136127function affect! (integrator, saved_values)
137- z_t, z = integrator. p[3 ], integrator. p[4 ]
138128 yd = integrator. u[1 ]
139129 kp = integrator. p[1 ]
140- r = 1.0
130+ ud = integrator. p[2 ]
131+ udd = integrator. p[3 ]
141132
142133 push! (saved_values. t, integrator. t)
143- push! (saved_values. saveval, [z_t, z])
144-
145- # Update the discrete state
146- z_t, z = z + yd, z_t
147- # @show z_t, z
148- integrator. p[3 ] = z_t
149- integrator. p[4 ] = z
134+ push! (saved_values. saveval, [ud, udd])
150135
151- ud = kp * (r - yd) + z
152- integrator. p[2 ] = ud
136+ integrator . p[ 2 ] = kp * yd + udd
137+ integrator. p[3 ] = ud
153138
154139 nothing
155140end
156141saved_values = SavedValues (Float64, Vector{Float64})
157142cb = PeriodicCallback (Base. Fix2 (affect!, saved_values), 0.1 )
158- # kp ud z_t z
159- prob = ODEProblem (foo!, [0.0 ], (0.0 , Tf), [1.0 , 4.0 , 2.0 , 3.0 ], callback = cb)
160- # ud initializes to kp * (r - yd) + z = 1 * (1 - 0) + 3 = 4
143+ # kp ud
144+ prob = ODEProblem (foo!, [0.0 ], (0.0 , Tf), [1.0 , 2.0 , 2.0 ], callback = cb)
161145sol2 = solve (prob, Tsit5 ())
162146@test sol. u == sol2. u
163147@test sol_nosplit. u == sol2. u
217201function filt (; name)
218202 @variables x (t)= 0 u (t)= 0 y (t)= 0
219203 a = 1 / exp (dt)
220- eqs = [x (k + 1 ) ~ a * x + (1 - a) * u (k)
204+ eqs = [x ~ a * x (k - 1 ) + (1 - a) * u (k - 1 )
221205 y ~ x]
222206 ODESystem (eqs, t, name = name)
223207end
@@ -487,9 +471,11 @@ k = ShiftIndex(c)
487471 @variables begin
488472 count (t) = 0
489473 u (t) = 0
474+ ud (t) = 0
490475 end
491476 @equations begin
492- count (k + 1 ) ~ Sample (c)(u)
477+ ud ~ Sample (c)(u)
478+ count ~ ud (k - 1 )
493479 end
494480end
495481
0 commit comments