Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/sql-server-2008/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 粒子撞击墙壁。蒙特卡罗模拟_Python_Montecarlo - Fatal编程技术网

Python 粒子撞击墙壁。蒙特卡罗模拟

Python 粒子撞击墙壁。蒙特卡罗模拟,python,montecarlo,Python,Montecarlo,我被指示做一个函数,返回给定数量粒子的位置。这是一个随机的一维运动,粒子位于直线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(

我被指示做一个函数,返回给定数量粒子的位置。这是一个随机的一维运动,粒子位于直线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)
导入matplotlib
将matplotlib.pyplot作为plt导入
将numpy作为np导入
将随机导入为rd
导入数学为m
盒子宽度=20
dx=1
无运动=1000
def粒子运动(n):
x=0
对于范围(n)中的i:
New_x=rd.choice([(dx),(-dx)])
x=x+新的
尽管如此:
x=x+新的
如果x<-20:
x=x+dx
如果x>20:
x=x-dx
返回(x)
对于范围(20)内的i:
P_步数=粒子运动(100)
打印(P_步骤)

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


导入matplotlib
将matplotlib.pyplot作为plt导入
将numpy作为np导入
将随机导入为rd
导入数学为m
盒子宽度=20
dx=1
无运动=1000
def粒子运动(n):
x=0
New_x=0
对于范围(n)中的i:
New_x=rd.choice([(dx),(-dx)])
x=x+新的
尽管如此:
x=x+新的
如果x<-20:
x=x+dx
elif x>20:
x=x-dx
返回(x)
对于范围(20)内的i:
P_步数=粒子运动(100)
打印(P_步骤)

除了上面关于语法的答案外,您不需要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)

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

如果x<-20
这是错误的,请执行
如果x<-20:
并使用缩进
4
-6
2
0
-4
6
-17
6
-6
6
-4
-19
4
-12
-2
-2
-6
6
-2
-16