先日、以下のような質問をしました
https://teratail.com/questions/152409
この質問に対して寄せていただいた回答をもとに、8*8の行列で各成分が0~2πとなるものは以下のようにあらわすことができました。
python
1import numpy as np 2S = np.random.uniform(0, 2 * np.pi, (Nx, Ny)) 3print(S)
↓
output
1[[4.41650775 2.71406146 4.41416128 3.14201439 2.69117847 4.27302197 2 2.13271308 3.04400582] 3 [1.12690231 3.42268815 4.46682612 4.73870683 5.92194469 2.70762728 4 5.3183137 3.73280308] 5 [2.39379053 4.57429553 2.89689483 1.63613895 2.62612769 2.82020993 6 1.662676 2.52406824] 7 [2.0699564 4.10302686 3.45921419 5.79703282 3.02967725 5.82700575 8 2.46686931 0.37984799] 9 [3.08676912 5.76371844 3.64893616 0.86066251 2.55529371 2.63367659 10 3.29609631 1.03792125] 11 [4.88785811 6.02503479 3.8441244 5.05772728 1.00185371 3.58283383 12 1.9105011 4.4521828 ] 13 [2.28177066 5.43348847 3.7151592 0.27352182 5.39425746 5.95659263 14 2.02327713 4.24771053] 15 [2.62177829 5.79892895 3.47362596 5.06351588 3.27111045 3.12798965 16 0.02599374 3.94512495]]
これを用いて次は周期的境界条件を課して、先日の質問の中でもあった以下の値を計算したいと考えています。
S(i,j)とすると
E =-cos(S(i,j)-S(i+1,j))-cos(S(i,j)-S(i-1,j))-cos(S(i,j)-S(i,j+1))-cos(S(i,j)-S(i,j-1)))
ただし、ここで周期的境界条件というものを課して列1,8及び行1,8で反対側に折り返すという操作を行うこととします。
以上を組み込んで以下のようなコードを考えました。
python
1import matplotlib.pyplot as plt 2import numpy as np 3 4 5def Ecalc(Nx,Ny): 6 for i in range (-1,Nx): 7 for j in range(0,Ny): 8 l=i 9 m=j 10 if l==-1: 11 l=Nx 12 if l==Nx: 13 l=0 14 if m==-1: 15 m=Ny 16 if m==Ny: 17 m=0 18 19 for i in range(0,Nx): 20 for j in range(-1,Ny): 21 l=i 22 m=j 23 if l==-1: 24 l=Nx 25 if l==Nx: 26 l=0 27 if m==-1: 28 m=Ny 29 if m==Ny: 30 m=0 31 32 S = np.random.uniform(0, 2 * np.pi, (Nx, Ny)) 33 print(S) 34 35 36 E = np.empty_like(S) 37 for i, j in np.dstack(Nx,Ny): 38 E[i - 1, j - 1] = -np.cos(S[i, j] - S[i - 1, j]) \ 39 - np.cos(S[i, j] - S[i + 1, j]) \ 40 - np.cos(S[i, j] - S[i, j + 1]) \ 41 - np.cos(S[i, j] - S[i, j - 1]) 42 print(E) 43 Esum=np.sum(E) 44 print(Esum) 45 46if __name__ == '__main__': 47 Ecalc(8,8)
↓
output
1Traceback (most recent call last): 2 File "C:\Users\user2\Desktop\testtesttesttest2.py", line 46, in <module> 3 Ecalc(8,8) 4 File "C:\Users\user2\Desktop\testtesttesttest2.py", line 37, in Ecalc 5 for i, j in np.dstack(Nx,Ny): 6TypeError: dstack() takes 1 positional argument but 2 were given
このエラーを解消し、周期的境界条件を満たした値Eを出力することが目標です。よろしくお願い致します。
追記
やりたいことについて詳しく書きます。
1.NxNyの行列を生成し、各成分を(i,j)であらわす。
2.行列の各要素は0~2np.piの乱数を取るものとする。この値をS[i,j]とする。
3.E[i,j]を以下のように定義し、すべてのS[i,j]に対して計算を行う。
E[i,j] =-cos(S(i,j)-S(i+1,j))-cos(S(i,j)-S(i-1,j))-cos(S(i,j)-S(i,j+1))-cos(S(i,j)-S(i,j-1)))
しかし、このままでは行列の端では計算ができなくなる(例えばE[1.1]を計算するとき、S[0,1]やS[1,0]が定義されていないので計算ができない)ので、以下のような周期的境界条件を課します。
~~周期的境界条件~~
例えばNx=8,Ny=8の場合、S[0,1]=S[8,1]、S[1,0]=S[1,8]といった具合です。
回答1件
あなたの回答
tips
プレビュー