Как использовать оператор по модулю для работы с граничными условиями periodi c? - PullRequest
0 голосов
/ 24 марта 2020

Я хочу установить двумерный прямоугольник с длиной L и периодом c граничных условий в 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), но оператор модуля не может справиться с этим так же, как в предыдущем случае.

1 Ответ

0 голосов
/ 24 марта 2020

Для L odd диапазон центрированных значений симметричен c [(1-L) / 2, (L + 1) / 2]. Для четного L ранжирование центрированных значений будет иметь либо дополнительный положительный, либо дополнительный отрицательный член.

Первые два примера:

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))

Идея состоит в том, условно вычесть L, если значение (x% L) выходит за пределы центрального диапазона.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...