2010-06-16 2 views
0

* 편집 됨 6/17/10Python/Biomolecular Physics- 조건부 행동을 나타내는 시스템의 간단한 확률 적 시뮬레이션을 코드화하려고합니다!

나는 내 코드를 개선하는 방법을 배우고 있습니다. (더 파이썬으로 만드십시오). 또한 생화학에서 흔히 볼 수있는 시나리오를 설명하는보다 직관적 인 '조건문'을 작성하는 데 관심이 있습니다. 아래 프로그램의 조건부 기준은 Answer # 2에서 설명했지만 코드에 만족스럽지는 않지만 잘 작동하지만보다 복잡한 조건의 시나리오를 구현하기는 쉽지 않습니다. 아이디어 환영합니다. 댓글/비평을 환영합니다. 첫 번째 게시 경험 @ stackoverflow- 에티켓에 대한 의견을 주시기 바랍니다.

코드는 다음 연습에 솔루션입니다 값 목록 생성

"당신의 선택의 프로그래밍 언어에서를, 반응 A의 시간적 행동을 연구하기 위해 길레스피의 첫 번째 반응 알고리즘을 구현 --- > B에서 A 로의 전이가 일어나는 B는 다른 화합물 C가 존재할 때만 일어날 수 있고 아래의 페트리 네트 (Petri-net)에서 모델링 된 것처럼 C가 D와 동적으로 상호 변환 할 수있다. 반응 초기에 B 또는 D가 존재하지 않는다 .KAB를 0.1 s-1로 설정하고 kDC와 kDC를 모두 1.0 s-1로 설정한다 .100 초 이상 시스템의 행동을 시뮬레이트한다. "

def sim(): 
    # Set the rate constants for all transitions 
    kAB = 0.1 
    kCD = 1.0 
    kDC = 1.0 

    # Set up the initial state 
    A = 100 
    B = 0 
    C = 1 
    D = 0 

    # Set the start and end times 
    t = 0.0 
    tEnd = 100.0 

    print "Time\t", "Transition\t", "A\t", "B\t", "C\t", "D" 

    # Compute the first interval 
    transition, interval = transitionData(A, B, C, D, kAB, kCD, kDC) 
    # Loop until the end time is exceded or no transition can fire any more 
    while t <= tEnd and transition >= 0: 
     print t, '\t', transition, '\t', A, '\t', B, '\t', C, '\t', D 
     t += interval 
     if transition == 0: 
      A -= 1 
      B += 1 
     if transition == 1: 
      C -= 1 
      D += 1 
     if transition == 2: 
      C += 1 
      D -= 1 
     transition, interval = transitionData(A, B, C, D, kAB, kCD, kDC) 


def transitionData(A, B, C, D, kAB, kCD, kDC): 
    """ Returns nTransition, the number of the firing transition (0: A->B, 
    1: C->D, 2: D->C), and interval, the interval between the time of 
    the previous transition and that of the current one. """ 
    RAB = kAB * A * C 
    RCD = kCD * C 
    RDC = kDC * D 
    dt = [-1.0, -1.0, -1.0] 
    if RAB > 0.0: 
     dt[0] = -math.log(1.0 - random.random())/RAB 
    if RCD > 0.0: 
     dt[1] = -math.log(1.0 - random.random())/RCD 
    if RDC > 0.0: 
     dt[2] = -math.log(1.0 - random.random())/RDC 
    interval = 1e36 
    transition = -1 
    for n in range(len(dt)): 
     if dt[n] > 0.0 and dt[n] < interval: 
      interval = dt[n] 
      transition = n 
    return transition, interval  


if __name__ == '__main__': 
    sim() 
+4

실제 질문을 숨이 막히는 의식 흐름에서 파싱하기가 어렵습니다. 실제 질문이 실제로 무엇인지 요약 해 주시면 실제로 대답 할 수 있습니까? –

+0

몬테카를로 비트가 잘못된 것처럼 보입니다. 'dt [2]'가 1e36보다 작 으면 천이는 항상 2와 같습니다. 나는 이런 종류의 시뮬레이션을 완전히 이해하지 못한다는 것을 인정하지만, 그 부분은 나에게 물고기 같아 보인다. 'dt'가 임의의 프로세스를 무작위로 결정하는 가중치로서 어떤 식 으로든 사용되어야하는 것처럼 보입니다. 무작위가 있지만, 잘못된 방향으로가는 것처럼 보입니다. –

+0

감사합니다. 나는 몬테 카를로 (Monte Carlo)의 저스틴 (Justin)을 아직 보지 못했지만, 나는 그것에 도달하자마자 의견을 말할 것이다. S. Lott- 네 말이 맞아, 나는 그 일을하는 것이 나쁘다. 내 게시물을 조금 편집 할 것입니다 .- 하하. 방금 '익숙하지 않은 부분이었던 호출자에게 반환 값을 전달하는'것을 발견했습니다. 필자는 지금까지 한꺼번에 배열을 사용하여 함수를 정의함으로써 간단한 시뮬레이션으로 도망 갈 수있었습니다. 하지만 그래, 내 게시물의 요지는 - WTF 였어? 나는 옳은 길에 있다고 생각한다. 오늘 나중에 재교부하겠습니다. – DocDubya

답변

1

본 적이 있는지 확실하지 않습니다.

http://stompy.sourceforge.net/html/userguide_doc.html

나는 비슷한 물건에 일을하고 요즘이 발견 일어났다.

+0

링크가 멋지다. 감사! 이 글을 올린 후 실제로 숙제를 넘어 모델링 연구로 옮겼습니다. Direct/SSA/Tau 방법을 비교하기위한 out of the box 방법을 찾고있었습니다! 너 락맨. 고맙습니다. – DocDubya

+0

안녕하세요, 멋진 링크. 얼마나 빠릅니까? – Greg

0

나는 Gillespie 알고리즘을 모른다. 그러나 나는 프로그램이 정확한 평형에 수렴한다는 것을 확인했다고 가정한다. 따라서 나는 당신에게

같은 질문 해석 "여기를 작동 물리학 프로그램, 내가 더 파이썬 만들 수있는 방법이다"

아마 다음

R = [ kAB * A * C, kCD * C, kAB * A * C] 
dt = [(-math.log(1-random.random())/x,i) for i,x in enumerate(R) if x > 0] 
if dt: 
    interval,transition = min(dt) 
else: 
    transition = None 

만약 그런 짓을하는 것이 더 파이썬 것 당신은 물리학에서 파이썬을 사용하기를 원한다. 왜냐하면 numpy는 많은 문제에 더 빠르기 때문입니다. 여기 몇 가지 테스트되지 않은 부분이 있습니다. 당신이

from numpy import log, array, isinf, zeros 
from numpy.random import rand 

그런 다음 당신이이 StopIteration을 인상하는 것이 더 파이썬 될 경우 나도 몰라 다음

R = array([ kAB * A * C, kCD * C, kAB * A * C]) 
dt = -log(1-rand(3))/R 
transition = dt.argmin() 
interval = dt[transition] 
if isinf(interval): 
    transition = None 

같은과 내부 TransitionData를 대체 할 수있는 프로그램의 헤더에 다음을 추가 None을 반환하는 대신 예외가되지만 세부 사항입니다.

또한 농도를 단일 데이터 구조에 저장해야합니다. numpy를 사용하면 배열을 사용하는 것이 좋습니다. 마찬가지로 yoy는 배열 dABCD를 사용하여 농도의 변화를 저장할 수 있습니다 (더 나은 변수 이름을 사용할 수 있습니다). 이제 당신이 할 아마 더는이 다음

while t <= tEnd: 
     print t, '\t', transition, '\t', ABCD 
     transition, interval = transitionData(ABCD, kAB, kCD, kDC) 
     if transition != None: 
      t += interval 
      ABCD += dABCD[transition,:] 
     else: 
      break; 
else: 
     print "Warning: Stopping due to timeout. The system did not equilibrate" 

같은 당신에게 메인 루프를 대체 할 수있는 루프

ABCD = array([A,B,C,D]) 

dABCD = zeros(3,4) 
dABCD[0,0] = -1#A decreases when transition == 0 
dABCD[0,1] = 1 #B increases when transition == 0 
dABCD[1,2] = -1#C decreases when transition == 1 
dABCD[1,3] = 1 #D increases when transition == 1 
.....  etc 

외부에 다음 코드를 추가합니다. 예를 들어 dABCD는 희소 배열이어야하지만 이러한 아이디어가 시작되기를 바랍니다.

+0

nielsle, 너는 남자 야. 나는 그 의견을 정말로 고맙게 생각한다. numpy와 matplotlib를 다시 쓰는 중입니다. 내일 다시 확인해주세요. 몇 가지 질문을 드리겠습니다. 간결하고 책임감이 있어야하며, 스카우트의 영예를 얻어야합니다. 몬테카를로에 관한 제 생각은 아래에 추가 답변으로 덧붙여졌습니다 (비평은 환영합니다!) 또한 제 3의 답은 생물 물리학의 맥락에서 방정식의 의미에 관한 정보입니다.대부분 너희들에게 지루할 수도있다. – DocDubya

0

**** 편집 **** 원래이 잘못을 설명했습니다 !!!! 다음은 정확하지만 Justin,이 프로그램은 영리한 기준을 사용하여 각 이벤트의 '가중치'를 계산합니다.RAB, RCD 및 RDC 값에는 kAB, kCD 및 kDC에 C 또는 D를 곱하여 true/false 매개 변수가 모두 지정됩니다.이 경우에는 1 또는 0 일 수 있습니다. Dt [n]> 0.0이고 dt [n]> <이면 dt [2]가 범위 0 (len (dt))의 n에 대해

에 그려지는 것을 방지 할 수 있습니다. :

성명. 또한, 다음과 같은 -

if transition == 1: 
     C -= 1 
     D += 1 
    if transition == 2: 
     C += 1 
     D -= 1 

가 지시하는 경우에는 C-> D 발생 (전이 1), 다음 이벤트가 반드시> DT [3 개 값부터 C (천이 2) D-을해야 할 때 ], dt [1]만이 0이 아니므로 앞서 언급 한 기준을 충족합니다. 그렇다면 천이 0 또는 천이 1이 발생할 가능성을 어떻게 가중시키고 있습니까? 그것은 조금 까다로운하지만 다음 줄에 내재 :

interval = 1e36 
transition = -1 
for n in range(len(dt)): 
    if dt[n] > 0.0 and dt[n] < interval:    
     interval = dt[n]    
     transition = n    
return transition, interval 

"범위에서 N (LEN (DT))에 대한이 :"[] DT 목록의 모든 값을 반환합니다. 다음 줄은 충족되어야하는 기준을 지정합니다. 즉, 각 값은 0보다 크고 간격보다 작아야합니다. 전이 0의 경우 간격은 1e36입니다 (이는 무한대를 나타냄). 문질러지는 것은 interval이 transition 0으로 설정되므로 dt []의 두 번째 값 인 transition 1에 대해 조건은 발생하기 위해서 transition 0에 대한 dt보다 작아야한다는 것입니다. 화학 논리에 동의하는 일이 더 빨리 일어 났음에 틀림 없다. 가장 큰 관심사는 "t + = interval"라인에 의해 위임 된 누적 t 값이 완전히 공정하지 않을 수 있다는 것입니다. 왜냐하면 t1 발사는 t0 발사와 독립적이며 .1 발사 및 발사는 0.1 초이므로 t1이 같은 .1 초를 사용하지 못하도록합니다.하지만이 문제를 해결하기 위해 노력하고 있습니다 ... 제안을 환영합니다!

시차 전환 ABCD

dt0= 0.0350693547214 
dt1= 2.26710773787 
interval= 1e+36 
dt= 0.0350693547214 
transition= 0 

0.0 0 100 0 1 0

dt0= 0.000339596342313 
dt1= 0.21083283004 
interval= 1e+36 
dt= 0.000339596342313 
transition= 0 

0.0350693547214 0 99 : 1이 전이 1 및 2의 소성 포함한 스크립트 용장 프린트 밖으로 1 0

dt0= 0.0510125874767 
dt1= 1.26127048627 
interval= 1e+36 
dt= 0.0510125874767 
transition= 0 

0.0354089510637 98 0 2 1 0

,745 1,515,
dt0= 0.0809691957218 
dt1= 0.593246425076 
interval= 1e+36 
dt= 0.0809691957218 
transition= 0 

0.0864215385404 0 97 3 1 0

dt0= 0.00205040633531 
dt1= 1.70623338677 
interval= 1e+36 
dt= 0.00205040633531 
transition= 0 

0.167390734262 0 96 4 1 0

dt0= 0.106140534256 
dt1= 0.0915160378053 
interval= 1e+36 
dt= 0.106140534256 
transition= 0 
interval= 0.106140534256 
dt= 0.0915160378053 
transition= 1 

0.169441140598 1 95 5 1 0

dt2= 0.0482892532952 
interval= 1e+36 
dt= 0.0482892532952 
transition= 2 

0.260957178403 2 95 5 0 1

dt0= 0.112545351421 
dt1= 1.84936696832 
interval= 1e+36 
dt= 0.112545351421 
transition= 0 

0.309246431698 0 95 5 1 0

저스틴, 난 당신이 [2] 변환 2에 '숙박'을 만드는 1e36보다 작은 것을 DT 무슨 뜻인지 모르겠어요?

if transition == 2: 
      C += 1 
      D -= 1 

문 때문에 발생하지 않습니다.더 직접적인 방법을 알고있는 사람 누구나 이것을

하하, 불타는 시작하자. 너희들은 대단하다. 정말 감사한다. Stackoverflow는 soooooo 합법입니다. 화학 rxns의 간단한 확률 적 시뮬레이션의 수학적 원리에

1

정보 :

는 일반적으로이 같은 처리는 이산 각 이벤트가 특정 속도 상수 K ''주어진 확률 'P'와 발생과 이벤트와 숫자로 모의 시간 'dt'의 간격에서 'n'가능한 이벤트의 수 : P = 1-e ** (- k dt n). 여기서 우리는 각 이벤트의 실제 시간을 무시하고 (~ 0) 이벤트가 발생하는 시간 간격에 초점을 맞추고 있습니다. N에 익숙한 사람은 K 문제를 선택합니다./bernouli 예심은 1/e의 존재를 인정할 것입니다. N = K이고 N-> 0 일 때, N으로부터 특정 원소를 선택하지 않을 확률은 1/e에 접근한다. 따라서, 확률 론적 화학 반응 (1 차 순서)에서, 분자가 반응을 겪지 않을 확률 (선택되지 않음)은 시간 간격과 속도 상수뿐만 아니라 분자의 수와 문제의 속도 상수. 반대로 1- (1/e)^xyz는 특정 분자가 반응 할 확률을 나타냅니다 (선택됨).

시뮬레이션의 관점에서 볼 때 전체 시간 간격을 더 작은 간격으로 나누고 임의의 숫자 생성기를 사용하여 이벤트가 주어진 시간 간격에서 발생했는지 여부를 예측하는 것이 논리적 일 것입니다. 1 조의 dt를 10 개의 작은 간격으로 나누면 0과 0.1 사이의 숫자는 이벤트가 발생했음을 나타내고, .1과 1.0 사이의 숫자는 발생하지 않았 음을 나타냅니다. 그러나 사건이 언제 발생했는지에 대한 불확실성이 있습니다. 따라서 우리는 간격을 더 작게 만들어야합니다 .-이 방법으로 불확실성이 지속됨에 따라 이것은 빠르게 느슨한 전투가됩니다.

위의 방정식의 양측에 대한 자연 로그 (여기에서 log()는 기본적으로 py)를 취하고 dt에 대해 풀면 dt = (-ln (1 -P))/(k * n)이다. 확률 P는 무작위로 생성되어 각 이벤트에 대해 최종 dt를 제공합니다.

관련 문제