import numpy as np
from numba import njit

@njit
def Euler(func,y0,t):
    y=np.empty((len(t),len(y0)))
    y[0,:]= y0
    for n in range(len(t)-1):
        h= t[n+1]-t[n]
        y[n+1,:]= y[n,:] + h*func(t[n],y[n,:])
    return y

@njit
def RK4(func,y0,t):
    y=np.empty((len(t),len(y0)))
    y[0,:]= y0
    for n in range(len(t)-1):
        h= t[n+1]-t[n]
        h2= 0.5*h
        k1= func(t[n]   ,y[n,:]      )
        k2= func(t[n]+h2,y[n,:]+h2*k1)
        k3= func(t[n]+h2,y[n,:]+h2*k2)
        k4= func(t[n]+h ,y[n,:]+h *k3)
        y[n+1,:]= y[n,:] + h*(0.5*(k1+k4)+k2+k3)/3.0
    return y

