粒子撞击墙壁。 Monte Carlo 模拟

Particle hitting a wall. Monte Carlo Simulation

我被指示创建一个函数,该函数 returns 给定数量的粒子的位置。这是一个随机的一维运动,粒子位于直线 X=0 的中心,直线长 40 毫米。我在编写函数代码时遇到问题,因此粒子会在线的边缘反射。

import matplotlib
import matplotlib.pyplot as plt
import numpy as np
import random as rd
import math as m



Box_width=20 
dx=1
No_p_motions=1000

def particle_motion_1D(n):
    x=0
    for i in range(n):
        New_x=rd.choice([(dx),(-dx)])
        x=x+New_x
    while True:
        x=x+New_x
        if x < -20:
            x = x + dx
        elsif x > 20:
            x = x -dx
    return(x)

 

for i in range(20):
    P_steps = particle_motion_1D(100)
    print(P_steps)

首先为您修复了语法不正确的问题,看看是否有帮助。此外,变量 New_x 未声明到函数体中,您在 for 循环中声明了它,并且您期望 while 循环知道它,没有意义,我试过 运行 这个程序,它是对我来说很明显程序正在进入无限循环,while 条件没有终止,看看这是不是你想要的,恰好 x 值停留在 20.


import matplotlib
import matplotlib.pyplot as plt
import numpy as np
import random as rd
import math as m


Box_width = 20
dx = 1
No_p_motions = 1000


def particle_motion_1D(n):
    x = 0
    New_x = 0
    for i in range(n):
        New_x = rd.choice([(dx), (-dx)])
        x = x+New_x
    while True:
        x = x+New_x
        if x < -20:
            x = x + dx
        elif x > 20:
            x = x - dx
    return(x)


for i in range(20):
    P_steps = particle_motion_1D(100)
    print(P_steps)

除了上述语法的答案外,您不需要 while 循环(和 x 赋值)。此外,在您的极限检查中,您不应该只是 increment/decrement by dx(它可能会将粒子移动到极限之外,因为您需要检查步骤 dx 的符号),而是将其设置为相应的极限:

import matplotlib
import matplotlib.pyplot as plt
import numpy as np
import random as rd
import math as m

Box_width = 20 
dx = 1
No_p_motions = 100

def particle_motion_1D(n, bwidth):
    x = 0  
    for i in range(n):
        New_x = rd.choice([dx, -dx])
#        x = x + New_x # repeated below
#    while True: # not needed, inside the for-loop which runs over desired steps
        x = x + New_x
        if x < -bwidth: # outside lower box limit
            x = -bwidth
        elif x > bwidth: # outside upper box limit
            x = bwidth
    return(x)

for i in range(20):
    P_steps = particle_motion_1D(No_p_motions, Box_width)
    print(P_steps)

这会产生

4
-6
2
0
-4
6
-17
6
-6
6
-4
-19
4
-12
-2
-2
-6
6
-2
-16

此粒子现在在限制范围内“表现良好”。