1

私はこの問題を抱えています:

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) グリッドの真ん中から最初のステップを開始したい場合、どうすればよいですか?

誰かがそれについてのヒントを持っていれば、私は感謝します.

4

2 に答える 2

2

小さいラティスで何が起こっているかを確認するには:

import numpy

# Populate the lattice
lattice = numpy.concatenate([numpy.ones(90), numpy.zeros(10)])
numpy.random.shuffle(lattice)

# Intialize problem
in_trap = False
steps = 0
pos = int(numpy.random.randint(0,len(lattice),1))
history = []

while in_trap == False:
    # Step of -1 is backward, 1 is forward
    step = numpy.random.permutation([-1,1])[0]

    # Check position for edges and fix if required
    if pos + step > len(lattice) - 1:
        pos = 0
    elif pos + step < 0:
        pos = len(lattice) - 1
    else:
        pos += step

    # Keep track of random walk
    history.append(pos)

    # Check if it's a trap
    if lattice[pos] == 0:
        in_trap = True

    # If not, continue
    steps += 1


print steps
print history
print lattice

各変数が保持している値を確認するために、全体に print ステートメントを挿入することをお勧めします。小さいラティスで試してみると、これがどのように機能するかを理解するのに役立ちます。

編集:

詳細はお任せしますが、これを次のような関数でラップします。関数を設定し、空のステップと履歴リストを準備して、各実行の結果を保持します。関数を実行し、結果をそれらのリストに追加します。

def lattice():
    code
    return steps, history

steps = []
histories = []
for i in range(0,10):
    num_steps, history = lattice()
    steps.append(num_steps)
    histories.append(history)
于 2011-11-07T17:57:54.313 に答える
0

グリッドが作成されている部分は問題ありません (ただし、traps2 回使用しましたが、1 行目は必要なく、4 行目は必要だと思いますgrid[traps]=0)。

次に、問題に従って、分子を配置してグリッド上を歩かせる必要がありますが、プログラムのこの部分は完全に間違っています。あなたがする必要があるのは、分子のランダムな開始点を見つけて (sc.random.randint(pos)たぶん)、分子がトラップに落ちるまでのステップ数を数えることです。1d ランダム ウォークのステップは、左方向 ( starting_point - 1) または右方向 ( starting_point + 1) のいずれかになります。の間でランダムに選択する必要があり[-1, +1]、ステップをグリッド上の分子のインデックスに追加し、結果のインデックスがグリッド上で自由に見える場合は、free変数をインクリメントします。結果のインデックスがトラップにヒットした場合は、free変数をsteps_countリストに追加します。

index % pos2 番目の質問に答えるために、除算の余りを分子のインデックスとして使用すると、周期的な境界条件をグリッドにシームレスに適用できます。

于 2011-11-07T17:58:11.290 に答える