use ndarray::*;
pub fn rk4_step<F>(f: F, x: &Array1<f64>, c: &Vec<f64>, t: &f64, step: f64) -> Array1<f64>
where
F: Fn(&f64, &Array1<f64>, &Vec<f64>) -> Array1<f64>,
{
let tmp = step/2.0;
let tmp_2 = tmp+t;
let k1 = f( &t, x, c );
let k2 = f( &tmp_2, &(x + &(&k1*tmp)), c );
let k3 = f( &tmp_2, &(x + &(&k2*tmp)), c );
let k4 = f( &t, &(x + &(&k3*step)), c );
let f_out = x + &((step/6.0)*( k1 + 2.0*k2 + 2.0*k3 + k4 ));
f_out
}
pub fn euler_step<F>(f: F, x: &Array1<f64>, c: &Vec<f64>, t: &f64, step: f64) -> Array1<f64>
where
F: Fn(&f64, &Array1<f64>, &Vec<f64>) -> Array1<f64>,
{
let k1 = f( &t, x, c );
let f_out = x + &(step*k1) ;
f_out
}