0

L我想在 Python 中设置一个具有长度和周期性边界条件的二维框。一种方法是将参考框架固定在左下角,然后我有:

L = 5 # box length
x, y = 2, 3 # initial values

# step in my algorithm
x = (x + 4) % L
y = (y - 4) % L

显然,输出是x, y = (1, 4). 我们可以保证,对于每一步,粒子的位置都将保持在长度为 L 的盒子内。

好的,但是如果我想在盒子的中心设置参考框架怎么办?当然,以下代码不起作用:

x = (x + 4) % L/2
y = (y - 4) % L/2

我想要发生的是,如果一个粒子从 x=+L/2 一侧逃逸,那么它会出现在 x=-L/2 (对于 y 相同),但是模块运算符不能以与上一个案例。

4

1 回答 1

0

对于 L 奇数,中心值的范围是对称的 [(1-L)/2, (L+1)/2]。对于 L even,居中值的范围将具有额外的正项或额外的负项。

前两个例子:

L = 5,居中范围 [-2, 2]

the value x : ... -6 -5 -4 -3 -2 -1  0  1  2  3  4  5  6  7 ...
x % L       : ...  4  0  1  2  3  4  0  1  2  3  4  0  1  2 ...
centered    : ... -1  0  1  2 -2 -1  0  1  2 -2 -1  0  1  2 ...

L = 6,居中范围 [-3, 2]

the value x : ... -7 -6 -5 -4 -3 -2 -1  0  1  2  3  4  5  6  7  8 ...
x % L       : ...  5  0  1  2  3  4  5  0  1  2  3  4  5  0  1  2 ...
centered    : ... -1  0  1  2 -3 -2 -1  0  1  2 -3 -2 -1  0  1  2 ...

仅使用二元运算来计算它的一种方法是

center_mod = lambda x: (x % L) - L*((x % L) // ((L + 1)//2))

这个想法是如果值 (x % L) 超出中心范围的末端,则有条件地减去 L。

于 2020-03-24T02:44:27.693 回答