問題点、欲しいもの
量子ウォークという、いわゆるランダムウォークの量子版という物を勉強しています。
全確率が保存するように、以下の周期境界条件をつかって、時間t=0で(0,0)にだけ確率1をもってブルーの2n*2nの正方格子上に時間毎に1移動していくようにコードを書いたのですが、t>2秒以降の時間発展で確率が保存されず、どんどん減っていってしまい原因が全く分からず、かれこれ1カ月経過しようてしており、お力を借りたく質問させて頂きました。
前提
物理的背景を除いて、量子状態の時間発展の式は
ψ(t+1,x,y) = Pψ(t,x-1,y) + Qψ(t,x+1,y) + Rψ(t,x,y+1) + Sψ(t,x,y-1)
と表せるとします。
P~Rは44の行列で、ψは[a,b,c,d]のような4状態で表すとします。
このψから確率pは**p(t,x,y) = ψ(t,x,y).ψ(t,x,y) **と算出できます。(*は複素共役)。
以上を踏まえて、以下にコードと結果をリポジっトします。
コード内容
python
1import numpy as np 2import matplotlib.pyplot as plt 3import math 4import itertools 5 6n = 3 7itr = 3 8x_list=[i for i in range(0,2*n+1)] 9y_list=[i for i in range(0,2*n+1)] 10##### 11P = [[-1/2, 1/2, 1/2, 1/2],[0,0,0,0],[0,0,0,0],[0,0,0,0]] #→ 12Q = [[0,0,0,0],[1/2, -1/2, 1/2, 1/2],[0,0,0,0],[0,0,0,0]] #← 13R = [[0,0,0,0],[0,0,0,0],[1/2, 1/2, -1/2, 1/2],[0,0,0,0]] #↓ 14S = [[0,0,0,0],[0,0,0,0],[0,0,0,0],[1/2, 1/2, 1/2, -1/2]] #↑ 15#### 16phi_map = np.zeros((2*n+1, 2*n+1,4),dtype="complex") 17phi_map[0,0]= np.array([1,0,0,0]) 18#t+1の状態を収納する用 19next_phi_map = np.zeros((2*n+1, 2*n+1, 4),dtype="complex") 20#確率収納 21p_map=np.zeros([2*n+1,2*n+1]) 22p_map[0,0] = np.real(np.inner(phi_map[0,0], np.conj(phi_map[0,0]))) 23##main計算 24for t in range(0,itr+1): 25 if t == 0: 26 p_map 27 phi_map 28 else: 29 for i in itertools.product(x_list,y_list): 30 if i[0]==0: #x座標が0のときで場合分け 31 if i[1]==0: #y =0 32 next_phi_map[i] = np.array([np.dot(P, phi_map[i[0]+2*n,0]) + np.dot(Q, phi_map[i[0]+1,i[0]]) + np.dot(R, phi_map[i[0],i[1]+1]) 33 + np.dot(S, phi_map[i[0],i[1]+2*n])]) 34 elif i[1] == 2*n: 35 next_phi_map[i] = np.array([np.dot(P, phi_map[2*n,i[1]]) + np.dot(Q, phi_map[i[0]+1, i[1]]) 36 + np.dot(R, phi_map[i[0], 0]) 37 + np.dot(S, phi_map[0,2*n-1])]) 38 else: 39 next_phi_map[i] = np.array([np.dot(P, phi_map[2*n,i[1]]) + np.dot(Q, phi_map[i[0]+1,i[1]]) + np.dot(R, phi_map[i[0],i[1]+1]) 40 + np.dot(S, phi_map[i[0],i[1]-1])]) 41 elif i[0] == 2*n:#x=2nの時で場合分け 42 if i[1] == 0: #y=0 43 next_phi_map[i] = np.array([np.dot(P, phi_map[i[0]-1,i[1]]) + np.dot(Q, phi_map[0,i[1]]) + np.dot(R, phi_map[i[0],i[1]+1]) 44 + np.dot(S, phi_map[i[0],2*n])]) 45 elif i[1] == 2*n: 46 next_phi_map[i] = np.array([np.dot(P, phi_map[i[0]-1,i[1]]) + np.dot(Q, phi_map[0, i[1]]) + np.dot(R, phi_map[i[0], 0]) + np.dot(S, phi_map[i[0],i[1]-1])]) 47 else: 48 next_phi_map[i] = np.array([np.dot(P, phi_map[2*n-1,i[1]]) + np.dot(Q, phi_map[0,i[1]]) + np.dot(R, phi_map[2*n, i[1]+1])+ np.dot(S, phi_map[2*n, i[1]-1])]) 49 else: #xがそれ以外のときのyで場合分け 50 if i[1] == 0: 51 next_phi_map[i] = np.array([np.dot(P, phi_map[i[0]-1,i[1]]) + np.dot(Q, phi_map[i[0]+1,i[1]]) + np.dot(R, phi_map[i[0],i[1]+1]) 52 + np.dot(S, phi_map[i[0],2*n])]) 53 elif i[1] == 2*n: 54 next_phi_map[i] = np.array([np.dot(P, phi_map[i[0]-1, i[1]]) + np.dot(Q, phi_map[i[0]+1,i[1]]) + np.dot(R, phi_map[i[0],0]) 55 + np.dot(S, phi_map[i[0],i[1]-1])]) 56 else: 57 next_phi_map[i] = np.array([np.dot(P, phi_map[i[0]-1,i[1]]) + np.dot(Q, phi_map[i[0]+1,i[1]]) + np.dot(R, phi_map[i[0],i[1]+1]) 58 + np.dot(S, phi_map[i[0],i[1]-1])]) 59 p_map[i] = np.real(np.inner(next_phi_map[i], np.conj(next_phi_map[i]))) 60 phi_map = next_phi_map 61 print(t,np.real(p_map),p_map.sum())
結果
0 [[1. 0. 0. 0. 0. 0. 0.] [0. 0. 0. 0. 0. 0. 0.] [0. 0. 0. 0. 0. 0. 0.] [0. 0. 0. 0. 0. 0. 0.] [0. 0. 0. 0. 0. 0. 0.] [0. 0. 0. 0. 0. 0. 0.] [0. 0. 0. 0. 0. 0. 0.]] 1.0 1 [[0. 0.25 0. 0. 0. 0. 0.25] [0.25 0. 0. 0. 0. 0. 0. ] [0. 0. 0. 0. 0. 0. 0. ] [0. 0. 0. 0. 0. 0. 0. ] [0. 0. 0. 0. 0. 0. 0. ] [0. 0. 0. 0. 0. 0. 0. ] [0.25 0. 0. 0. 0. 0. 0. ]] 1.0 2 (行列は省略) 0.8534011840820312 3 (行列は省略) 0.7919882354326546
とt>2で既に確率が保存されていない状況が生まれてしまい、コードを見直しても原因がわかりません。
怪しいと思ったこと何でも言ってください。
よろしくお願い致します。
回答2件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2018/07/31 03:55
2018/07/31 03:57
2018/07/31 12:10
2018/07/31 14:47