python - 如何使用模算子处理周期性边界条件?
问题描述
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 相同),但是模块运算符不能以与上一个案例。
解决方案
对于 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。