Python 泊松分布下的随机数生成
我已经用Python编写了一段代码,用于对梁结构进行随机采样并查找光子。光子随时间的演化遵循泊松分布。我正在模拟的梁结构有936个料仓,前900个料仓的装料量为0.62 nC,然后是36个料仓的间隙。每个仓为2 ns,这意味着光束的总旋转周期(完成一个同步加速器循环)为1.872微秒(936仓时间为2 ns)。我们寻找在每个箱子中获得光子的概率。速率参数(获得光子的概率)由输入计数速率(定义为fr)和2ns的时间单元大小(定义为dt)的乘积给出。由于fr*dt的乘积非常小(约为0),因此大多数箱子将没有光子,泊松分布将在0左右达到峰值。事实上,我们需要对几千个梁结构进行取样才能得到准确的结果。在MATLAB中,我模拟了10000个梁结构,得到了有意义的结果 下面是我的python代码。我在代码中将一个梁结构定义为y。为了多次重复y,我定义了y1(重复梁结构5次)或y2(重复100次),以此类推 在代码的第1部分中,我循环了936个y型箱,并确保零电荷箱(最后36个箱)不会产生光子。我在936箱y上循环,并按照泊松分布进行随机抽样,平均值fr*dt定义为spkt。然后我重塑spkt,这样我们就得到了一个单列矩阵,定义为spkt1。然后我打印spkt1,它显示具有“真值”的箱子。最后,我在一个空矩阵spks中附加具有“True”值的箱子以及箱子编号,以便我们获得计时信息。定时存储在一个单独的数组中,该数组定义为SPK\u t。通过打印SPK,您可以看到我们正在存储具有“真”值的正确箱子 如果我对一个梁结构(y)进行此操作,则一切正常。然而,如果我运行代码替换为y1、y2或y3,我会得到更多具有真值的箱子。如上所述,由于分布的平均值非常非常小(fr*dt),我预计大多数箱子应该是空的,因为泊松分布的峰值应该在零左右。如果使用y2或y3,处理时间也会增加。如果我为len(y2)或len(y3)运行for循环,请建议出现了什么问题 在第2节中,我只是通过spk_t乘以dt来提取光子出现的时间 在第3节中,我通过拒绝与连续光子的时间差小于80 ns的光子来拒绝堆积光子 最后,我通过将干净光子除以总模拟时间来提取Firingrate或Output Count RatePython 泊松分布下的随机数生成,python,python-3.x,numpy,math,random,Python,Python 3.x,Numpy,Math,Random,我已经用Python编写了一段代码,用于对梁结构进行随机采样并查找光子。光子随时间的演化遵循泊松分布。我正在模拟的梁结构有936个料仓,前900个料仓的装料量为0.62 nC,然后是36个料仓的间隙。每个仓为2 ns,这意味着光束的总旋转周期(完成一个同步加速器循环)为1.872微秒(936仓时间为2 ns)。我们寻找在每个箱子中获得光子的概率。速率参数(获得光子的概率)由输入计数速率(定义为fr)和2ns的时间单元大小(定义为dt)的乘积给出。由于fr*dt的乘积非常小(约为0),因此大多数箱
import numpy as np
from matplotlib import pyplot as plt
import random
y = list(range(1,901))
for i in range(0,900):
y[i] = 62 * .000000001
i += 1
for i in range(900,936):
y.append(0)
y1 = np.tile(y,5)
t = [t * .000000001 for t in range(2,9362,2)]
y2 = np.tile(y,100)
t = [t * .000000001 for t in range(2,187202,2)]
y3 = np.tile(y,10000)
t = [t * .000000001 for t in range(2,18720002,2)]
fr = 10000
dt = .000000002
spks = []
spks_t = []
for i in range(len(y)):
if y[i] != 0:
spkt = np.random.rand(i+1)<fr*dt
spkt1 = np.reshape(spkt,(i+1,1))
print(spkt1[np.all(spkt1==True,axis=1),:],i+1)
if 'True' in str(spkt1[np.all(spkt1==True,axis=1),:]):
spks.append(spkt1[np.all(spkt1==True,axis=1),:])
spks_t.append(i+1)
len(spks)
print(spks_t)
spks_t1 = []
for i in range(len(spks_t)):
spks_t1.append(spks_t[i]*dt)
spks_pile=0
for i in range(len(spks)):
if (spks_t1[i]-spks_t1[i-1]< .000000080):
spks_pile += 1
i += 1
print(spks_pile-1)
Corrected_Photons = len(spks)-(spks_pile-1)
print(Corrected_Photons)
Firingrate = Corrected_Photons/(len(y2)*dt)
print(Firingrate)
将numpy导入为np
从matplotlib导入pyplot作为plt
随机输入
y=列表(范围(1901))
对于范围内的i(0900):
y[i]=62*.00000000 1
i+=1
对于范围(900936)内的i:
y、 追加(0)
y1=np.瓷砖(y,5)
t=[t*.00000000 1,对于范围内的t(29362,2)]
y2=np.瓷砖(y,100)
t=[t*.00000000 1,对于范围内的t(2187202,2)]
y3=np.瓷砖(y,10000)
t=[t*.00000000 1,对于范围内的t(218720002,2)]
fr=10000
dt=.00000000 2
spks=[]
spks_t=[]
对于范围内的i(len(y)):
如果你[我]!=0:
spkt=np.random.rand(i+1)有几点需要注意:
- NumPy有一个
NumPy.random.poisson(平均值,大小)
方法来生成poisson随机数。但是,请注意,numpy.random.*
函数现在是从numpy 1.17开始的遗留函数,部分原因是它们使用全局状态;NumPy 1.17引入了一种新的方法,新的方法是通过Generator
对象生成随机数。示例:rng=np.random.default\u rng();arr=平均泊松(平均值、尺寸)
。另见:
n
独立泊松(mean
)随机数之和为泊松(mean*n
)分布(Devroye,“非均匀随机变量生成”,第501页)。例如,要生成平均值为1e-6的1000个泊松随机数之和,只需生成平均值为0.001的单个泊松随机数(因为1e-6*1000=0.001)。这将大大节省对随机数生成器的调用。另见:
有几件事需要注意:
- NumPy有一个
NumPy.random.poisson(平均值,大小)
方法来生成poisson随机数。但是,请注意,numpy.random.*
函数现在是从numpy 1.17开始的遗留函数,部分原因是它们使用全局状态;NumPy 1.17引入了一种新的方法,新的方法是通过Generator
对象生成随机数。示例:rng=np.random.default\u rng();arr=平均泊松(平均值、尺寸)
。另见:
n
独立泊松(mean
)随机数之和为泊松(mean*n
)分布(Devroye,“非均匀随机变量生成”,第501页)。例如,要生成平均值为1e-6的1000个泊松随机数之和,只需生成平均值为0.001的单个泊松随机数(因为1e-6*1000=0.001)。这将大大节省对随机数生成器的调用。另见:
Tl;仅供参考,代码中循环的前两个
可以替换为单个语句y=[62e-9]*900+[0]*36
。嗨,克里斯,我同意你的建议。然而,这不是主要问题。主要问题发生在长度为y或y1或y2的for循环中,我们将生成的峰值存储为spkt。y1或y2的真值(条件np.random.rand(size)