The length of an arrow in the Bloch sphere

I'm trying to build something called bloch sphere. This represents a state of a quantum bits in the form of an arrow in a sphere, whose radius is 1.0.

I wrote the codes below.

from mpl_toolkits.mplot3d import Axes3D
import matplotlib.pyplot as plt
import numpy as np
from itertools import product, combinations

print("Put angle theta and phi, 0≤theta≤180, 0≤phi≤360")
theta = input("theta:")
phi = input("phi:")
theta = float(theta)
phi = float(phi)
X = np.sin(phi)
Y = np.sin(theta)
Z = np.cos(theta)

class quantum_gates:
def __init__(self,X,Y,Z):
    self.X = float(X)
    self.Y = float(Y)
    self.Z = float(Z)

    if theta <0 or theta >180 or phi < 0 or phi >360:
        print("Put the value of angles again")
        fig = plt.figure()
        ax = fig.gca(projection='3d')
        u, v = np.mgrid[0:2*np.pi:20j, 0:np.pi:10j]
        x = np.cos(u)*np.sin(v)
        y = np.sin(u)*np.sin(v)
        z = np.cos(v)
        ax.plot_wireframe(y, x, z, color="black")

When I put (theta, phi) = (30,0), the tip of the arrow reaches the surface of the sphere. However, when I put (theta,phi) = (30,30), the tip of the arrow goes outside of the sphere.

You can see the image of the current situation from the link below.

An arrow tip reaching outside of the sphere

1 answer

  • answered 2018-11-08 10:12 Poolka

    I guess you perform transformation between coordinates in a wrong way. X, Y, and Z should be calculated as follows (wikipedia link):

    X = np.sin(theta) * np.cos(phi)
    Y = np.sin(theta) * np.sin(phi)
    Z = np.cos(theta)

    Also, numpy trigonometric functions accept values in radians. So, theta should be in the range [0, pi], phi should be in the range [0, 2 * pi). To convert degrees to radians you may use numpy.radians().