我正在制作一个模拟布朗运动的代码。
from random import random
import matplotlib.pyplot as plt
import numpy as np
N=100
p=0.5
l=1
x1=[]
x2=[]
x1.append(0)
x2.append(0)
for i in range(1, N):
step = -l if random() < p else l
X1 = x1[i-l] + step
x1.append(X1)
for i in range(1, N):
step = -l if random() < p else l
X2 = x2[i-l] + step
x2.append(X2)
x1mean=np.array(x1)
x2mean=np.array(x2)
mean=[]
for j in range (0,N):
mean.append((x1mean[j]+x2mean[j])/2.0)
plt.plot(mean)
plt.plot(x1)
plt.plot(x2)
plt.show()
这段代码为2个不同的粒子提供了位移,但为了正确计算平均位移,我需要有大量的粒子,比如100.你可以看到,我正在寻找一个凝聚代码的方法,因为我不能重复相同的代码100次。
有没有办法创建一个循环,使所有这些代码都是1变量的函数,即粒子数?
感谢。
答案 0 :(得分:0)
此?
from random import random
import matplotlib.pyplot as plt
import numpy as np
N=100
p=0.5
l=1
mydict = {}
for n in range(100):
mydict[n] = []
mydict[n].append(0)
for i in range(1, N):
step = -l if random() < p else l
X1 = mydict[n][i-l] + step
mydict[n].append(X1)
for k,v in mydict.iteritems():
plt.plot(v)
# mean
plt.plot([np.mean(i) for i in mydict.values()])
plt.show()
答案 1 :(得分:0)
我无法为您提供有效的python代码,因为到目前为止我还没有编写一行python代码。但我可以告诉你如何解决问题。
假设:
N : Number of Moves
P : Number of Particles
第1步:
创建一个生成数组/列表并返回它的方法。因此,您可以重复使用它,避免复制代码。
def createParticleMotion(N, p, l):
x1=[]
x1.append(0)
for i in range(1, N):
step = -l if random() < p else l
X1 = x1[i-l] + step
x1.append(X1)
return x1
第2步:
创建列表列表,我们称之为particleMotions
。它自己的列表有 P 列表中的 N 移动。通过从第一步调用方法并按返回的列表/数组附加列表paticleMotions
,在for循环中为您填充粒子数 P 。
可能是Python: list of lists的答案,可以帮助您创建此内容。
第3步:
在创建并填充particleMotions
之后,在double for循环中使用此列表并计算均值并将其存储在均值列表中。
mean=[]
for n in range (0,N):
sum=0
for p in range (0,P):
sum = sum + particleMotions[p][n]
mean.append(sum/P)
现在您可以使用下一个for循环来绘制结果。
for particle in range (0,P):
plt.plot(particleMotions[particle])
所以再次不要因为语法错误而责备我。我不是植物开发者。我只想给你一个解决问题的方法。