rk4.RdClassical Runge-Kutta of order 4.
rk4(f, a, b, y0, n)
rk4sys(f, a, b, y0, n)Classical Runge-Kutta of order 4 for (systems of) ordinary differential equations with fixed step size.
List with components x for grid points between a and b
and y an n-by-m matrix with solutions for variables in columns, i.e.
each row contains one time stamp.
Fausett, L. V. (2007). Applied Numerical Analysis Using Matlab. Second edition, Prentice Hall.
This function serves demonstration purposes only.
## Example1: ODE
# y' = y*(-2*x + 1/x) for x != 0, 1 if x = 0
# solution is x*exp(-x^2)
f <- function(x, y) {
if (x != 0) dy <- y * (- 2*x + 1/x)
else dy <- rep(1, length(y))
return(dy)
}
sol <- rk4(f, 0, 2, 0, 50)
if (FALSE) { # \dontrun{
x <- seq(0, 2, length.out = 51)
plot(x, x*exp(-x^2), type = "l", col = "red")
points(sol$x, sol$y, pch = "*")
grid()} # }
## Example2: Chemical process
f <- function(t, u) {
u1 <- u[3] - 0.1 * (t+1) * u[1]
u2 <- 0.1 * (t+1) * u[1] - 2 * u[2]
u3 <- 2 * u[2] - u[3]
return(c(u1, u2, u3))
}
u0 <- c(0.8696, 0.0435, 0.0870)
a <- 0; b <- 40
n <- 40
sol <- rk4sys(f, a, b, u0, n)
if (FALSE) { # \dontrun{
matplot(sol$x, sol$y, type = "l", lty = 1, lwd = c(2, 1, 1),
col = c("darkred", "darkblue", "darkgreen"),
xlab = "Time [min]", ylab= "Concentration [Prozent]",
main = "Chemical composition")
grid()} # }