def sympletic_integrator_step(dt: float, bodies: list, pairs: list, ax: Axes3D, *args, **kwargs): """A sympletic integrator to update the positions of bodies in our system of bodies. Reference --------- [1]: Sympletic Integrator on Wikipedia https://en.wikipedia.org/wiki/Symplectic_integrator """ for (([x1, y1, z1], v1, m1), ([x2, y2, z2], v2, m2)) in pairs: dx = x1 - x2 dy = y1 - y2 dz = z1 - z2 mag = dt * ((dx * dx + dy * dy + dz * dz)**(-1.5)) b1m = m1 * mag b2m = m2 * mag v1[0] -= dx * b2m v1[1] -= dy * b2m v1[2] -= dz * b2m v2[0] += dx * b1m v2[1] += dy * b1m v2[2] += dz * b1m for (r, [vx, vy, vz], m) in bodies: r[0] += dt * vx r[1] += dt * vy r[2] += dt * vz ax.clear() ax.axis("off") ax.set_xlim(-20., 20.) ax.set_ylim(-20., 20.) ax.set_zlim(-20., 20.) for ii in range(360): ax.view_init(elev=90., azim=ii) for name, body in BODIES.items(): pos, _, mass = body sc = ax.scatter(*pos, s=20 * (mass**0.3), label=name) ax.legend() return sc