from matplotlib import pylab
from mpl_toolkits.mplot3d import axes3d

# time increment
dt = 0.001

a = 0.2
b = 0.2
c = 5.7

def f_dx(x, y, z):
    global a, b, c
    return -y - z

def f_dy(x, y, z):
    global a, b, c
    return x + a*y

def f_dz(x,y,z):
    global a, b, c
    return b + z*(x - c)

	
#	foutrh order Runge-Kutta routine	
def rk4(x, y, z):
    global dt
    k1x = dt * f_dx(x, y, z)
    k1y = dt * f_dy(x, y, z)
    k1z = dt * f_dz(x, y, z)

    k2x = dt * f_dx(x + k1x/2.0, y + k1y/2.0, z + k1z/2.0)
    k2y = dt * f_dy(x + k1x/2.0, y + k1y/2.0, z + k1z/2.0)
    k2z = dt * f_dz(x + k1x/2.0, y + k1y/2.0, z + k1z/2.0)

    k3x = dt * f_dx(x + k2x/2.0, y + k2y/2.0, z + k2z/2.0)
    k3y = dt * f_dy(x + k2x/2.0, y + k2y/2.0, z + k2z/2.0)
    k3z = dt * f_dz(x + k2x/2.0, y + k2y/2.0, z + k2z/2.0)

    k4x = dt * f_dx(x + k3x, y + k3y, z + k3z)
    k4y = dt * f_dy(x + k3x, y + k3y, z + k3z)
    k4z = dt * f_dz(x + k3x, y + k3y, z + k3z)

    x = x + k1x/6.0 + k2x/3.0 + k3x/3.0 +k4x/6.0
    y = y + k1y/6.0 + k2y/3.0 + k3y/3.0 +k4y/6.0
    z = z + k1z/6.0 + k2z/3.0 + k3z/3.0 +k4z/6.0

    return [x, y, z]
	
# list of all points to be plotted
all_x = []
all_y = []
all_z = []

i = 0

while i < 10:
	# set initial values
    x = -9 + (i - 5) / 2.0
    y = 0 + (i - 5) / 2.0
    z = 0 + (i - 5) / 2.0
	
	# list of points for one orbit
    list_x = [x]
    list_y = [y]
    list_z = [z]

    t = 1
    while t < 20000:
        [x, y, z] = rk4(list_x[t-1], list_y[t-1], list_z[t-1])
        list_x.append(x)
        list_y.append(y)
        list_z.append(z)
        t = t + 1
    all_x = all_x + list_x
    all_y = all_y + list_y
    all_z = all_z + list_z
    i = i + 1

# draw graph using [all_x, all_y, all_z]
fig = pylab.figure()
ax = axes3d.Axes3D(fig)
ax.scatter3D(all_x, all_y, all_z, s = 0.1)
ax.set_xlabel('X')
ax.set_ylabel('Y')
ax.set_zlabel('Z')
pylab.show()
