4状態4自由度の2次元量子ウォークをやっています。
上の図の(0,0)に確率1にスタートで1step毎に格子点に移動します。周期境界条件で計算を行いました。
python
1import numpy as np 2import matplotlib.pyplot as plt 3import math 4from mpl_toolkits.mplot3d import Axes3D 5from matplotlib import cm 6import matplotlib.colors as colors 7#import matplotlib.animation as animation 8 9n=1 10m=4 11 12 13#D##[26,26] 14P = [[-1/2, 1/2, 1/2, 1/2],[0,0,0,0],[0,0,0,0],[0,0,0,0]] #→ 15Q = [[0,0,0,0],[1/2, -1/2, 1/2, 1/2],[0,0,0,0],[0,0,0,0]] #← 16R = [[0,0,0,0],[0,0,0,0],[1/2, 1/2, -1/2, 1/2],[0,0,0,0]] #↓ 17S = [[0,0,0,0],[0,0,0,0],[0,0,0,0],[1/2, 1/2,-1/2, -1/2]] #↑ 18########## 19t_list = [] 20x_list = [] 21y_list = [] 22p_list=[] 23phi_map = np.zeros((2*m+1, 2*m+1,4),dtype="complex") #np.zeros((行,列,[]の中身の数)) 24phi_map[0,0]= np.array([1,0,0,0]) 25 26 27p_map=np.zeros([2*m+1,2*m+1]) 28 29for i in range(0,2*m+1): 30 p_map[i,i] = np.real(np.inner(phi_map[i,i], np.conj(phi_map[i,i]))) 31 #p_map[i,i]=p 32 x_list.append(i) 33 y_list.append(i) 34#print(p_map) 35print(p_map) 36for t in range(0,n+1): 37 t_list.append(t) 38 if t == 0: 39 print("foool") 40 else: 41 next_phi_map = np.zeros((2*m+1,2*m+1, 4),dtype="complex") 42 for x in range(0,2*m+1): 43 if x == 0: 44 for y in range(0,2*m+1): 45 if y == 0: 46 next_phi_map[x,y] = np.array([np.dot(P, phi_map[2*m,y]) + np.dot(Q, phi_map[x+1,y]) + np.dot(R, phi_map[x,y+1]) + np.dot(S, phi_map[x,2*m])]) 47 elif y == 2*m: 48 next_phi_map[x,y] = np.array([np.dot(P, phi_map[2*m,y]) + np.dot(Q, phi_map[x+1,y]) + np.dot(R, phi_map[x,0]) + np.dot(S, phi_map[x,y-1])]) 49 else: 50 next_phi_map[x,y] = np.array([np.dot(P, phi_map[2*m,y]) + np.dot(Q, phi_map[x+1,y]) + np.dot(R, phi_map[x,y+1]) + np.dot(S, phi_map[x,y-1])]) 51 elif x == 2*m: 52 for y in range(0,2*m+1): 53 if y == 0: 54 next_phi_map[x,y] = np.array([np.dot(P, phi_map[x-1,y]) + np.dot(Q, phi_map[0,y]) + np.dot(R, phi_map[x,y+1]) + np.dot(S, phi_map[x,2*m])]) 55 elif y == 2*m: 56 next_phi_map[x,y] = np.array([np.dot(P, phi_map[x-1,y]) + np.dot(Q, phi_map[0,y]) + np.dot(R, phi_map[x,0]) + np.dot(S, phi_map[x,y-1])]) 57 else: 58 next_phi_map[x,y] = np.array([np.dot(P, phi_map[x-1,y]) + np.dot(Q, phi_map[0,y]) + np.dot(R, phi_map[x,y+1]) + np.dot(S, phi_map[x,y-1])]) 59 elif x == 2 and y == 2: 60 next_phi_map[2,2]=-np.array([np.dot(P, phi_map[x+1,y]) + np.dot(Q, phi_map[x-1,y]) + np.dot(R, phi_map[x,y+1]) + np.dot(S, phi_map[x,y-1])]) 61 else: 62 for y in range(0,2*m+1): 63 if y == 0: 64 next_phi_map[x,y] = np.array([np.dot(P, phi_map[x-1,y]) + np.dot(Q, phi_map[x+1,y]) + np.dot(R, phi_map[x,y+1]) + np.dot(S, phi_map[x,2*m])]) 65 elif y == 2*m: 66 next_phi_map[x,y] = np.array([np.dot(P, phi_map[x-1,y]) + np.dot(Q, phi_map[x+1,y]) + np.dot(R, phi_map[x,0]) + np.dot(S, phi_map[x,y-1])]) 67 else: 68 next_phi_map[x,y] = np.array([np.inner(P, phi_map[x-1,y]) + np.inner(Q, phi_map[x+1,y]) + np.inner(R, phi_map[x,y+1]) + np.inner(S, phi_map[x,y-1])]) 69 #print(t,mean_0,mean_1,mean_2,mean_3) 70 p_map[x,y] = np.real(np.inner(next_phi_map[x,y], np.conj(next_phi_map[x,y]))) 71 phi_map = next_phi_map 72 #print(t,phi_map[0]) 73 mean_0 = phi_map[0].sum()/(4*m**2) #= np.array([(2*mean - next_phi_map[x,y][0])]) 74 mean_1 = phi_map[1].sum()/(4*m**2) #= np.array([(2*mean - next_phi_map[x,y][1])]) 75 mean_2 = phi_map[2].sum()/(4*m**2) #= np.array([(2*mean - next_phi_map[x,y][2])]) 76 mean_3 = phi_map[3].sum()/(4*m**2) #= np.array([(2*mean - next_phi_map[x,y][3])]) 77 phi_map[0] = 2*mean_0 - phi_map[0] 78 phi_map[1] = 2*mean_1 - phi_map[1] 79 phi_map[2] = 2*mean_2 - phi_map[2] 80 phi_map[3] = 2*mean_3 - phi_map[3] 81 #p_list.append(np.inner(phi_map[26,26],np.conj(phi_map[26,26]))) 82 #print("t={}, phi[80,0]:{}".format(t, phi_map[8,0]*np.conj(phi_map[80,0]))) 83 #print("t={}, phi[0,80]:{}".format(t, phi_map[0,8]*np.conj(phi_map[0,80]))) 84 for i in range(0,2*m+1): 85 for j in range(0,2*m+1): 86 print("t = {} ({}, {}):{}".format(t, i, j, phi_map[i, j]))
python
1foool 2t = 0 (0, 0):[-0.96875+0.j 0.03125+0.j 0.03125+0.j 0.03125+0.j] 3t = 0 (0, 1):[0.03125+0.j 0.03125+0.j 0.03125+0.j 0.03125+0.j] 4t = 0 (0, 2):[0.03125+0.j 0.03125+0.j 0.03125+0.j 0.03125+0.j] 5t = 0 (0, 3):[0.03125+0.j 0.03125+0.j 0.03125+0.j 0.03125+0.j] 6t = 0 (0, 4):[0.03125+0.j 0.03125+0.j 0.03125+0.j 0.03125+0.j] 7t = 0 (0, 5):[0.03125+0.j 0.03125+0.j 0.03125+0.j 0.03125+0.j] 8t = 0 (0, 6):[0.03125+0.j 0.03125+0.j 0.03125+0.j 0.03125+0.j] 9t = 0 (0, 7):[0.03125+0.j 0.03125+0.j 0.03125+0.j 0.03125+0.j] 10t = 0 (0, 8):[0.03125+0.j 0.03125+0.j 0.03125+0.j 0.03125+0.j] 11t = 0 (1, 0):[0.+0.j 0.+0.j 0.+0.j 0.+0.j] 12t = 0 (1, 1):[0.+0.j 0.+0.j 0.+0.j 0.+0.j] 13. 14. 15.
t=0のときの(0,0)((0,0)は[1,0,0,0])~(0,8)に0になるはずが、値を持っており原因がわかりません。
ご指導の程、宜しくお願い致します。
率直に申し上げて、コードが混沌としているためエラーがわかりにくいのだと思います。
カオスでしょうか。。。。(^^;)。。。。?一応ゴテゴテではある事実は認めますが、境界条件の場合分けを明白にしているつもりなので、どこを計算している等はわかるように書いたのですが。。。見にくく申し訳ないです。
例えばrange(0,100,2)のようにすれば、if文を消せたりします。
またitertoolsを使うと多重ループを消せます。https://stackoverflow.com/questions/22473053/itertools-equivalent-of-nested-loop-for-x-in-xs-for-y-in-ys
今、端を特別に扱っていますが、外にもう一回り付け足すと、この特別性がなくなります。
ありがとうございます!やってみます
回答1件
あなたの回答
tips
プレビュー