我已经编写了下面的代码来显示量子行走,它本质上是"硬币投掷"的数字线上的概率分布。函数"get_p(N)"生成一个数组,其中包含N移动后该行上所有可能位置的概率值。
N=10
def get_p(N):
P = 2*N+1 # number of positions
# do all your p stuff here
#defining a quantum coin
coin0 = array([1, 0]) # |0>
coin1 = array([0, 1]) # |1>
#defining the coin operator
C00 = outer(coin0, coin0) # |0><0|
C01 = outer(coin0, coin1) # |0><1|
C10 = outer(coin1, coin0) # |1><0|
C11 = outer(coin1, coin1) # |1><1|
C_hat = (C00 + C01 + C10 - C11)/sqrt(2.)
#step operator
ShiftPlus = roll(eye(P), 1, axis=0)
ShiftMinus = roll(eye(P), -1, axis=0)
S_hat = kron(ShiftPlus, C00) + kron(ShiftMinus, C11)
#walk operator
U = S_hat.dot(kron(eye(P), C_hat))
#defining the initial state
posn0 = zeros(P)
posn0[N] = 1 # array indexing starts from 0, so index N is the central posn
psi0 = kron(posn0,(coin0+coin1*1j)/sqrt(2.))
#the state after N steps
psiN = linalg.matrix_power(U, N).dot(psi0)
prob = empty(P)
for k in range(P):
posn = zeros(P)
posn[k] = 1
M_hat_k = kron( outer(posn,posn), eye(2))
proj = M_hat_k.dot(psiN)
prob[k] = proj.dot(proj.conjugate()).real
return prob
Z = []
for i in range(N):
Z.append(get_p(i))
X = arange(2*N+1)
Y = arange(N)
Z本质上是一个三角形数组(如果你想象当N=0时,中间的概率将是1,那么之后可能有3个位置,以此类推)。当N=3时打印Z给出:
[array([ 1.]), array([ 0.5, 0. , 0.5]), array([ 0.25, 0. , 0.5 , 0. , 0.25])]
我的问题是,我如何处理这些,以便绘制它们?这是完成的文章应该看起来像一个图像。
您的Z
'数组'实际上是一个不同长度的numpy数组列表。
我认为最好将Z定义为一个事先用零填充的单个数组,然后用您的值填充它。也许像这样:
Z=np.zeros((10,19))
for i in range(N):
x = coin.get_p(i)
l = len(x)
Z[i,0:l] = x
关于情节,我不清楚你到底想要什么。试着看看下面的例子:
http://matplotlib.org/examples/mplot3d/index.html