2017-11-02 22 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) 

I가 다음 오류를 얻고 - " '내부'객체 호출 할 수없는"- 때 max_lam = 최대 (Lambda_t [X (X + 19)]) 내지 X (0, LEN (시간), 20)]라고 부른다. 어떠한 제안?

+1

나를위한 코드가 작동합니다. 커널을 다시 시작 하시겠습니까? – James

+0

[Python 2.7]에서도이 작업을 확인했습니다. – DaveL17

답변

3

해당 줄에는 range(), max()len()의 세 가지 함수 호출이 있습니다. 파이썬 빌트인입니다.

그러나 이러한 식별자는 예약어가 아닙니다. 그래서 아마도 그 식별자 중 하나를 전역 범위에서 변수 이름으로 사용했다는 것입니다. 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 

는 변수 이름으로 sum, len, list, max, min, int, hash, dir 등의 사용을 피하는 좋은 방법이다.

글로벌 네임 스페이스에서 많은 변수를 정의한 다음 잊어 버리는 것이 일반적인 사례 인 경우 큰 노트를 사용하는 경우 버그가 혼동 스럽습니다.