From 068a508e9cfb94980f87ed06a63ec218c4b05beb Mon Sep 17 00:00:00 2001 From: Christopher Rackauckas Date: Wed, 25 Jul 2018 01:30:45 -0700 Subject: [PATCH] fix tests --- src/perform_step/iif.jl | 26 ++++++++++++------------ test/iif_methods.jl | 30 +++++++++++++++++----------- test/runtests.jl | 2 +- test/split_tests.jl | 34 +++++++++++++++++-------------- test/weak_convergence.jl | 43 +++++++++++++++++++++++++++------------- 5 files changed, 80 insertions(+), 55 deletions(-) diff --git a/src/perform_step/iif.jl b/src/perform_step/iif.jl index 700ead22f..c8af4bd2a 100644 --- a/src/perform_step/iif.jl +++ b/src/perform_step/iif.jl @@ -7,7 +7,7 @@ mutable struct RHS_IIF1M_Scalar{F,CType,tType,P} <: Function end function (f::RHS_IIF1M_Scalar)(resid,u) - resid[1] .= u[1] - f.tmp - f.dt*f.f[2](u[1],f.p,f.t+f.dt)[1] + resid[1] = u[1] - f.tmp - f.dt*f.f.f2(u[1],f.p,f.t+f.dt)[1] end mutable struct RHS_IIF2M_Scalar{F,CType,tType,P} <: Function @@ -19,7 +19,7 @@ mutable struct RHS_IIF2M_Scalar{F,CType,tType,P} <: Function end function (f::RHS_IIF2M_Scalar)(resid,u) - resid[1] = u[1] - f.tmp - 0.5f.dt*f.f[2](u[1],f.p,f.t+f.dt)[1] + resid[1] = u[1] - f.tmp - 0.5f.dt*f.f.f2(u[1],f.p,f.t+f.dt)[1] end @muladd function initialize!(integrator,cache::Union{IIF1MConstantCache,IIF2MConstantCache,IIF1MilConstantCache},f=integrator.f) @@ -30,13 +30,13 @@ end @unpack t,dt,uprev,u,W,p = integrator @unpack uhold,rhs,nl_rhs = cache alg = unwrap_alg(integrator, true) - A = integrator.f[1](u,p,t) + A = integrator.f.f1(u,p,t) if typeof(cache) <: IIF1MilConstantCache error("Milstein correction does not work.") elseif typeof(cache) <: IIF1MConstantCache - tmp = expm(A*dt)*(uprev + integrator.g(uprev,p,t)*W.dW) + tmp = exp(A*dt)*(uprev + integrator.g(uprev,p,t)*W.dW) elseif typeof(cache) <: IIF2MConstantCache - tmp = expm(A*dt)*(uprev + 0.5dt*integrator.f[2](uprev,p,t) + integrator.g(uprev,p,t)*W.dW) + tmp = exp(A*dt)*(uprev + 0.5dt*integrator.f.f2(uprev,p,t) + integrator.g(uprev,p,t)*W.dW) end if integrator.iter > 1 && !integrator.u_modified @@ -64,7 +64,7 @@ end function (f::RHS_IIF1)(resid,u) _du = get_du(f.dual_cache, eltype(u)) du = reinterpret(eltype(u),_du) - f.f[2](du,reshape(u,f.sizeu),f.p,f.t+f.dt) + f.f.f2(du,reshape(u,f.sizeu),f.p,f.t+f.dt) @. resid = u - f.tmp - f.dt*du end @@ -80,7 +80,7 @@ end function (f::RHS_IIF2)(resid,u) _du = get_du(f.dual_cache, eltype(u)) du = reinterpret(eltype(u),_du) - f.f[2](du,reshape(u,f.sizeu),f.p,f.t+f.dt) + f.f.f2(du,reshape(u,f.sizeu),f.p,f.t+f.dt) @. resid = u - f.tmp - 0.5f.dt*du end @@ -102,12 +102,12 @@ end rtmp3 .+= uprev if typeof(cache) <: IIF2MCache - integrator.f[2](rtmp1,uprev,p,t) + integrator.f.f2(rtmp1,uprev,p,t) @. rtmp3 = @muladd 0.5dt*rtmp1 + rtmp3 end - A = integrator.f[1](rtmp1,uprev,p,t) - M = expm(A*dt) + A = integrator.f.f1(rtmp1,uprev,p,t) + M = exp(A*dt) mul!(tmp,M,rtmp3) if integrator.iter > 1 && !integrator.u_modified @@ -134,8 +134,8 @@ end dW = W.dW; sqdt = integrator.sqdt f = integrator.f; g = integrator.g - A = integrator.f[1](t,uprev,rtmp1) - M = expm(A*dt) + A = integrator.f.f1(t,uprev,rtmp1) + M = exp(A*dt) uidx = eachindex(u) integrator.g(rtmp2,uprev,p,t) @@ -168,7 +168,7 @@ end end if typeof(cache) <: IIF2MCache - integrator.f[2](t,uprev,rtmp1) + integrator.f.f2(t,uprev,rtmp1) @. rtmp1 = @muladd 0.5dt*rtmp1 + uprev + rtmp3 mul!(tmp,M,rtmp1) elseif !(typeof(cache) <: IIF1MilCache) diff --git a/test/iif_methods.jl b/test/iif_methods.jl index 977c92877..c708a2a9c 100644 --- a/test/iif_methods.jl +++ b/test/iif_methods.jl @@ -1,19 +1,21 @@ using DiffEqBase, StochasticDiffEq, DiffEqNoiseProcess, - Test, DiffEqDevTools + Test, DiffEqDevTools, Random, LinearAlgebra const μ = 1.01 const σ_const = 0.87 f(u,p,t) = μ * u + μ * u f1_μ(u,p,t) = μ -(::typeof(f1_μ))(::Type{Val{:analytic}},u0,p,t,W) = u0.*exp.((2μ-(σ_const^2)/2)t+σ_const*W) +f1_μ_analytic(u0,p,t,W) = u0.*exp.((2μ-(σ_const^2)/2)t+σ_const*W) f2(u,p,t) = μ * u σ(u,p,t) = σ_const*u no_noise(u,p,t) = 0.0 f1_no_noise(u,p,t) = μ -(::typeof(f1_no_noise))(::Type{Val{:analytic}},u0,p,t,W) = u0.*exp.(2μ*t) +f1_no_noise_analytic(u0,p,t,W) = u0.*exp.(2μ*t) -prob = SplitSDEProblem{false}(f1_μ,f2,σ,1/2,(0.0,1.0)) -no_noise_prob = SplictSDEProblem{false}(f1_no_noise,f2,no_noise,1/2,(0.0,1.0)) +ff1_μ = SplitSDEFunction(f1_μ,f2,σ,analytic=f1_μ_analytic) +prob = SDEProblem(ff1_μ,σ,1/2,(0.0,1.0)) +ff1_no_noise = SplitSDEFunction(f1_no_noise,f2,no_noise,analytic=f1_no_noise_analytic) +no_noise_prob = SDEProblem(ff1_no_noise,no_noise,1/2,(0.0,1.0)) sol = solve(prob,IIF1M(),dt=1/10) @@ -21,6 +23,8 @@ prob2 = SDEProblem{false}(f,σ,1/2,(0.0,1.0),noise = NoiseWrapper(sol.W)) sol2 = solve(prob2,EM(),dt=1/10) +sol = solve(no_noise_prob,IIF1M(),dt=1/10) + srand(100) dts = (1/2) .^ (7:-1:4) #14->7 good plot println("IIF scalar") @@ -29,7 +33,7 @@ sim = test_convergence(dts,prob,IIF1M(),numMonte=Int(1e2)) sim = test_convergence(dts,no_noise_prob,IIF1M(),numMonte=Int(2e1)) @test abs(sim.𝒪est[:l2]-1.0) < 0.2 # closer to 1 at this part -dts = (1/2) .^(7:-1:4) #14->7 good plot +dts = (1/2) .^ (7:-1:4) #14->7 good plot println("IIF no noise scalar") srand(100) sim = test_convergence(dts,prob,IIF2M(),numMonte=Int(1e2)) @@ -58,35 +62,37 @@ function σ(du,u,p,t) mul!(@view(du[:,2]),B,u) end -function (::typeof(f))(::Type{Val{:analytic}},u0,p,t,W) +function f_analytic(u0,p,t,W) tmp = (A+1.01I-(B^2))*t + B*sum(W) exp(tmp)*u0 end f1_A(du,u,p,t) = A -function (::typeof(f1_A))(::Type{Val{:analytic}},u0,p,t,W) +function f1_A_analytic(u0,p,t,W) tmp = (A+1.01I-(B^2))*t + B*sum(W) exp(tmp)*u0 end f2(du,u,p,t) = du .= μ .* u -prob = SDEProblem((f1_A,f2),σ,u0,(0.0,1.0),noise_rate_prototype=rand(2,2)) +ff1_A = SplitSDEFunction(f1_A,f2,σ,analytic=f1_A_analytic) +prob = SDEProblem(ff1_A,σ,u0,(0.0,1.0),noise_rate_prototype=rand(2,2)) f1_no_noise(du,u,p,t) = A f2(du,u,p,t) = (du .= μ .* u) function σ22(du,u,p,t) du .= 0 end -function (::typeof(f1_no_noise))(::Type{Val{:analytic}},u0,p,t,W) +function f1_no_noise_analytic(u0,p,t,W) tmp = (A+1.01I)*t exp(tmp)*u0 end -prob_no_noise = SDEProblem((f1_no_noise,f2),σ22,u0,(0.0,1.0),noise_rate_prototype=rand(2,2)) +ff1_A = SplitSDEFunction(f1_no_noise,f2,σ22,analytic=f1_no_noise_analytic) +prob_no_noise = SDEProblem(ff1_A,σ22,u0,(0.0,1.0),noise_rate_prototype=rand(2,2)) sol = solve(prob,IIF1M(),dt=1/10) -dts = 1./2.^(8:-1:4) #14->7 good plot +dts = (1/2) .^ (8:-1:4) #14->7 good plot srand(250) println("IIF") diff --git a/test/runtests.jl b/test/runtests.jl index 11f9ae2a5..65ed67a6f 100644 --- a/test/runtests.jl +++ b/test/runtests.jl @@ -48,7 +48,7 @@ is_APPVEYOR = ( Sys.iswindows() && haskey(ENV,"APPVEYOR") ) @time @testset "Non-diagonal SDE Tests" begin include("nondiagonal_tests.jl") end @time @testset "Rossler Order Tests" begin include("sde/sde_rosslerorder_tests.jl") end @time @testset "Convergence Tests" begin include("sde/sde_convergence_tests.jl") end - #@time @testset "Split Tests" begin include("split_tests.jl") end + @time @testset "Split Tests" begin include("split_tests.jl") end @time @testset "Stratonovich Convergence Tests" begin include("stratonovich_convergence_tests.jl") end @time @testset "IIF Convergence Tests" begin include("iif_methods.jl") end LONGER_TESTS && @time @testset "Weak Convergence Tests" begin include("weak_convergence.jl") end diff --git a/test/split_tests.jl b/test/split_tests.jl index e5a127b9b..154a8bd82 100644 --- a/test/split_tests.jl +++ b/test/split_tests.jl @@ -4,7 +4,7 @@ f(u,p,t) = (1.01) * u f1(u,p,t) = (1.01)/2 * u f2(u,p,t) = (1.01)/2 * u σ(u,p,t) = 0.87u -#(::typeof(f))(::Type{Val{:analytic}},u0,p,t,W) = u0.*exp.(0.63155t+0.87W) +f_split_analytic(u0,p,t,W) = u0.*exp.(0.63155t+0.87W) prob = SplitSDEProblem{false}(f1,f2,σ,1/2,(0.0,1.0)) sol = solve(prob,SplitEM(),dt=1/10,save_noise=true) @@ -15,7 +15,9 @@ sol2 = solve(prob,EM(),dt=1/10) @test sol[:] ≈ sol2[:] u0 = rand(4) -prob = SplitSDEProblem{false}(f1,f2,σ,u0,(0.0,1.0)) + +ff_split = SplitSDEFunction(f1,f2,σ,analytic=f_split_analytic) +prob = SDEProblem(ff_split,σ,u0,(0.0,1.0)) sol = solve(prob,SplitEM(),dt=1/10,save_noise=true) @@ -34,13 +36,15 @@ sol2 = solve(prob,EM(),dt=1/10) ff1 = (u,p,t) -> β./sqrt.(1+t) - u./(2*(1+t)) ff2 = (u,p,t) -> 0.0 σ2 = (u,p,t) -> α*β./sqrt.(1+t) -prob = SplitSDEProblem(ff1,ff2,σ2,1.,(0.0,1.0)) -(::typeof(prob.f))(::Type{Val{:analytic}},u0,p,t,W) = u0./sqrt.(1+t) + β*(t+α*W)./sqrt.(1+t) +ff1_analytic(u0,p,t,W) = @. u0/sqrt(1+t) + β*(t+α*W)/sqrt(1+t) +f_ff1 = SplitSDEFunction(ff1,ff2,σ2,analytic=ff1_analytic) +prob = SDEProblem(f_ff1,σ2,1.,(0.0,1.0)) + sol = solve(prob,EM(),dt=1/10) sol2 = solve(prob,SKenCarp(),dt=1/10) -dts = 1./2.^(10:-1:2) #14->7 good plot +dts = (1/2) .^(10:-1:2) #14->7 good plot sim10 = test_convergence(dts,prob,SKenCarp(),numMonte=Int(1e1)) @test abs(sim10.𝒪est[:final]-2) < 0.3 @@ -51,8 +55,8 @@ sim10 = test_convergence(dts,prob,SKenCarp(),numMonte=Int(1e1)) ff1 = (u,p,t) -> 0.0 ff2 = (u,p,t) -> β./sqrt.(1+t) - u./(2*(1+t)) σ2 = (u,p,t) -> α*β./sqrt.(1+t) -prob = SplitSDEProblem(ff1,ff2,σ2,1.,(0.0,1.0)) -(::typeof(prob.f))(::Type{Val{:analytic}},u0,p,t,W) = u0./sqrt.(1+t) + β*(t+α*W)./sqrt.(1+t) +f_ff1 = SplitSDEFunction(ff1,ff2,σ2,analytic=ff1_analytic) +prob = SplitSDEProblem(f_ff1,σ2,1.,(0.0,1.0)) sol = solve(prob,EM(),dt=1/10) sol2 = solve(prob,SKenCarp(),dt=1/10,seed=1) @@ -68,8 +72,8 @@ sim10 = test_convergence(dts,prob,SKenCarp(),numMonte=Int(1e1)) ff1 = (u,p,t) -> β./sqrt.(1+t) ff2 = (u,p,t) -> - u./(2*(1+t)) σ2 = (u,p,t) -> α*β./sqrt.(1+t) -prob = SplitSDEProblem(ff1,ff2,σ2,1.,(0.0,1.0)) -(::typeof(prob.f))(::Type{Val{:analytic}},u0,p,t,W) = u0./sqrt.(1+t) + β*(t+α*W)./sqrt.(1+t) +f_ff1 = SplitSDEFunction(ff1,ff2,σ2,analytic=ff1_analytic) +prob = SplitSDEProblem(f_ff1,σ2,1.,(0.0,1.0)) sol = solve(prob,EM(),dt=1/10) sol2 = solve(prob,SKenCarp(),dt=1/10) @@ -87,8 +91,8 @@ sim10 = test_convergence(dts,prob,SKenCarp(),numMonte=Int(1e1)) ff1 = (du,u,p,t) -> du .= β./sqrt.(1+t) - u./(2*(1+t)) ff2 = (du,u,p,t) -> du .= 0.0 σ2 = (du,u,p,t) -> du .= α*β./sqrt.(1+t) -prob = SplitSDEProblem(ff1,ff2,σ2,[1.],(0.0,1.0)) -(::typeof(prob.f))(::Type{Val{:analytic}},u0,p,t,W) = u0./sqrt.(1+t) + β*(t+α*W)./sqrt.(1+t) +f_ff1 = SplitSDEFunction(ff1,ff2,σ2,analytic=ff1_analytic) +prob = SplitSDEProblem(f_ff1,σ2,[1.],(0.0,1.0)) sol = solve(prob,EM(),dt=1/10) sol2 = solve(prob,SKenCarp(),dt=1/10) @@ -104,8 +108,8 @@ sim10 = test_convergence(dts,prob,SKenCarp(),numMonte=Int(1e1)) ff1 = (du,u,p,t) -> du .= 0.0 ff2 = (du,u,p,t) -> du .= β./sqrt.(1+t) - u./(2*(1+t)) σ2 = (du,u,p,t) -> du .= α*β./sqrt.(1+t) -prob = SplitSDEProblem(ff1,ff2,σ2,[1.],(0.0,1.0)) -(::typeof(prob.f))(::Type{Val{:analytic}},u0,p,t,W) = u0./sqrt.(1+t) + β*(t+α*W)./sqrt.(1+t) +f_ff1 = SplitSDEFunction(ff1,ff2,σ2,analytic=ff1_analytic) +prob = SplitSDEProblem(f_ff1,σ2,[1.],(0.0,1.0)) sol = solve(prob,EM(),dt=1/10) sol2 = solve(prob,SKenCarp(),dt=1/10) @@ -121,8 +125,8 @@ sim10 = test_convergence(dts,prob,SKenCarp(),numMonte=Int(1e1)) ff1 = (du,u,p,t) -> du .= β./sqrt.(1+t) ff2 = (du,u,p,t) -> du .= - u./(2*(1+t)) σ2 = (du,u,p,t) -> du .= α*β./sqrt.(1+t) -prob = SplitSDEProblem(ff1,ff2,σ2,[1.],(0.0,1.0)) -(::typeof(prob.f))(::Type{Val{:analytic}},u0,p,t,W) = u0./sqrt.(1+t) + β*(t+α*W)./sqrt.(1+t) +f_ff1 = SplitSDEFunction(ff1,ff2,σ2,analytic=ff1_analytic) +prob = SplitSDEProblem(f_ff1,σ2,[1.],(0.0,1.0)) sol = solve(prob,EM(),dt=1/10) sol2 = solve(prob,SKenCarp(),dt=1/10) diff --git a/test/weak_convergence.jl b/test/weak_convergence.jl index faea1f983..78f1f885b 100644 --- a/test/weak_convergence.jl +++ b/test/weak_convergence.jl @@ -1,3 +1,4 @@ +using Distributed @everywhere using StochasticDiffEq, DiffEqDevTools, Test @everywhere using DiffEqProblemLibrary.SDEProblemLibrary: importsdeproblems @everywhere importsdeproblems() @@ -6,65 +7,79 @@ srand(100) dts = 1./2.^(10:-1:2) #14->7 good plot prob = prob_sde_linear -sim = test_convergence(dts,prob,EM(),numMonte=Int(1e4),weak_timeseries_errors=true,weak_dense_errors=true) +sim = test_convergence(dts,prob,EM(),numMonte=Int(1e4), + weak_timeseries_errors=true,weak_dense_errors=true) @test abs(sim.𝒪est[:weak_final]-1) < 0.3 @test abs(sim.𝒪est[:weak_l2]-1) < 0.3 @test abs(sim.𝒪est[:weak_l∞]-1) < 0.3 @test abs(sim.𝒪est[:weak_L2]-1) < 0.3 @test abs(sim.𝒪est[:weak_L∞]-1) < 0.3 -sim2 = test_convergence(dts,prob,RKMil(),numMonte=Int(1e4),weak_timeseries_errors=true,dense_errors=true) +sim2 = test_convergence(dts,prob,RKMil(),numMonte=Int(1e4), + weak_timeseries_errors=true,dense_errors=true) @test abs(sim2.𝒪est[:weak_final]-1) < 0.3 @test abs(sim2.𝒪est[:weak_l2]-1) < 0.3 @test abs(sim2.𝒪est[:weak_l∞]-1) < 0.3 -sim3 = test_convergence(dts,prob,SRI(),numMonte=Int(1e4),weak_timeseries_errors=true) +sim3 = test_convergence(dts,prob,SRI(),numMonte=Int(1e4), + weak_timeseries_errors=true) @test abs(sim3.𝒪est[:weak_final]-2) < 0.3 @test abs(sim3.𝒪est[:weak_l2]-2) < 0.3 @test abs(sim3.𝒪est[:weak_l∞]-2) < 0.3 -sim4 = test_convergence(dts,prob,SRIW1(),numMonte=Int(1e4),weak_timeseries_errors=true) +sim4 = test_convergence(dts,prob,SRIW1(),numMonte=Int(1e4), + weak_timeseries_errors=true) @test abs(sim4.𝒪est[:weak_final]-2) < 0.3 @test abs(sim4.𝒪est[:weak_l2]-2) < 0.3 @test abs(sim4.𝒪est[:weak_l∞]-2) < 0.3 prob = prob_sde_2Dlinear -sim = test_convergence(dts,prob,EM(),numMonte=Int(1e4),weak_timeseries_errors=true) +sim = test_convergence(dts,prob,EM(),numMonte=Int(1e4), + weak_timeseries_errors=true) @test abs(sim.𝒪est[:weak_final]-1) < 0.3 @test abs(sim.𝒪est[:weak_l2]-1) < 0.3 @test abs(sim.𝒪est[:weak_l∞]-1) < 0.3 -sim2 = test_convergence(dts,prob,RKMil(),numMonte=Int(1e4),weak_timeseries_errors=true) +sim2 = test_convergence(dts,prob,RKMil(),numMonte=Int(1e4), + weak_timeseries_errors=true) @test abs(sim2.𝒪est[:weak_final]-1) < 0.3 @test abs(sim2.𝒪est[:weak_l2]-1) < 0.3 @test abs(sim2.𝒪est[:weak_l∞]-1) < 0.3 -sim3 = test_convergence(dts,prob,SRI(),numMonte=Int(1e4),weak_timeseries_errors=true) +sim3 = test_convergence(dts,prob,SRI(),numMonte=Int(1e4), + weak_timeseries_errors=true) @test abs(sim3.𝒪est[:weak_final]-2) < 0.3 @test abs(sim3.𝒪est[:weak_l2]-2) < 0.3 @test abs(sim3.𝒪est[:weak_l∞]-2) < 0.3 -sim4 = test_convergence(dts,prob,SRIW1(),numMonte=Int(1e4),weak_timeseries_errors=true) +sim4 = test_convergence(dts,prob,SRIW1(),numMonte=Int(1e4), + weak_timeseries_errors=true) @test abs(sim4.𝒪est[:weak_final]-2) < 0.3 @test abs(sim4.𝒪est[:weak_l2]-2) < 0.3 @test abs(sim4.𝒪est[:weak_l∞]-2) < 0.35 prob = prob_sde_additive -sim = test_convergence(dts,prob,EM(),numMonte=Int(1e4),weak_timeseries_errors=true) +sim = test_convergence(dts,prob,EM(),numMonte=Int(1e4), + weak_timeseries_errors=true) @test abs(sim.𝒪est[:weak_final]-1) < 0.3 @test abs(sim.𝒪est[:weak_l2]-1) < 0.3 @test abs(sim.𝒪est[:weak_l∞]-1) < 0.3 -sim2 = test_convergence(dts,prob,RKMil(),numMonte=Int(1e4),weak_timeseries_errors=true) +sim2 = test_convergence(dts,prob,RKMil(),numMonte=Int(1e4), + weak_timeseries_errors=true) @test abs(sim2.𝒪est[:weak_final]-1) < 0.3 @test abs(sim2.𝒪est[:weak_l2]-1) < 0.3 @test abs(sim2.𝒪est[:weak_l∞]-1) < 0.3 -sim3 = test_convergence(dts,prob,SRI(),numMonte=Int(1e4),weak_timeseries_errors=true) +sim3 = test_convergence(dts,prob,SRI(),numMonte=Int(1e4), + weak_timeseries_errors=true) @test abs(sim3.𝒪est[:weak_final]-2) < 0.3 @test abs(sim3.𝒪est[:weak_l2]-2) < 0.3 @test abs(sim3.𝒪est[:weak_l∞]-2) < 0.3 -sim4 = test_convergence(dts,prob,SRIW1(),numMonte=Int(1e4),weak_timeseries_errors=true) +sim4 = test_convergence(dts,prob,SRIW1(),numMonte=Int(1e4), + weak_timeseries_errors=true) @test abs(sim4.𝒪est[:weak_final]-2) < 0.3 @test abs(sim4.𝒪est[:weak_l2]-2) < 0.3 @test abs(sim4.𝒪est[:weak_l∞]-2) < 0.35 -sim5 = test_convergence(dts,prob,SRA(),numMonte=Int(1e4),weak_timeseries_errors=true) +sim5 = test_convergence(dts,prob,SRA(),numMonte=Int(1e4), + weak_timeseries_errors=true) @test abs(sim5.𝒪est[:weak_final]-2) < 0.3 @test abs(sim5.𝒪est[:weak_l2]-2) < 0.3 @test abs(sim5.𝒪est[:weak_l∞]-2) < 0.3 -sim6 = test_convergence(dts,prob,SRA1(),numMonte=Int(1e4),weak_timeseries_errors=true) +sim6 = test_convergence(dts,prob,SRA1(),numMonte=Int(1e4), + weak_timeseries_errors=true) @test abs(sim6.𝒪est[:weak_final]-2) < 0.3 @test abs(sim6.𝒪est[:weak_l2]-2) < 0.3 @test abs(sim6.𝒪est[:weak_l∞]-2) < 0.3