|
|
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 |
|
|
|