小能豆

python- 构建捕获分子的晶格 - 无法正常工作

py

我有这个问题:

创建一个程序,构建一个一维(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…]

我希望每次运行都会有 10 个数字(可变位置)。

\2) 我不确定如何处理边界条件。我正在考虑类似的事情:

if free > grid.size:
    free = free - 1

但我无法测试它。另外,我不确定这是否适用于网格的两个边界。

3)如果我希望第一步从网格中间开始,我该怎么做?

如果有人对此有所提示,我将不胜感激。


阅读 37

收藏
2024-12-08

共1个答案

小能豆

在较小的格子上,看看发生了什么:

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

我鼓励您在整个过程中加入打印语句,以查看每个变量所保存的值。在较小的格子上尝试它将有助于您理解它的工作原理。

编辑:

我将让您弄清楚具体细节,但我会将其包装在如下所示的函数中。它设置函数,然后准备空步骤和历史记录列表以保存每次运行的结果。我们运行该函数,然后将结果附加到这些列表中。

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)
2024-12-08