from matplotlib import pyplot

# time increment
dt = 0.001

def f_p1(p1, p2, q1, q2):
    return 2*q1*(2-p2**2/8.0-q2**2*(1+q2**2/(p1**2+p2**2)**2))

def f_p2(p1, p2, q1, q2):
    return 2*q2*(2-p1**2/8.0-q1**2*(1+q1**2/(q1**2+q2**2)**2))

def f_q1(p1, p2, q1, q2):
    return p1*q2**2/4.0 

def f_q2(p1, p2, q1, q2):
    return p2*q1**2/4.0

#	foutrh order Runge-Kutta routine
def rk4(p1, p2, q1, q2):
    global dt
    k1p1 = dt * f_p1(p1, p2, q1, q2)
    k1p2 = dt * f_p2(p1, p2, q1, q2)
    k1q1 = dt * f_q1(p1, p2, q1, q2)
    k1q2 = dt * f_q2(p1, p2, q1, q2)

    k2p1 = dt * f_p1(p1 + k1p1/2.0, p2 + k1p2/2.0, q1 + k1q1/2.0, q2 + k1q2/2.0)
    k2p2 = dt * f_p2(p1 + k1p1/2.0, p2 + k1p2/2.0, q1 + k1q1/2.0, q2 + k1q2/2.0)
    k2q1 = dt * f_q1(p1 + k1p1/2.0, p2 + k1p2/2.0, q1 + k1q1/2.0, q2 + k1q2/2.0)
    k2q2 = dt * f_q2(p1 + k1p1/2.0, p2 + k1p2/2.0, q1 + k1q1/2.0, q2 + k1q2/2.0)

    k3p1 = dt * f_p1(p1 + k2p1/2.0, p2 + k2p2/2.0, q1 + k2q1/2.0, q2 + k2q2/2.0)
    k3p2 = dt * f_p2(p1 + k2p1/2.0, p2 + k2p2/2.0, q1 + k2q1/2.0, q2 + k2q2/2.0)
    k3q1 = dt * f_q1(p1 + k2p1/2.0, p2 + k2p2/2.0, q1 + k2q1/2.0, q2 + k2q2/2.0)
    k3q2 = dt * f_q2(p1 + k2p1/2.0, p2 + k2p2/2.0, q1 + k2q1/2.0, q2 + k2q2/2.0)

    k4p1 = dt * f_p1(p1 + k3p1, p2 + k3p2, q1 + k3q1, q2 + k3q2)
    k4p2 = dt * f_p2(p1 + k3p1, p2 + k3p2, q1 + k3q1, q2 + k3q2)
    k4q1 = dt * f_q1(p1 + k3p1, p2 + k3p2, q1 + k3q1, q2 + k3q2)
    k4q2 = dt * f_q2(p1 + k3p1, p2 + k3p2, q1 + k3q1, q2 + k3q2)

    p1 = p1 + k1p1/6.0 + k2p1/3.0 + k3p1/3.0 +k4p1/6.0
    p2 = p2 + k1p2/6.0 + k2p2/3.0 + k3p2/3.0 +k4p2/6.0
    q1 = q1 + k1q1/6.0 + k2q1/3.0 + k3q1/3.0 +k4q1/6.0
    q2 = q2 + k1q2/6.0 + k2q2/3.0 + k3q2/3.0 +k4q2/6.0

    return [p1, p2, q1, q2]

# list of all points to be plotted
all_p1 = []
all_p2 = []
all_q1 = []
all_q2 = []

i = 0
while i < 10:
	# set initial values
    p1 = 1 + i / 20.0
    p2 = 1 + i / 20.0
    q1 = 2 + i / 20.0
    q2 = 2 + i / 20.0

	# list of points for one orbit
    list_p1 = [p1]
    list_p2 = [p2]
    list_q1 = [q1]
    list_q2 = [q2]

    t = 1
    while t < 20000:
        [p1, p2, q1, q2] = rk4(list_p1[t-1], list_p2[t-1], list_q1[t-1], list_q2[t-1])
        list_p1.append(p1)
        list_p2.append(p2)
        list_q1.append(q1)
        list_q2.append(q2)
        t = t + 1

    all_q1 = all_q1 + list_q1
    all_q2 = all_q2 + list_q2
    i = i + 1

# draw graph using [all_x, all_y, all_z]
all_r1 = [x**2 for x in all_q1]
all_r2 = [x**2 for x in all_q2]
fig = pyplot.figure()
ax = fig.add_subplot(111)
ax.scatter(all_r1, all_r2, s=0.1)
ax.set_xlabel('r1')
ax.set_ylabel('r2')
pyplot.show()
