粒子撞击墙壁。 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
此粒子现在在限制范围内“表现良好”。
我被指示创建一个函数,该函数 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
此粒子现在在限制范围内“表现良好”。