@@ -11,10 +11,10 @@ struct QSS{T} <: Integrator
1111 function QSS {T} (model:: Model , t:: Float64 , x₀:: Vector{Float64} , p:: Vector{Float64} ;
1212 order:: Number = 4 , Δrel:: Float64 = 1e-6 , Δabs:: Float64 = 1e-6 ) where T
1313 qss = new (UInt8 (order), model, p, Vector {Taylor1{Float64}} (), Vector {Float64} (), Δrel, Δabs)
14- t₀ = t + Taylor1 (Float64, order)
14+ t₀ = t + Taylor1 (Float64, order + 1 )
1515 for q₀ in x₀
1616 push! (qss. t, t)
17- push! (qss. q, q₀ + Taylor1 (zeros (Float64, order+ 1 )))
17+ push! (qss. q, q₀ + Taylor1 (zeros (Float64, order + 1 )))
1818 end
1919 for i in 1 : order- 1
2020 q = deepcopy (qss. q)
@@ -33,7 +33,7 @@ function Continuous(model::Model, env::Environment, x₀::Vector{Float64}, p::Ve
3333end
3434
3535function initial_values (qss:: QSS , t:: Float64 )
36- t₀ = t + Taylor1 (Float64, qss. order+ 1 )
36+ t₀ = t + Taylor1 (Float64, qss. order + 1 )
3737 x₀ = Vector {Taylor1{Float64}} ()
3838 for (i, f) in enumerate (qss. model. f)
3939 push! (x₀, integrate (f (t₀, qss. q, qss. p), qss. q[i][1 ]))
@@ -45,10 +45,10 @@ function step(var::Variable, cont::Continuous, qss::QSS)
4545 t = now (environment (var))
4646 n = length (qss. model. f)
4747 i = var. id
48- t₀ = t + Taylor1 (Float64, qss. order+ 1 )
48+ t₀ = t + Taylor1 (Float64, qss. order + 1 )
4949 x₀ = advance_time (var, t)
5050 update_quantized_state (qss, var, t)
51- Δt = compute_next_time (var . x, max ( qss. Δrel * x₀, qss . Δabs) )
51+ Δt = compute_next_time (qss, var )
5252 reset (var)
5353 schedule (var, Δt)
5454 for j in filter (j-> qss. model. deps[j,i], 1 : n)
@@ -60,7 +60,7 @@ function step(var::Variable, cont::Continuous, qss::QSS)
6060 advance_time (qss, k, t)
6161 end
6262 dep. x = integrate (qss. model. f[j](t₀, qss. q, qss. p), x₀)
63- Δt = recompute_next_time (qss, dep. x, qss . q[j], max (qss . Δrel * x₀, qss . Δabs) )
63+ Δt = recompute_next_time (qss, dep)
6464 reset (dep)
6565 schedule (dep, Δt)
6666 end
@@ -79,19 +79,82 @@ function update_quantized_state(qss::QSS{non_stiff}, var::Variable, t::Float64)
7979 qss. t[i] = t
8080end
8181
82- function update_quantized_state (qss:: QSS{stiff} , vars:: Vector{Variable} , i:: UInt , t:: Float64 )
82+ function update_quantized_state (qss:: QSS{stiff} , var:: Variable , t:: Float64 )
83+ i = var. id
84+ t₀ = t + Taylor1 (Float64, qss. order + 1 )
85+ x₀ = evaluate (var. x)
86+ Δq = max (qss. Δrel* x₀, qss. Δabs)
8387 for (j, istrue) in enumerate (qss. model. deps[i, :])
8488 istrue && advance_time (qss, j, t)
8589 end
86- q₋ = deepcopy (qss. q)
90+ q̲ = deepcopy (qss. q)
91+ q̲[i] = Taylor1 (zeros (order+ 1 ))+ x₀- Δq
92+ x̲ = integrate (qss. model. f[i](t₀, q̲, qss. p), x₀)
93+ for k in 1 : order- 1
94+ q̲[i] = x̲- Δq
95+ x̲ = integrate (qss. model. f[i](t₀, q̲, qss. p), x₀)
96+ end
97+ q̲[i] = x̲- Δq
98+ q̲[i][end ] = 0.0
99+ q̅ = deepcopy (qss. q)
100+ q̅[i] = Taylor1 (zeros (order+ 1 ))+ x₀+ Δq
101+ x̅ = integrate (qss. model. f[i](t₀, q̅, qss. p), x₀)
102+ for k in 1 : order- 1
103+ q̅[i] = x̅+ Δq
104+ x̅ = integrate (qss. model. f[i](t₀, q̅, qss. p), x₀)
105+ end
106+ q̅[i] = x̅+ Δq
107+ q̅[i][end ] = 0.0
108+ if x̲[end ] * x̅[end ] > 0.0
109+ if x̅[end ] > 0.0
110+ var. x = deepcopy (x̅)
111+ q = deepcopy (q̅)
112+ else
113+ var. x = deepcopy (x̲)
114+ q = deepcopy (q̲)
115+ end
116+ else
117+ q̃ = brent (nth_derivative, x₀- Δq, x₀+ Δq, qss, i; xtol= min (Δq/ 100 , 1e-7 ))
118+ qss. q[i] = q̃ + Taylor1 (zeros (Float64, order + 1 ))
119+ var. x = integrate (qss. model. f[i](t₀, qss. q, qss. p), x₀)
120+ for k in 1 : order- 1
121+ qss. q[i] = deepcopy (var. x)
122+ qss. q[i][1 ] = q̃
123+ var. x = integrate (qss. model. f[i](t₀, qss. q, qss. p), x₀)
124+ end
125+ qss. q[i][end ] = 0.0
126+ end
87127end
88128
89- function compute_next_time (x:: Taylor1 , Δq:: Float64 )
90- (abs (Δq/ x[end ]))^ (1.0 / x. order)
129+ function nth_derivative (q₀:: Float64 , qss:: QSS{stiff} , i:: UInt )
130+ t₀ = t + Taylor1 (Float64, qss. order + 1 )
131+ q = deepcopy (qss. q)
132+ q[i][2 : end ] = 0.0
133+ q[i][1 ] = q₀
134+ q[i] = integrate (qss. model. f[i](t₀, q, qss. p), q₀)
135+ for k in 1 : order- 1
136+ q[i] = integrate (qss. model. f[i](t₀, q, qss. p), q₀)
137+ end
138+ q[i][end ]
139+ end
140+
141+ function compute_next_time (qss:: QSS{non_stiff} , var:: Variable )
142+ x₀ = evaluate (var. x)
143+ Δq = max (qss. Δrel* x₀, qss. Δabs)
144+ (abs (Δq/ var. x[end ]))^ (1.0 / qss. order)
91145end
92146
93- function recompute_next_time (:: QSS{non_stiff} , x:: Taylor1{Float64} , q:: Taylor1{Float64} , Δq:: Float64 )
94- p = (x- q). coeffs
147+ function compute_next_time (qss:: QSS{stiff} , var:: Variable )
148+ x₀ = evaluate (var. x)
149+ Δq = max (qss. Δrel* x₀, qss. Δabs)
150+ (abs (Δq/ var. x[end ]))^ (1.0 / qss. order)
151+ end
152+
153+ function recompute_next_time (qss:: QSS{non_stiff} , var:: Variable )
154+ i = var. id
155+ x₀ = evaluate (var. x)
156+ Δq = max (qss. Δrel* x₀, qss. Δabs)
157+ p = (var. x- qss. q[i]). coeffs
95158 p[1 ] -= Δq
96159 neg = roots (p)
97160 p[1 ] += 2 Δq
0 commit comments