Skip to content

Commit d63a805

Browse files
expanded noise Euler-Heun
1 parent e7ba127 commit d63a805

File tree

4 files changed

+45
-17
lines changed

4 files changed

+45
-17
lines changed

src/alg_utils.jl

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -26,3 +26,4 @@ alg_compatible(prob,alg::SRI) = is_diagonal_noise(prob)
2626
alg_compatible(prob,alg::SRIW1) = is_diagonal_noise(prob)
2727
alg_compatible(prob,alg::SRA) = is_diagonal_noise(prob)
2828
alg_compatible(prob,alg::SRA1) = is_diagonal_noise(prob)
29+
alg_compatible(prob,alg::RKMil) = is_diagonal_noise(prob)

src/caches.jl

Lines changed: 10 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -40,14 +40,15 @@ function alg_cache(alg::EM,prob,u,ΔW,ΔZ,rate_prototype,noise_rate_prototype,uE
4040
end
4141

4242
immutable EulerHeunConstantCache <: StochasticDiffEqConstantCache end
43-
immutable EulerHeunCache{uType,rateType} <: StochasticDiffEqMutableCache
43+
immutable EulerHeunCache{uType,rateType,rateNoiseType,rateNoiseCollectionType} <: StochasticDiffEqMutableCache
4444
u::uType
4545
uprev::uType
4646
tmp::uType
47-
rtmp1::rateType
48-
rtmp2::rateType
49-
rtmp3::rateType
50-
rtmp4::rateType
47+
ftmp1::rateType
48+
ftmp2::rateType
49+
nrtmp::rateNoiseCollectionType
50+
gtmp1::rateNoiseType
51+
gtmp2::rateNoiseType
5152
end
5253

5354
u_cache(c::EulerHeunCache) = ()
@@ -56,9 +57,10 @@ du_cache(c::EulerHeunCache) = (c.rtmp1,c.rtmp2,c.rtmp3,c.rtmp4)
5657
alg_cache(alg::EulerHeun,prob,u,ΔW,ΔZ,rate_prototype,noise_rate_prototype,uEltypeNoUnits,tTypeNoUnits,uprev,f,t,::Type{Val{false}}) = EulerHeunConstantCache()
5758

5859
function alg_cache(alg::EulerHeun,prob,u,ΔW,ΔZ,rate_prototype,noise_rate_prototype,uEltypeNoUnits,tTypeNoUnits,uprev,f,t,::Type{Val{true}})
59-
tmp = similar(u); rtmp1 = zeros(rate_prototype); rtmp2 = zeros(rate_prototype)
60-
rtmp3 = zeros(rate_prototype); rtmp4 = zeros(rate_prototype)
61-
EulerHeunCache(u,uprev,tmp,rtmp1,rtmp2,rtmp3,rtmp4)
60+
tmp = similar(u); ftmp1 = zeros(rate_prototype); ftmp2 = zeros(rate_prototype)
61+
nrtmp = zeros(rate_prototype)
62+
gtmp1 = zeros(noise_rate_prototype); gtmp2 = zeros(noise_rate_prototype)
63+
EulerHeunCache(u,uprev,tmp,ftmp1,ftmp2,nrtmp,gtmp1,gtmp2)
6264
end
6365

6466
immutable RandomEMConstantCache <: StochasticDiffEqConstantCache end

src/integrators/low_order.jl

Lines changed: 30 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -34,19 +34,41 @@ end
3434
end
3535

3636
@inline function perform_step!(integrator,cache::EulerHeunCache,f=integrator.f)
37-
@unpack rtmp1,rtmp2,rtmp3,rtmp4,tmp = cache
37+
@unpack ftmp1,ftmp2,gtmp1,gtmp2,tmp,nrtmp = cache
3838
@unpack t,dt,uprev,u,ΔW = integrator
39-
integrator.f(t,uprev,rtmp1)
40-
integrator.g(t,uprev,rtmp2)
39+
integrator.f(t,uprev,ftmp1)
40+
integrator.g(t,uprev,gtmp1)
41+
42+
if is_diagonal_noise(integrator.sol.prob)
43+
for i in eachindex(u)
44+
nrtmp[i]=gtmp1[i]*ΔW[i]
45+
end
46+
else
47+
A_mul_B!(nrtmp,gtmp1,ΔW)
48+
end
49+
4150
for i in eachindex(u)
42-
tmp[i] = @muladd uprev[i] + rtmp1[i]*dt + rtmp2[i]*ΔW[i]
51+
tmp[i] = @muladd uprev[i] + ftmp1[i]*dt + nrtmp[i]
4352
end
44-
integrator.f(t,tmp,rtmp3)
45-
integrator.g(t,tmp,rtmp4)
53+
54+
integrator.f(t,tmp,ftmp2)
55+
integrator.g(t,tmp,gtmp2)
56+
57+
if is_diagonal_noise(integrator.sol.prob)
58+
for i in eachindex(u)
59+
ΔWo2 = (1/2)*ΔW[i]
60+
nrtmp[i]=ΔWo2*(gtmp1[i]+gtmp2[i])
61+
end
62+
else
63+
for i in eachindex(gtmp1)
64+
gtmp1[i] = (1/2)*(gtmp1[i]+gtmp2[i])
65+
end
66+
A_mul_B!(nrtmp,gtmp1,ΔW)
67+
end
68+
4669
dto2 = dt*(1/2)
4770
for i in eachindex(u)
48-
ΔWo2 = (1/2)*ΔW[i]
49-
u[i] = @muladd uprev[i] + dto2*(rtmp1[i]+rtmp3[i]) + ΔWo2*(rtmp2[i]+rtmp4[i])
71+
u[i] = @muladd uprev[i] + dto2*(ftmp1[i]+ftmp2[i]) + nrtmp[i]
5072
end
5173
@pack integrator = t,dt,u
5274
end

test/stratonovich_convergence_tests.jl

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
@everywhere using StochasticDiffEq, DiffEqProblemLibrary, DiffEqDevTools, Base.Test
1+
using StochasticDiffEq, DiffEqProblemLibrary, DiffEqDevTools, Base.Test
22
srand(100)
33
dts = 1./2.^(10:-1:2) #14->7 good plot
44

@@ -19,3 +19,6 @@ sim = test_convergence(dts,prob,EulerHeun(),numMonte=Int(5e1))
1919
sim2 = test_convergence(dts,prob,RKMil(interpretation=:Stratonovich),numMonte=Int(5e2))
2020
@test abs(sim2.𝒪est[:l∞]-1) < 0.1
2121
=#
22+
23+
srand(200)
24+
sol = solve(prob,EulerHeun(),dt=1/4)

0 commit comments

Comments
 (0)