The following edited code runs, but I have no idea if it is correct nor efficient:
function rkf45(f::Function, t0::Number, tf::Number, conds, epsilon::Float64, dtInitial::Float64)
dt = dtInitial;
t = Float64[t0]
vars = conds
i = 1
while ( t[i] < tf )
varsi = vars[i,:]
dt = minimum((dt, tf-t[i]))
K1 = dt*f(t[i], varsi)
K2 = dt*f(t[i] + dt/4, varsi + K1/4)
K3 = dt*f(t[i] + 3*dt/8, varsi + 3*K1/32 + 9*K2/32)
K4 = dt*f(t[i] + 12*dt/13, varsi + 1932*K1/2197 - 7200*K2/2197 + 7296*K3/2197)
K5 = dt*f(t[i] + dt, varsi + 439*K1/216 - 8*K2 + 3680*K3/513 - 845*K4/4104)
K6 = dt*f(t[i] + dt/2, varsi - 8*K1/27 + 2*K2 - 3544*K3/2565 + 1859*K4/4104 - 11*K5/40)
vars1 = varsi + 25*K1/216 + 1408*K3/2565 + 2197*K4/4104 - K5/5
vars2 = varsi + 16*K1/135 + 6656*K3/12825 + 28561*K4/56430 - 9*K5/50 + 2*K6/55
R = minimum(abs.(vars2-vars1)/dt)
s = (epsilon/(2*R))^(1/4) # can R = 0 depending on initial conditions?
if ( R <= epsilon )
t = vcat(t, t[i]+dt)
vars = vcat(vars, vars1')
i += 1
end
dt *= s
end
solution = solObj(t, vars)
return solution;
end
To call the function, the initial conditions should be a row vector :
sol = rkf45(f, 0.0, 10, [0.5 0.5], 1e-6, 0.1)