2017-11-02 17 views
0

次のコードシミュレーションでは、非同質のポアソンプロセスを考えてみましょう。フォーカスは、Non_hom_poisson(T、n、N)関数にあります。python - 構文の提案 - シミュレーション

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) 

私は次のエラーを取得しています - "「int型のオブジェクトは呼び出し可能ではありません" - max_lamは= [最大:範囲内のxの(Lambda_t [X(X + 19)])(0、LEN (時間)、20)]が呼び出されます。なにか提案を?

+1

あなたのコードは私の仕事です。カーネルを再起動してみてください。 – James

+0

こちらも[Python 2.7]で動作確認済みです。 – DaveL17

答えて

3

その行には、range(),max()およびlen()という3つの関数呼び出しがあります。それらはPythonの組み込み関数です。

しかし、これらの識別子のどちらも予約語ではありません。おそらく、グローバルスコープ内の変数名としてこれらの識別子の1つを使用している可能性があります。 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 

これは、変数名としてsumlenlistmaxmininthashdirなどの使用を避けることをお勧めです。

地球儀の名前空間にたくさんの変数を定義して忘れてしまうのは、普通の練習のようなものを使っているとバグを混乱させる原因です。

関連する問題