我必须写一个2D Ising模型模拟,我不会忽视远处邻居的影响,所以我想计算一个圆圈内的旋转。
我写了一个简单的函数,可以得到一个网格的元素。
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 :(得分:0)
这是一个解决方案。它使用numpy数组并以这样一种方式移动网格,即人们可以轻松地将给定点r
周围的半径(x,y)
内的所有元素相加。一些有用的问题是
以下代码中有一个限制:2 * radius + 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