Deepesh Thakur / Aug 26 2019
Remix of HIRES Work-Precision Diagrams by DTDeepesh Thakur
HIRES Work-Precision Diagrams (including ESERK4)
using Pkg Pkg.update() using OrdinaryDiffEq, ParameterizedFunctions, Plots, DiffEqDevTools gr() #gr(fmt=:png) f = Hires begin dy1 = -1.71*y1 + 0.43*y2 + 8.32*y3 + 0.0007 dy2 = 1.71*y1 - 8.75*y2 dy3 = -10.03*y3 + 0.43*y4 + 0.035*y5 dy4 = 8.32*y2 + 1.71*y3 - 1.12*y4 dy5 = -1.745*y5 + 0.43*y6 + 0.43*y7 dy6 = -280.0*y6*y8 + 0.69*y4 + 1.71*y5 - 0.43*y6 + 0.69*y7 dy7 = 280.0*y6*y8 - 1.81*y7 dy8 = -280.0*y6*y8 + 1.81*y7 end u0 = zeros(8) u0[1] = 1 u0[8] = 0.0057 prob = ODEProblem(f,u0,(0.0,321.8122)) sol = solve(prob,Rodas5(),abstol=1/10^14,reltol=1/10^14) test_sol = TestSolution(sol) abstols = 1.0 ./ 10.0 .^ (4:11) reltols = 1.0 ./ 10.0 .^ (1:8);
plot(sol,dpi=200,linewidth=1,legend=:topright,legendfontsize=6)
plot(sol,tspan=(0.0,5.0),dpi=200,linewidth=1,legend=:topright,legendfontsize=6)
High Tolerances
This is the speed when you just want the answer.
abstols = 1.0 ./ 10.0 .^ (5:8) reltols = 1.0 ./ 10.0 .^ (2:5); setups = [ Dict(:alg=>Rosenbrock23()), Dict(:alg=>Rodas3()), #Dict(:alg=>RKC()), Dict(:alg=>ROCK2()), Dict(:alg=>ROCK4()), Dict(:alg=>SERK2(controller=:PI)), #Dict(:alg=>SERK2(controller=:Predictive)), Dict(:alg=>ESERK4()), Dict(:alg=>ESERK5()) ] #Names = ["Rosen23" "Rodas4" "RKC" "ROCK2" "ROCK4" "SERK2 PI" "SERK2 Predictive" "ESERK5"] Names = ["Rosen23" "Rodas4" "ROCK2" "ROCK4" "SERK2 PI" "ESERK4" "ESERK5"]
1×7 Array{String,2}:
"Rosen23" "Rodas4" "ROCK2" "ROCK4" "SERK2 PI" "ESERK4" "ESERK5"
wp = WorkPrecisionSet(prob,abstols,reltols,setups;names=Names, save_everystep=false, appxsol=test_sol, maxiters=Int(1e6), numruns=50) plot(wp,dpi=200,linewidth=1,legend=:topright,legendfontsize=6)
wp = WorkPrecisionSet(prob,abstols,reltols,setups;names=Names, dense = false,verbose=false, appxsol=test_sol, maxiters=Int(1e6), error_estimate=:l2,numruns=50) plot(wp,dpi=200,linewidth=1,legend=:topright,legendfontsize=6)
wp = WorkPrecisionSet(prob,abstols,reltols,setups;names=Names, appxsol=test_sol, maxiters=Int(1e6), error_estimate=:L2,numruns=50) plot(wp,dpi=200,linewidth=1,legend=:topright,legendfontsize=6)
Low Tolerances
This is the speed at lower tolerances, measuring what's good when accuracy is needed.
abstols = 1.0 ./ 10.0 .^ (7:13) reltols = 1.0 ./ 10.0 .^ (4:10) wp = WorkPrecisionSet(prob,abstols,reltols,setups;names=Names, save_everystep=false,appxsol=test_sol,maxiters=Int(1e8),numruns=50) plot(wp,dpi=200,linewidth=1,legend=:topright,legendfontsize=6)
wp = WorkPrecisionSet(prob,abstols,reltols,setups;names=Names, verbose=false, dense=false,appxsol=test_sol,maxiters=Int(1e8),error_estimate=:l2,numruns=50) plot(wp,dpi=200,linewidth=1,legend=:topright,legendfontsize=6)
wp = WorkPrecisionSet(prob,abstols,reltols,setups;names=Names, appxsol=test_sol,maxiters=Int(1e8),error_estimate=:L2,numruns=50) plot(wp,dpi=200,linewidth=1,legend=:topright,legendfontsize=6)
Conclusion
We see a decent overall performance as compared to the implicit methods. RKC and SERK2 with Predictive control are omitted because the former takes can't complete within the given iterations and the latter goes unstable.