python - 语法建议 - 模拟

时间:2017-11-02 01:16:14

标签: python syntax poisson

考虑以下代码模拟非均匀泊松过程。重点是Non_hom_poisson(T,n,N)函数。

def lam_t(T): #calculates lam(t) at given t
    Lambda=[]
    t=T
    for i in range(len(T)):    
        Lambda.append(0.8+0.4*np.sin(0.2*np.pi*t[i]))
    return Lambda

def thinning(max_min,Lam_t,lam_min,times,subset_length): 
#thins max-min to lam(t)-lam_min
    t=0
    J=0
    I=0
    S=[]
    path=2
    t_J=np.arange(0,602,2)
    while (J<300):
        if (path==2):
            unif=np.random.uniform(0,1)
            X=(-1/float(max_min[J]))*np.log(unif)
            path=3
        if (path==3):
            if ((t+X)>t_J[J+1]):
                if ((J+2)>=300):
                    return S;
                X=(X-t_J[J+1]+t)*max_min[J+1]/float(max_min[J+2])
                t=t_J[J+1]
                J+=1
                path=3
            else:
                t+=(X)
                U=np.random.uniform(0,1)
                L_t=0.8+0.4*np.sin(0.2*(np.pi)*t)
                top_prob=float(L_t-lam_min[J])
                bottom_prob=float(max_min[J])
                prob=top_prob/float(bottom_prob)
                if (U<=(prob)):
                    I+=1
                    S.append(float(t))
                    path=2
        if (t>600):
            break
    return S;

def mod_lam(t,lam): 
    interval=float(np.mod(t,10))
    J=np.arange(2,12,2)
    for i in range(len(J)):
        if (interval<J[i]):
            return float(lam[i])
    return float(lam[i])

def Non_hom_poisson(T,n,N):
    time=np.arange(0.1,10.1,0.1)
    Lambda_t=lam_t(time)
    max_lam=[max(Lambda_t[x:(x+19)]) for x in range(0,len(time),20)]
    min_lam=[min(Lambda_t[x:(x+19)]) for x in range(0,len(time),20)]
    max_min_lam=[(max_lam[x]-min_lam[x]) for x in range(len(max_lam))]
    max_min_lam=np.tile(max_min_lam,60)
    min_lam=np.tile(min_lam,60)
    poisson_min=[np.random.poisson(float(min_lam[0]))]
    i=0
    while (poisson_min[i]<600):
        y=float(mod_lam(poisson_min[i],min_lam))
        x=-1/float(y)*np.log(np.random.uniform(0,1))
        poisson_min.append(float(x)+float(poisson_min[i]))
        i+=1
    thinned=thinning(max_min_lam,Lambda_t,min_lam,time,20)
    superposition=np.append(thinned,poisson_min)
    return np.sort(superposition)
NH=Non_hom_poisson(600,5,1)
print(NH)

我收到以下错误 - &#34;&#39; int&#39;对象不可调用&#34; - 当max_lam = [max(Lambda_t [x:(x + 19)])时,调用范围内的x(0,len(时间),20)]。有什么建议吗?

1 个答案:

答案 0 :(得分:3)

该行有三个函数调用:range()max()len()。那些是python内置的。

但这些标识符都不是保留字。所以可能发生的事情是你在全局范围内使用了其中一个标识符作为变量名。由于在len()函数中调用了range()lam_t()且没有错误,因此它必须是max整数。

这意味着像这样的赋值已在全局范围内执行。

max = 100  

问题中包含的代码不包含任何此类赋值,但错误消息指示max指向整数。您可以在python repl中重现错误。

>>> max = 1
>>> max(1, 3, 2)
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: 'int' object is not callable
>>> del max  # fix it
>>> max(1, 3, 2)
3

避免使用sumlenlistmaxminint,{ {1}},hash等作为变量名称。

如果您使用类似于jupyter笔记本的东西,这是一个很容易混淆错误的原因,通常的做法是在全局命名空间中定义大量变量,然后忘掉它。