Пример #1
0
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