Skip to content

Commit e4ed586

Browse files
Handle non-diagonal noise in out of place SRA
Fixes #578. All of the other convergence tests were in place but the non-diagonal case was just missing a few little bits. Supersedes #587
1 parent 2930ba8 commit e4ed586

File tree

2 files changed

+59
-5
lines changed

2 files changed

+59
-5
lines changed

src/perform_step/sra.jl

Lines changed: 19 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -178,20 +178,34 @@ end
178178
g1 = integrator.g(uprev,p,t+c11*dt)
179179
k1 = integrator.f(uprev,p,t)
180180

181-
H01 = uprev + dt*a21*k1 + b21*chi2.*g1
181+
if is_diagonal_noise(integrator.sol.prob)
182+
H01 = uprev + dt*a21*k1 + b21*chi2.*g1
183+
else
184+
H01 = uprev + dt*a21*k1 + b21*g1*chi2
185+
end
182186

183187
g2 = integrator.g(H01,p,t+c12*dt)
184188
k2 = integrator.f(H01,p,t+c02*dt)
185189

186-
H02 = uprev + dt*(a31*k1 + a32*k2) + chi2.*(b31*g1 + b32*g2)
190+
if is_diagonal_noise(integrator.sol.prob)
191+
H02 = uprev + dt*(a31*k1 + a32*k2) + chi2.*(b31*g1 + b32*g2)
192+
else
193+
H02 = uprev + dt*(a31*k1 + a32*k2) + (b31*g1 + b32*g2)*chi2
194+
end
195+
187196

188197
g3 = integrator.g(H02,p,t+c13*dt)
189198
k3 = integrator.f(H02,p,t+c03*dt)
190199

191200
E₁ = dt*(α1*k1 + α2*k2 + α3*k3)
192-
E₂ = chi2.*(beta21*g1 + beta22*g2 + beta23*g3)
193201

194-
u = uprev + E₁ + E₂ + W.dW.*(beta11*g1 + beta12*g2 + beta13*g3)
202+
if is_diagonal_noise(integrator.sol.prob)
203+
E₂ = chi2.*(beta21*g1 + beta22*g2 + beta23*g3)
204+
u = uprev + E₁ + E₂ + W.dW.*(beta11*g1 + beta12*g2 + beta13*g3)
205+
else
206+
E₂ = (beta21*g1 + beta22*g2 + beta23*g3)*chi2
207+
u = uprev + E₁ + E₂ + (beta11*g1 + beta12*g2 + beta13*g3)*W.dW
208+
end
195209

196210
if integrator.alg isa StochasticCompositeAlgorithm && integrator.alg.algs[1] isa SOSRA2
197211
ϱu = integrator.opts.internalnorm(k3 - k2, t)
@@ -255,7 +269,7 @@ end
255269
mul!(E₂,gtmp,chi2)
256270
@.. gtmp = beta11*g1 + beta12*g2 + beta13*g3
257271
mul!(E₁,gtmp,W.dW)
258-
u = uprev + dt*(α1*k1 + α2*k2 + α3*k3) + E₂ + E₁
272+
@.. u = uprev + dt*(α1*k1 + α2*k2 + α3*k3) + E₂ + E₁
259273
end
260274

261275
if integrator.alg isa StochasticCompositeAlgorithm && integrator.alg.algs[1] isa SOSRA2

test/nondiagonal_tests.jl

Lines changed: 40 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -108,8 +108,48 @@ prob = SDEProblem(f_morenoise,g_morenoise,ones(2),(0.0,1.0),
108108
noise_rate_prototype=zeros(2,4))
109109

110110
sol =solve(prob,dt=1/2^(3),EM())
111+
sol =solve(prob,dt=1/2^(3),SRA())
111112
sol =solve(prob,dt=1/2^(3),ISSEM())
112113
sol =solve(prob,dt=1/2^(3),ImplicitEM())
113114
sol =solve(prob,dt=1/2^(3),EulerHeun())
114115
sol =solve(prob,dt=1/2^(3),ImplicitEulerHeun())
115116
sol =solve(prob,dt=1/2^(3),ISSEulerHeun())
117+
118+
119+
f(du, u, p, t) = du .= u
120+
function g(du, u, p, t)
121+
du .= [-0.80 -0.3; -0.8 0.3]
122+
end
123+
124+
u0 = ones(2)
125+
dt = 1//2^(4)
126+
tspan = (0., 1.)
127+
128+
prototype = zeros(2,2)
129+
130+
iip_prob = SDEProblem{true}(f, g, u0, tspan, noise_rate_prototype = prototype)
131+
@test !(solve(iip_prob, EM(), dt = 0.1)[end] ones(2))
132+
@test !(solve(iip_prob, SOSRA())[end] ones(2))
133+
134+
# Out of place regression tests
135+
136+
f(u, p, t) = u
137+
function g(u, p, t)
138+
return [-0.80 -0.3; -0.8 0.3]
139+
end
140+
141+
u0 = ones(2)
142+
dt = 1//2^(4)
143+
tspan = (0., 1.)
144+
145+
prototype = zeros(2,2)
146+
147+
oop_prob = SDEProblem{false}(f, g, u0, tspan, noise_rate_prototype = prototype)
148+
oop_sol = solve(oop_prob, EM(), dt = dt)
149+
oop_sol = solve(oop_prob, SOSRA())
150+
sol =solve(oop_prob,dt=1/2^(3),EM())
151+
sol =solve(oop_prob,dt=1/2^(3),ISSEM())
152+
@test_broken sol =solve(oop_prob,dt=1/2^(3),ImplicitEM())
153+
sol =solve(oop_prob,dt=1/2^(3),EulerHeun())
154+
@test_broken sol =solve(oop_prob,dt=1/2^(3),ImplicitEulerHeun())
155+
sol =solve(oop_prob,dt=1/2^(3),ISSEulerHeun())

0 commit comments

Comments
 (0)