私はこの問題を抱えています:
1 次元 100000 サイトの格子を構築するプログラムを作成せよ。この格子では、ランダムな位置に多数のトラップ分子が置かれ、濃度 c になります。ラティス上のランダムな位置に 1 個の粒子を置き、ランダム ウォークを実行させます。この散歩では、時間制限を設定しません。つまり、具体的な歩数を宣言しません。粒子がトラップに落ちると、歩行は停止します................................... ...境界条件に注意してください。粒子が格子の境界に到達すると、そこから逃れることはできず、元の位置に戻るか、格子の反対側に配置されることによって、格子内にとどまることが許されるべきではありません...... ..
私のアプローチは、私が作成したコードに示されています(コメントがあります)。
def steps1d(self,pos,c):
#pos: number of positions
#c: concentration of trap-particles
# array full of traps (zeros)
myzeros = sc.zeros(self.c*self.pos)
# grid full of available positions(ones)
grid = sc.ones(self.pos)
# distribute c*pos zeros(traps) in random positions (number of positions is pos)
traps = sc.random.permutation(pos)[:c*pos]
# the grid in which the particle is moving which has traps inside it
grid[traps] = myzeros
steps_count = [] # list which holds the number of steps
free = 0
for i in range(pos):
# the step of the particle can be 0 or 1
step=sc.random.random_integers(0,1)
for step in grid[:]:
if step == 1:
free += 1
steps_count.append(free)
else:
break
return steps_count
私には3つの問題があります:
1) たとえば pos=10 の場合の結果は次のようになります。
[1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25 、26、27、28、29、30、31、32、33、34、35...]
1回の実行でそれぞれ10個の数字が予想されます(可変位置)。
2) 境界条件の処理方法がわかりません。私は次のようなことを考えています:
if free > grid.size:
free = free - 1
しかし、私はそれをテストすることはできません。また、これがグリッドの両方の境界に当てはまるかどうかはわかりません。
3) グリッドの真ん中から最初のステップを開始したい場合、どうすればよいですか?
誰かがそれについてのヒントを持っていれば、私は感謝します.