Skip to content

Commit efb91a6

Browse files
Merge pull request #62 from frankschae/noise_grid_problem
noise wrapper alternative
2 parents 1f496f3 + a65c179 commit efb91a6

File tree

2 files changed

+47
-22
lines changed

2 files changed

+47
-22
lines changed

src/convergence.jl

Lines changed: 34 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -61,28 +61,46 @@ function analyticless_test_convergence(dts::AbstractArray,
6161
alg,test_dt;trajectories=100,
6262
save_everystep=true,timeseries_steps=1,
6363
timeseries_errors=save_everystep,adaptive=false,
64-
weak_timeseries_errors=false,weak_dense_errors=false,kwargs...)
64+
weak_timeseries_errors=false,weak_dense_errors=false,use_noise_grid=true,kwargs...)
6565
_solutions = []
6666
tmp_solutions = Array{Any}(undef,trajectories,length(dts))
6767
for j in 1:trajectories
6868
@info "Monte Carlo iteration: $j/$trajectories"
6969
t = prob.tspan[1]:test_dt:prob.tspan[2]
70-
if prob.noise_rate_prototype === nothing
71-
brownian_values = cumsum([[zeros(size(prob.u0))];[sqrt(test_dt)*randn(size(prob.u0)) for i in 1:length(t)-1]])
72-
brownian_values2 = cumsum([[zeros(size(prob.u0))];[sqrt(test_dt)*randn(size(prob.u0)) for i in 1:length(t)-1]])
70+
if use_noise_grid
71+
if prob.noise_rate_prototype === nothing
72+
brownian_values = cumsum([[zeros(size(prob.u0))];[sqrt(test_dt)*randn(size(prob.u0)) for i in 1:length(t)-1]])
73+
brownian_values2 = cumsum([[zeros(size(prob.u0))];[sqrt(test_dt)*randn(size(prob.u0)) for i in 1:length(t)-1]])
74+
else
75+
brownian_values = cumsum([[zeros(size(prob.noise_rate_prototype,2))];[sqrt(test_dt)*randn(size(prob.noise_rate_prototype,2)) for i in 1:length(t)-1]])
76+
brownian_values2 = cumsum([[zeros(size(prob.noise_rate_prototype,2))];[sqrt(test_dt)*randn(size(prob.noise_rate_prototype,2)) for i in 1:length(t)-1]])
77+
end
78+
np = NoiseGrid(t,brownian_values,brownian_values2)
79+
_prob = SDEProblem(prob.f,prob.g,prob.u0,prob.tspan,
80+
noise=np,
81+
noise_rate_prototype=prob.noise_rate_prototype);
82+
true_sol = solve(_prob,alg;adaptive=adaptive,dt=test_dt);
83+
84+
for i in 1:length(dts)
85+
sol = solve(_prob,alg;dt=dts[i],adaptive=adaptive);
86+
err_sol = appxtrue(sol,true_sol)
87+
tmp_solutions[j,i] = err_sol
88+
end
7389
else
74-
brownian_values = cumsum([[zeros(size(prob.noise_rate_prototype,2))];[sqrt(test_dt)*randn(size(prob.noise_rate_prototype,2)) for i in 1:length(t)-1]])
75-
brownian_values2 = cumsum([[zeros(size(prob.noise_rate_prototype,2))];[sqrt(test_dt)*randn(size(prob.noise_rate_prototype,2)) for i in 1:length(t)-1]])
76-
end
77-
np = NoiseGrid(t,brownian_values,brownian_values2)
78-
_prob = SDEProblem(prob.f,prob.g,prob.u0,prob.tspan,
79-
noise=np,
80-
noise_rate_prototype=prob.noise_rate_prototype);
81-
true_sol = solve(_prob,alg;adaptive=adaptive,dt=test_dt);
82-
for i in 1:length(dts)
83-
sol = solve(_prob,alg;dt=dts[i],adaptive=adaptive);
84-
err_sol = appxtrue(sol,true_sol)
85-
tmp_solutions[j,i] = err_sol
90+
# using NoiseWrapper doesn't lead to constant true_sol
91+
true_sol = solve(prob,alg;adaptive=adaptive,dt=test_dt, save_noise=true)
92+
_sol = deepcopy(true_sol)
93+
W1 = NoiseWrapper(_sol.W)
94+
95+
_prob = remake(prob,u0=prob.u0,p=prob.p,tspan=prob.tspan,noise=W1,noise_rate_prototype = prob.noise_rate_prototype)
96+
97+
for i in 1:length(dts)
98+
W1 = NoiseWrapper(_sol.W)
99+
_prob = remake(prob,u0=prob.u0,p=prob.p,tspan=prob.tspan,noise=W1,noise_rate_prototype = prob.noise_rate_prototype)
100+
sol = solve(_prob,alg;dt=dts[i],adaptive=adaptive);
101+
err_sol = appxtrue(sol,true_sol)
102+
tmp_solutions[j,i] = err_sol
103+
end
86104
end
87105
end
88106
_solutions = [EnsembleSolution(tmp_solutions[:,i],0.0,true) for i in 1:length(dts)]

test/analyticless_convergence_tests.jl

Lines changed: 13 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -14,21 +14,28 @@ test_setup = Dict(:alg=>Vern9(),:reltol=>1e-25,:abstol=>1e-25)
1414
sim1 = analyticless_test_convergence(dts,prob,Tsit5(),test_setup)
1515
sim2 = analyticless_test_convergence(dts,prob,Vern9(),test_setup)
1616

17-
@test sim1.𝒪est[:final]-5 < 0.2
18-
@test sim2.𝒪est[:final]-9 < 0.2
17+
@test abs(sim1.𝒪est[:final]-5) < 0.2
18+
@test abs(sim2.𝒪est[:final]-9) < 0.2
1919

2020
function f2(du,u,p,t)
2121
du .= 1.01u
2222
end
2323
function g2(du,u,p,t)
2424
du .= 1.01u
2525
end
26-
prob = SDEProblem(f2,g2,[1.0;1.0],(0.0,10.0))
26+
prob = SDEProblem(f2,g2,[1.0;1.0],(0.0,1.0))
2727

2828
using StochasticDiffEq
2929

30-
dts = (1/2).^(6:-1:3)
30+
dts = (1/2).^(7:-1:3)
3131
test_dt = 1/2^8
3232
Random.seed!(100)
33-
sim1 = analyticless_test_convergence(dts,prob,SRIW1(),test_dt,trajectories=400)
34-
@test sim1.𝒪est[:final]-1.5 < 0.3
33+
sim1 = analyticless_test_convergence(dts,prob,SRIW1(),test_dt,trajectories=100)
34+
@test abs(sim1.𝒪est[:final]-1.5) < 0.4
35+
@show sim1.𝒪est[:final]
36+
37+
dts = (1/2).^(7:-1:4)
38+
test_dt = 1/2^8
39+
sim2 = analyticless_test_convergence(dts,prob,SRIW1(),test_dt,trajectories=100, use_noise_grid=false)
40+
@test abs(sim2.𝒪est[:final]-1.5) < 0.3
41+
@show sim2.𝒪est[:final]

0 commit comments

Comments
 (0)