def euler(t, g, y0, h): f = tensor(g(t), "j", "d") o = tensor(ones(N), "j", "u") T = tensor(tri(N), "ij", "dd") y = y0 + f * h * T * o t = append(t, t[-1]+h) y.arr = append(array([y0]),y.arr) return handle_3d(t, y.arr)
def RK5(t, g, y0, h): def k(x): a = (23*g(x) +125*g(x+h/3.) - 81*g(x+2*h/3) + 125*g(x+4.*h/5.)) / 192. return a f = tensor(k(t), "j", "d") o = tensor(ones(N), "j", "u") T = tensor(tri(N), "ij", "dd") y = y0 + f * h * T * o t = append(t,t[-1]+h) y.arr = append(array([y0]),y.arr) return handle_3d(t, y.arr)
def RK2(t, g, y0, h): def k(x): a = (g(x) + g(x+h)) / 2. return a f = tensor(k(t), "j", "d") o = tensor(ones(N), "j", "u") T = tensor(tri(N), "ij", "dd") y = y0 + f * h * T * o t = append(t, t[-1]+h) y.arr = append(array([y0]),y.arr) return handle_3d(t, y.arr)
def RK4(t, g, y0, h): def k(x, y): k1 = g(x, y) k2 = g(x+0.5*h, y+0.5*k1) k3 = g(x+0.5*h, y+0.5*k2) k4 = g(x+h, y+0.5*k3) a = (k1 + 2*k2 + 2*k3 + k4)/6. return a f = tensor(k(t), "j", "d") o = tensor(ones(N), "j", "u") y = y0 + f.convolve(o, idx="j") * h t = append(t, t[-1]+h) y.arr = append(array([y0]),y.arr) return handle_3d(t, y.arr)