rk4 <- function(a, b, h, alpha, f) {
  n <- (b - a) / h
  W <- double(n + 1)
  t <- a
  W[1] <- w <- alpha
  for(i in 1:n) {
    k1 <- h * f(t, w)
    k2 <- h * f(t + h / 2, w + k1 / 2)
    k3 <- h * f(t + h / 2, w + k2 / 2)
    k4 <- h * f(t + h, w + k3)
    t <- a + i * h
    W[i + 1] <- w <- w + (k1 + 2 * k2 + 2 * k3 + k4) / 6
  }
  return(W)
}


pred_prey_euler <- function(a, b, h, x0, y0, const) {
  n <- ((b - a) / h)
  X <- Y <- T <- double(n + 1)
  X[1] <- x0; Y[1] <- y0; T[1] <- a
  for (i in 1:n) {
    X[i + 1] <- X[i] + h * X[i] * (const[1] - const[2] * Y[i])
    Y[i + 1] <- Y[i] + h * Y[i] * (const[4] * X[i] - const[3])
    T[i + 1] <- T[i] + h
  }
  return(list("T" = T, "X" = X, "Y" = Y))
}

van_der_pol_euler <- function(a, b, h, X0, mu) {
  n <- ((b - a) / h)
  X <- Y <- T <- double(n + 1)
  X1[1] <- X0[1]; X2[1] <- X0[2]; T[1] <- a
  for (i in 1:n) {
    X1[i + 1] <- X1[i] + h * X2[i]
    X2[i + 1] <- X2[i] + h * (mu * (1 - X1[i]^2) * X2[i] - X1[i])
    T[i + 1] <- T[i] + h
  }
  return(list("T" = T, "X" = X, "Y" = Y))
}