Skip to content

Commit 5a8d4b5

Browse files
recursive_mean
1 parent 890a220 commit 5a8d4b5

File tree

2 files changed

+27
-19
lines changed

2 files changed

+27
-19
lines changed

src/convergence.jl

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -40,16 +40,16 @@ function test_convergence(dts::AbstractArray,prob::Union{AbstractRODEProblem,Abs
4040
# Now Calculate Weak Errors
4141
additional_errors = Dict()
4242
# Final
43-
m_final = mean([s[end] for s in solutions],1)
44-
m_final_analytic = mean([s.u_analytic[end] for s in solutions],1)
45-
additional_errors[:weak_final] = mean.(vecvecapply((x)->abs.(x),m_final - m_final_analytic))
43+
m_final = recursive_mean([s[end] for s in solutions],1)
44+
m_final_analytic = recursive_mean([s.u_analytic[end] for s in solutions],1)
45+
additional_errors[:weak_final] = recursive_mean.(vecvecapply((x)->abs.(x),m_final - m_final_analytic))
4646
if timeseries_errors
4747
l2_tmp = Vector{eltype(solutions[1][1])}(size(solutions,2))
4848
max_tmp = Vector{eltype(solutions[1][1])}(size(solutions,2))
4949
for i in 1:size(solutions,2)
5050
solcol = @view solutions[:,i]
51-
m_errors = [mean([solcol[j][i] for j in 1:length(solcol)]) for i in 1:length(solcol[1])]
52-
m_errors_analytic = [mean([solcol[j].u_analytic[i] for j in 1:length(solcol)]) for i in 1:length(solcol[1])]
51+
m_errors = [recursive_mean([solcol[j][i] for j in 1:length(solcol)]) for i in 1:length(solcol[1])]
52+
m_errors_analytic = [recursive_mean([solcol[j].u_analytic[i] for j in 1:length(solcol)]) for i in 1:length(solcol[1])]
5353
ts_weak_errors = [abs.(m_errors[i] - m_errors_analytic[i]) for i in 1:length(m_errors)]
5454
ts_l2_errors = [sqrt.(sum(abs2,err)/length(err)) for err in ts_weak_errors]
5555
l2_tmp[i] = sqrt(sum(abs2,ts_l2_errors)/length(ts_l2_errors))

src/test_solution.jl

Lines changed: 22 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -2,16 +2,24 @@
22
TestSolution
33
44
"""
5-
type TestSolution{hasinterp} <: DESolution
6-
t
7-
u
8-
interp
9-
dense
5+
type TestSolution{T,N,hasinterp,tType,uType,iType} <: AbstractTimeseriesSolution{T,N}
6+
t::tType
7+
u::uType
8+
interp::iType
9+
dense::Bool
1010
end
1111
(T::TestSolution)(t) = T.interp(t)
12-
TestSolution(t,u) = TestSolution{false}(t,u,nothing,false)
13-
TestSolution(t,u,interp) = TestSolution{true}(t,u,interp,true)
14-
TestSolution(interp::DESolution) = TestSolution{true}(nothing,nothing,interp,true)
12+
function TestSolution(t,u)
13+
T = eltype(eltype(u))
14+
N = length((size(u[1])..., length(u)))
15+
TestSolution{T,N,false,typeof(t),typeof(u),Void}(t,u,nothing,false)
16+
end
17+
function TestSolution(t,u,interp)
18+
T = eltype(eltype(u))
19+
N = length((size(u[1])..., length(u)))
20+
TestSolution{T,N,length(true),typeof(t),typeof(u),typeof(interp)}(t,u,interp,true)
21+
end
22+
TestSolution(interp::DESolution) = TestSolution{Void,0,true,Void,Void,typeof(interp)}(nothing,nothing,interp,true)
1523

1624
"""
1725
`appxtrue(sol::AbstractODESolution,sol2::TestSolution)`
@@ -25,17 +33,17 @@ function appxtrue{hasinterp}(sol::AbstractODESolution,sol2::TestSolution{hasinte
2533
sol2.u = sol2(sol.t)
2634
sol2.t = sol.t
2735
end
28-
errors = Dict(:final=>mean(abs.(sol[end]-sol2[end])))
36+
errors = Dict(:final=>recursive_mean(abs.(sol[end]-sol2[end])))
2937
if sol2.dense
3038
timeseries_analytic = sol2(sol.t)
3139
errors[:l∞] = maximum(vecvecapply((x)->abs.(x),sol[:]-timeseries_analytic))
32-
errors[:l2] = sqrt(mean(vecvecapply((x)->float(x).^2,sol[:]-timeseries_analytic)))
40+
errors[:l2] = sqrt(recursive_mean(vecvecapply((x)->float(x).^2,sol[:]-timeseries_analytic)))
3341
if !(typeof(sol) <: AbstractRODESolution) && sol.dense
3442
densetimes = collect(linspace(sol.t[1],sol.t[end],100))
3543
interp_u = sol(densetimes)
3644
interp_analytic = sol2(densetimes)
3745
interp_errors = Dict(:L∞=>maximum(vecvecapply((x)->abs.(x),interp_u-interp_analytic)),
38-
:L2=>sqrt(mean(vecvecapply((x)->float(x).^2,interp_u-interp_analytic))))
46+
:L2=>sqrt(recursive_mean(vecvecapply((x)->float(x).^2,interp_u-interp_analytic))))
3947
errors = merge(errors,interp_errors)
4048
end
4149
end
@@ -56,15 +64,15 @@ errors for sol. If sol2 has no interpolant, only the final error is
5664
calculated.
5765
"""
5866
function appxtrue(sol::AbstractODESolution,sol2::AbstractODESolution)
59-
errors = Dict(:final=>mean(abs.(sol[end]-sol2[end])))
67+
errors = Dict(:final=>recursive_mean(abs.(sol[end]-sol2[end])))
6068
if !(typeof(sol2) <: AbstractRODESolution) && sol2.dense
6169
timeseries_analytic = sol2(sol.t)
62-
errors = Dict(:final=>mean(abs.(sol[end]-sol2[end])),:l∞=>maximum(vecvecapply((x)->abs.(x),sol[:]-timeseries_analytic)),:l2=>sqrt(mean(vecvecapply((x)->float(x).^2,sol[:]-timeseries_analytic))))
70+
errors = Dict(:final=>recursive_mean(abs.(sol[end]-sol2[end])),:l∞=>maximum(vecvecapply((x)->abs.(x),sol[:]-timeseries_analytic)),:l2=>sqrt(recursive_mean(vecvecapply((x)->float(x).^2,sol[:]-timeseries_analytic))))
6371
if !(typeof(sol) <: AbstractRODESolution) && sol.dense
6472
densetimes = collect(linspace(sol.t[1],sol.t[end],100))
6573
interp_u = sol(densetimes)
6674
interp_analytic = sol2(densetimes)
67-
interp_errors = Dict(:L∞=>maximum(vecvecapply((x)->abs.(x),interp_u-interp_analytic)),:L2=>sqrt(mean(vecvecapply((x)->float(x).^2,interp_u-interp_analytic))))
75+
interp_errors = Dict(:L∞=>maximum(vecvecapply((x)->abs.(x),interp_u-interp_analytic)),:L2=>sqrt(recursive_mean(vecvecapply((x)->float(x).^2,interp_u-interp_analytic))))
6876
errors = merge(errors,interp_errors)
6977
end
7078
end

0 commit comments

Comments
 (0)