from ShapeID.DiffEqs.solvers import FixedGridODESolver import ShapeID.DiffEqs.rk_common as rk_common class Euler(FixedGridODESolver): def step_func(self, func, t, dt, y): return tuple(dt * f_ for f_ in func(t, y)) @property def order(self): return 1 class Midpoint(FixedGridODESolver): def step_func(self, func, t, dt, y): y_mid = tuple(y_ + f_ * dt / 2 for y_, f_ in zip(y, func(t, y))) return tuple(dt * f_ for f_ in func(t + dt / 2, y_mid)) @property def order(self): return 2 class RK4(FixedGridODESolver): def step_func(self, func, t, dt, y): return rk_common.rk4_alt_step_func(func, t, dt, y) @property def order(self): return 4