【问题标题】:How to use the modulo operator to deal with periodic boundary conditions?如何使用模算子处理周期性边界条件?
【发布时间】:2020-03-24 19:43:36
【问题描述】:

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

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 也是如此),但是模块运算符不能同时处理这个问题方式与前一种情况相同。

【问题讨论】:

  • 模运算符“环绕”轴上0 点周围的值,按比例,因此它可能无法执行您需要的操作 - 这意味着您可能需要实际编写代码分别处理每种可能的情况。
  • 保留你的定义,但在你修改它们之后从它们中减去 L/2。 x=((x-4) % L) - L/2 等。内部操作确保您的坐标在 0 和 L 之间,然后通过减去 L/2 将其转换为以框为中心的坐标。新 x 的范围是 (0-L/2, L-L/2) -> (-L/2, L/2)
  • @SyntaxVoidsupportsMonica 但这不起作用,因为例如,如果我的盒子的长度为 L=6,并且我最初在 x=2 处有一个粒子,那么通过减去 2 之后它应该在x=-2(因为它没有到达任何边),然而,它返回 1

标签: python python-3.x periodicity


【解决方案1】:

对于 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。

【讨论】:

    猜你喜欢
    • 2023-03-10
    • 2016-09-06
    • 2017-07-12
    • 2016-06-24
    • 2019-04-02
    • 2016-10-30
    • 1970-01-01
    • 2015-10-29
    • 1970-01-01
    相关资源
    最近更新 更多