読者です 読者をやめる 読者になる 読者になる

Kumpei Shiraishi's blog

物理、プログラミング、クライミングに関する雑記

3次元自己回避ランダムウォークをPythonで実装する

自己回避ランダムウォーク

自己回避ランダムウォーク(self avoiding random walk, SAW)とは、過去に占有した座標を回避しながら進むランダムウォークの一種である。3次元版のSAWは高分子のシミュレーションでよく用いられる。3次元では、以下のように漸近する。

{
\langle R^{2} (N) \rangle \sim N^{2\nu}
}

このとき{\nu \simeq 0.592}であることが知られている。

Rosenbluth-Rosenbluth最適化

さて、こんな3次元SAWをPythonでシミュレーションしてみようと思う。3次元直交座標を考え、原点から粒子がランダムウォークして動いていくとする。モノマー50個の長さのポリマーなら50回動くという要領で、動いた回数がポリマーの長さに対応するのである。

素朴な方法、次の格子をランダムに選び、それが自分の動いてきた履歴に含まれていたら終了、をそのまま実装したとする。ある程度の長さのポリマーを得るには、この方法では効率が悪すぎる。例えば長さ40のポリマーにまで到達する粒子は、わずか0.04%ほどである。そこで何らかの最適化が必要になる。

今回は、Rosenbluth-Rosenbluth最適化(Rosenbluth, Rosenbluth. J. Chem. Phys. 23, 356 (1955); http://dx.doi.org/10.1063/1.1741967)という方法を採る。この方法では次の格子をランダムに選ぶのではなく、6つの候補({x}正方向・負方向、{y}正方向・負方向、{z}正方向・負方向)から既に履歴に含まれているものを除外してランダムに選び、その代わりに重みをつける。

具体例を考えよう。{N-1}回の移動が終わり、{N}回目の移動を行う段階を考える。重み付けをする因子は{W(N)}である。6つの候補のうち、

  1. 履歴に含まれるものが1個(直前の位置)のみの場合、{W(N) = W(N-1)}
  2. 履歴に含まれるものが{m}個({m = 2, 3, 4, 5})の場合、{W(N) = \frac{m}{5}W(N-1)}
  3. 履歴に含まれるものが6個の場合、{W(N) = 0}として終了

以上の規則にしたがって、{W(N)}を決定する。但し、{W(0) = 1}である。

最後に、平均2乗変位{\langle R^{2} (N) \rangle}は以下の表式で求められる。

{ \displaystyle
\langle R^{2}(N) \rangle = \frac{\sum W(N)R^{2}(N)}{\sum W(N)}
}

但し、和は粒子番号についてとる。

Pythonコード

近日公開