【问题标题】:Particle hitting a wall. Monte Carlo Simulation粒子撞墙。蒙特卡罗模拟
【发布时间】:2020-12-16 14:24:40
【问题描述】:

我被指示创建一个函数,该函数返回给定数量粒子的位置。这是一个随机的一维运动,粒子在 X=0 线的中心,线长 40mm。我在编码我的函数时遇到问题,以便粒子在线条边缘反射。

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)

【问题讨论】:

  • if x &lt; -20 这是错误的,执行if x &lt; -20: 并使用缩进

标签: python montecarlo


【解决方案1】:

除了上述语法的答案之外,您不需要 while 循环(和 x-assignment)。此外,在您的限制检查中,您不应该只增加/减少 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

这个粒子现在在限制内“表现良好”。

【讨论】:

    【解决方案2】:

    首先语法不正确为您修复它,看看这是否有帮助。变量 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)
    
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-01-02
      • 2012-04-26
      • 2021-08-23
      • 2015-02-10
      相关资源
      最近更新 更多