@@ -27,7 +27,13 @@ function build_solution(
2727 N = length ((size (prob. u0)... , length (u)))
2828 end
2929
30- if has_analytic (prob. f)
30+ if typeof (prob. f) <: Tuple
31+ f = prob. f[1 ]
32+ else
33+ f = prob. f
34+ end
35+
36+ if has_analytic (f)
3137 u_analytic = Vector {typeof(prob.u0)} (0 )
3238 errors = Dict {Symbol,eltype(prob.u0)} ()
3339 sol = ODESolution{T,N,typeof (u),typeof (u_analytic),typeof (errors),typeof (t),typeof (k),
@@ -45,9 +51,16 @@ function build_solution(
4551end
4652
4753function calculate_solution_errors! (sol:: AbstractODESolution ;fill_uanalytic= true ,timeseries_errors= true ,dense_errors= true )
54+
55+ if typeof (sol. prob. f) <: Tuple
56+ f = sol. prob. f[1 ]
57+ else
58+ f = sol. prob. f
59+ end
60+
4861 if fill_uanalytic
4962 for i in 1 : size (sol. u,1 )
50- push! (sol. u_analytic,sol . prob . f (Val{:analytic },sol. t[i],sol. prob. u0))
63+ push! (sol. u_analytic,f (Val{:analytic },sol. t[i],sol. prob. u0))
5164 end
5265 end
5366
@@ -61,7 +74,7 @@ function calculate_solution_errors!(sol::AbstractODESolution;fill_uanalytic=true
6174 if sol. dense && dense_errors
6275 densetimes = collect (linspace (sol. t[1 ],sol. t[end ],100 ))
6376 interp_u = sol (densetimes)
64- interp_analytic = [sol . prob . f (Val{:analytic },t,sol. u[1 ]) for t in densetimes]
77+ interp_analytic = [f (Val{:analytic },t,sol. u[1 ]) for t in densetimes]
6578 sol. errors[:L∞ ] = maximum (vecvecapply ((x)-> abs .(x),interp_u- interp_analytic))
6679 sol. errors[:L2 ] = sqrt (recursive_mean (vecvecapply ((x)-> float .(x).^ 2 ,interp_u- interp_analytic)))
6780 end
0 commit comments