2016-12-05 2 views
0

먼 이웃의 영향을 무시하지 않는 2D Ising 모델 시뮬레이션을 작성해야하므로 원 안에 스핀을 계산하고 싶습니다.원 방정식과 주기적 경계 조건을 사용하여 원을 그리는 방법 [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

글쎄, "t가 원의 일부를 잘라내는 경우 그리드의 경우"나는 반지름이 10이고 반지름이 2,2 원인 원에서 계산하려면 함수가 "잘라 내고" 그 이유는 다음과 같습니다. 주기적인 경계 조건을 사용해야합니다. 그리드의 맨 위 행은 그리드의 아래쪽에 "인접"합니다 (그리드 외부에 있기 때문에). 그리드의 왼쪽은 그리드의 오른쪽에 "인접"합니다. 그래서 (현재 잘려나가는) 원의 꼭대기가 그리드 하단과 오른쪽에있는 왼쪽에 있어야합니다. –

+0

내가 물었던 다른 두 가지 질문은 어떻습니까? – ImportanceOfBeingErnest

답변

0

다음은 해결책입니다. 그것은 numpy 배열을 사용하고 주어진 지점 (x,y) 주변의 반경 r 내의 모든 요소를 ​​쉽게 요약 할 수있는 방식으로 그리드를 이동합니다. 유용한 질문 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보다 작거나 그리드의 최소한의 형상 동일해야한다는 것이다 다음 코드 한 제한이

    • 이다.

      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이됩니다. 답장을 보내 주셔서 감사합니다!너 나 많이 도와 줬어! –

    관련 문제