2016-12-05 35 views
0

遠く離れた隣人の影響を無視しない2Dイジングモデルのシミュレーションを書く必要があります。そのため、円の中のスピンを数えたいと思います。円の方程式と周期的な境界条件を持つ円を描く方法[Python]?

私は円の中にあるグリッドの要素を得ることができる簡単な関数を書いています。

def countInCircle(g, x, y, r): 
    spinSum = 0 
    for R in range(0, r + 1, 1): 
     for i in range(0, g.shape[0], 1): 
      for j in range(0, g.shape[1], 1): 
       if ((i - x) ** 2 + (j - y) ** 2) == R: 
        spinSum = spinSum + g[i][j] 

    return spinSum 

これは魅力的なように機能しますが、それがグリッドの場合は円の一部を切り落とします。私は周期的な境界条件のためにこれをどのように解決すべきですか?

ありがとうございます!

+0

残念ながら、あなたが求めているのは不明です。 「グリッドの一部であれば、サークルの一部をカットする」とはどういう意味ですか?境界条件はどこで始まるのですか? 'x'、' y'の整数ですか? '(0,0)'からsqrt(2)離れた画素 'g [1] [1]'はどうでしょうか? – ImportanceOfBeingErnest

+0

さて、 "円の一部が切り取られている場合は、グリッドの上にある"とは、r = 10の半径と2,2の中心を持つ円で数えたい場合、関数は "円の左上と右端がグリッドから外れるため、問題です。 グリッドの最上部の行はグリッドの下部に隣接していますグリッドの左側はグリッドの右側に「隣接」しています。 円の上端(現在は切り取られている)はグリッドの下部に来て、右端は右にある –

+0

私が尋ねた他の2つの質問はどうですか? – ImportanceOfBeingErnest

答えて

0

ここに解決策があります。これは、numpy配列を使用し、与えられた点の周りの半径内のすべての要素を簡単に合計できるようにグリッドを移動します。(x,y)いくつかの有用な質問がHow to apply a disc shaped mask to an array

  • How to select a window from a numpy array with periodic boundary-conditions
  • 2 *半径+ 1が小さいか、グリッドの最小形状等しくなければならないということである次のコード内の1つの制限があり

    • あります。

      import numpy as np 
      
      def countInCircle(grid, x, y, r): 
          #restriction: 2*r+1 < min(g.shape) 
          shifted_grid=np.roll(np.roll(grid,shift=-x+r,axis=0),shift=-y+r,axis=1) 
          Y,X = np.ogrid[-r: r+1, -r: r+1]  
          mask = X**2+Y**2 <= r**2 
          return np.sum(shifted_grid[mask]) 
      
      g = np.ones((5,5))  
      s = countInCircle(g, 0, 0, 2) 
      print "s = ", s 
      # setting r=2 and summing all ones around (0,0) gives 13. Works fine. 
      
      # setting some spin (-1,0,1) particles 
      g2 = np.random.randint(-1,2, size=(10,15)) 
      print g2 
      s = countInCircle(g2, 3,9, r=3) 
      print "s = ", s 
      
    +0

    これはうまく動作し、私のコードよりもはるかに高速です。 私は外側を削除し、内部条件をmath.sqrt((i - x))に変更しました。 ** 2 +(j - y)** 2)<= r。r = 2などを使用すると13になります) ありがとうございました!あなたは私をたくさん助けてくれました! –