Comparison of ODE solvers

Alfonso R. Reyes

2017-07-12

Comparison of solutions: RK45

library(rODE)
## 
## Attaching package: 'rODE'
## The following object is masked from 'package:stats':
## 
##     step
# ODETest.R


setClass("ODETest", slots = c(
    n     = "numeric"           # counts the number of getRate evaluations
    ),
    contains = c("ODE")
    )


setMethod("initialize", "ODETest", function(.Object, ...) {
    .Object@n <-  0
    .Object@state <- c(5.0, 0.0)
    return(.Object)
})
## [1] "initialize"
setMethod("getExactSolution", "ODETest", function(object, t, ...) {
    # analytical solution
    return(5.0 * exp(-t))
})
## [1] "getExactSolution"
setMethod("getState", "ODETest", function(object, ...) {
    object@state
})
## [1] "getState"
setMethod("getRate", "ODETest", function(object, state, ...) {
    object@rate[1] <- - state[1]
    object@rate[2] <-  1            # rate of change of time, dt/dt

    object@n <- object@n + 1
    object@rate
})
## [1] "getRate"
# constructor
ODETest <- function() {
    odetest <- new("ODETest")
    odetest
}

# This script can also be found in:
# ComparisonRK45App.R
# 
# Compares the solution by the RK45 ODE solver versus the analytical solution

ComparisonRK45App <- function(verbose = FALSE) {
    ode <- new("ODETest")
    
    ode_solver <- RK45(ode)
    
    ode_solver <- setStepSize(ode_solver, 1)
    ode_solver <- setTolerance(ode_solver, 1e-8)
    
    time <-  0
    
    while (time < 50) {
        ode_solver <- step(ode_solver)
        stepSize <-  ode_solver@stepSize     # update the step size
        time <- time + stepSize
        # ode <- ode_solver@ode
        state <- getState(ode_solver@ode)
        if (verbose)
            cat(sprintf("time=%10f xl=%14e error=%14e n=%5d \n", 
                        time, state[1],
                    (state[1] - getExactSolution(ode_solver@ode, time)),
                    ode_solver@ode@n))
    }
    cat("rate steps evaluated #", ode_solver@ode@n)
}


ComparisonRK45App(verbose = TRUE)
## time=  0.063874 xl=  4.690617e+00 error= -4.288925e-11 n=    0 
## time=  0.127748 xl=  4.400378e+00 error= -8.047341e-11 n=    0 
## time=  0.191621 xl=  4.128097e+00 error= -1.132419e-10 n=    0 
## time=  0.255495 xl=  3.872665e+00 error= -1.416458e-10 n=    0 
## time=  0.319369 xl=  3.633037e+00 error= -1.661009e-10 n=    0 
## time=  0.383243 xl=  3.408238e+00 error= -1.869878e-10 n=    0 
## time=  0.447116 xl=  3.197347e+00 error= -2.046545e-10 n=    0 
## time=  0.510990 xl=  2.999506e+00 error= -2.194187e-10 n=    0 
## time=  0.574864 xl=  2.813907e+00 error= -2.315725e-10 n=    0 
## time=  0.638738 xl=  2.639792e+00 error= -2.413807e-10 n=    0 
## time=  0.702611 xl=  2.476451e+00 error= -2.490892e-10 n=    0 
## time=  0.766485 xl=  2.323217e+00 error= -2.549192e-10 n=    0 
## time=  0.830359 xl=  2.179464e+00 error= -2.590741e-10 n=    0 
## time=  0.894233 xl=  2.044606e+00 error= -2.617395e-10 n=    0 
## time=  0.958107 xl=  1.918093e+00 error= -2.630831e-10 n=    0 
## time=  1.021980 xl=  1.799408e+00 error= -2.632583e-10 n=    0 
## time=  1.085854 xl=  1.688067e+00 error= -2.624043e-10 n=    0 
## time=  1.149728 xl=  1.583615e+00 error= -2.606482e-10 n=    0 
## time=  1.213602 xl=  1.485626e+00 error= -2.581049e-10 n=    0 
## time=  1.277475 xl=  1.393701e+00 error= -2.548779e-10 n=    0 
## time=  1.341349 xl=  1.307463e+00 error= -2.510621e-10 n=    0 
## time=  1.405223 xl=  1.226562e+00 error= -2.467428e-10 n=    0 
## time=  1.469097 xl=  1.150666e+00 error= -2.419969e-10 n=    0 
## time=  1.561338 xl=  1.079467e+00 error=  3.019212e-02 n=    0 
## time=  1.653580 xl=  9.843494e-01 error=  2.753173e-02 n=    0 
## time=  1.745822 xl=  8.976131e-01 error=  2.510576e-02 n=    0 
## time=  1.838064 xl=  8.185195e-01 error=  2.289356e-02 n=    0 
## time=  1.930306 xl=  7.463954e-01 error=  2.087628e-02 n=    0 
## time=  2.022548 xl=  6.806264e-01 error=  1.903676e-02 n=    0 
## time=  2.114789 xl=  6.206528e-01 error=  1.735933e-02 n=    0 
## time=  2.207031 xl=  5.659637e-01 error=  1.582970e-02 n=    0 
## time=  2.299273 xl=  5.160936e-01 error=  1.443486e-02 n=    0 
## time=  2.391515 xl=  4.706178e-01 error=  1.316293e-02 n=    0 
## time=  2.483757 xl=  4.291491e-01 error=  1.200307e-02 n=    0 
## time=  2.575999 xl=  3.913345e-01 error=  1.094542e-02 n=    0 
## time=  2.668240 xl=  3.568519e-01 error=  9.980957e-03 n=    0 
## time=  2.760482 xl=  3.254077e-01 error=  9.101481e-03 n=    0 
## time=  2.852724 xl=  2.967343e-01 error=  8.299501e-03 n=    0 
## time=  2.944966 xl=  2.705874e-01 error=  7.568187e-03 n=    0 
## time=  3.037208 xl=  2.467445e-01 error=  6.901313e-03 n=    0 
## time=  3.129450 xl=  2.250025e-01 error=  6.293201e-03 n=    0 
## time=  3.221692 xl=  2.051763e-01 error=  5.738673e-03 n=    0 
## time=  3.313933 xl=  1.870971e-01 error=  5.233007e-03 n=    0 
## time=  3.446050 xl=  1.706110e-01 error=  1.125464e-02 n=    0 
## time=  3.578167 xl=  1.494959e-01 error=  9.861751e-03 n=    0 
## time=  3.710284 xl=  1.309941e-01 error=  8.641246e-03 n=    0 
## time=  3.842401 xl=  1.147821e-01 error=  7.571792e-03 n=    0 
## time=  3.974518 xl=  1.005765e-01 error=  6.634696e-03 n=    0 
## time=  4.106635 xl=  8.812897e-02 error=  5.813576e-03 n=    0 
## time=  4.238752 xl=  7.722200e-02 error=  5.094079e-03 n=    0 
## time=  4.370869 xl=  6.766489e-02 error=  4.463628e-03 n=    0 
## time=  4.502986 xl=  5.929059e-02 error=  3.911203e-03 n=    0 
## time=  4.635103 xl=  5.195269e-02 error=  3.427147e-03 n=    0 
## time=  4.767220 xl=  4.552295e-02 error=  3.002998e-03 n=    0 
## time=  4.899337 xl=  3.988896e-02 error=  2.631343e-03 n=    0 
## time=  5.031454 xl=  3.495225e-02 error=  2.305684e-03 n=    0 
## time=  5.163571 xl=  3.062650e-02 error=  2.020329e-03 n=    0 
## time=  5.352264 xl=  2.683612e-02 error=  3.149051e-03 n=    0 
## time=  5.540957 xl=  2.222140e-02 error=  2.607541e-03 n=    0 
## time=  5.729650 xl=  1.840022e-02 error=  2.159150e-03 n=    0 
## time=  5.918343 xl=  1.523612e-02 error=  1.787863e-03 n=    0 
## time=  6.107037 xl=  1.261613e-02 error=  1.480423e-03 n=    0 
## time=  6.295730 xl=  1.044667e-02 error=  1.225850e-03 n=    0 
## time=  6.484423 xl=  8.650262e-03 error=  1.015054e-03 n=    0 
## time=  6.673116 xl=  7.162767e-03 error=  8.405055e-04 n=    0 
## time=  6.861809 xl=  5.931061e-03 error=  6.959726e-04 n=    0 
## time=  7.050503 xl=  4.911159e-03 error=  5.762935e-04 n=    0 
## time=  7.320555 xl=  4.066638e-03 error=  7.576659e-04 n=    0 
## time=  7.590608 xl=  3.104224e-03 error=  5.783559e-04 n=    0 
## time=  7.860661 xl=  2.369576e-03 error=  4.414816e-04 n=    0 
## time=  8.130714 xl=  1.808790e-03 error=  3.370001e-04 n=    0 
## time=  8.400767 xl=  1.380720e-03 error=  2.572453e-04 n=    0 
## time=  8.670820 xl=  1.053958e-03 error=  1.963654e-04 n=    0 
## time=  8.940872 xl=  8.045272e-04 error=  1.498934e-04 n=    0 
## time=  9.210925 xl=  6.141271e-04 error=  1.144194e-04 n=    0 
## time=  9.615977 xl=  4.687872e-04 error=  1.355111e-04 n=    0 
## time= 10.021029 xl=  3.126539e-04 error=  9.037796e-05 n=    0 
## time= 10.426081 xl=  2.085220e-04 error=  6.027679e-05 n=    0 
## time= 10.831133 xl=  1.390720e-04 error=  4.020108e-05 n=    0 
## time= 11.236185 xl=  9.275297e-05 error=  2.681176e-05 n=    0 
## time= 11.817853 xl=  6.186084e-05 error=  2.500200e-05 n=    0 
## time= 12.399521 xl=  3.457798e-05 error=  1.397517e-05 n=    0 
## time= 12.981189 xl=  1.932785e-05 error=  7.811593e-06 n=    0 
## time= 13.562857 xl=  1.080357e-05 error=  4.366385e-06 n=    0 
## time= 14.439904 xl=  6.038807e-06 error=  3.360875e-06 n=    0 
## time= 15.316950 xl=  2.512251e-06 error=  1.398206e-06 n=    0 
## time= 16.193997 xl=  1.045141e-06 error=  5.816875e-07 n=    0 
## time= 17.553692 xl=  4.347974e-07 error=  3.158107e-07 n=    0 
## time= 18.913387 xl=  1.118798e-07 error=  8.133131e-08 n=    0 
## time= 20.956872 xl=  2.878834e-08 error=  2.482998e-08 n=    0 
## time= 23.000357 xl=  4.112791e-09 error=  3.599880e-09 n=    0 
## time= 26.781657 xl=  5.875659e-10 error=  5.758751e-10 n=    0 
## time= 30.562957 xl=  6.386756e-10 error=  6.384091e-10 n=    0 
## time= 34.344257 xl=  6.942310e-10 error=  6.942249e-10 n=    0 
## time= 38.125556 xl=  7.546190e-10 error=  7.546188e-10 n=    0 
## time= 41.906856 xl=  8.202598e-10 error=  8.202598e-10 n=    0 
## time= 45.688156 xl=  8.916104e-10 error=  8.916104e-10 n=    0 
## time= 49.469456 xl=  9.691675e-10 error=  9.691675e-10 n=    0 
## time= 53.250756 xl=  1.053471e-09 error=  1.053471e-09 n=    0 
## rate steps evaluated # 0

Plots

The figure sizes have been customised so that you can easily put two images side-by-side.

plot(1:10)
plot(10:1)

Data

mpg cyl disp hp drat wt qsec vs am gear carb
Mazda RX4 21.0 6 160.0 110 3.90 2.620 16.46 0 1 4 4
Mazda RX4 Wag 21.0 6 160.0 110 3.90 2.875 17.02 0 1 4 4
Datsun 710 22.8 4 108.0 93 3.85 2.320 18.61 1 1 4 1
Hornet 4 Drive 21.4 6 258.0 110 3.08 3.215 19.44 1 0 3 1
Hornet Sportabout 18.7 8 360.0 175 3.15 3.440 17.02 0 0 3 2
Valiant 18.1 6 225.0 105 2.76 3.460 20.22 1 0 3 1
Duster 360 14.3 8 360.0 245 3.21 3.570 15.84 0 0 3 4
Merc 240D 24.4 4 146.7 62 3.69 3.190 20.00 1 0 4 2
Merc 230 22.8 4 140.8 95 3.92 3.150 22.90 1 0 4 2
Merc 280 19.2 6 167.6 123 3.92 3.440 18.30 1 0 4 4