Python 泊松分布下的随机数生成

Python 泊松分布下的随机数生成,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),因此大多数箱

我已经用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 Rate

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)