* 편집 됨 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()
실제 질문을 숨이 막히는 의식 흐름에서 파싱하기가 어렵습니다. 실제 질문이 실제로 무엇인지 요약 해 주시면 실제로 대답 할 수 있습니까? –
몬테카를로 비트가 잘못된 것처럼 보입니다. 'dt [2]'가 1e36보다 작 으면 천이는 항상 2와 같습니다. 나는 이런 종류의 시뮬레이션을 완전히 이해하지 못한다는 것을 인정하지만, 그 부분은 나에게 물고기 같아 보인다. 'dt'가 임의의 프로세스를 무작위로 결정하는 가중치로서 어떤 식 으로든 사용되어야하는 것처럼 보입니다. 무작위가 있지만, 잘못된 방향으로가는 것처럼 보입니다. –
감사합니다. 나는 몬테 카를로 (Monte Carlo)의 저스틴 (Justin)을 아직 보지 못했지만, 나는 그것에 도달하자마자 의견을 말할 것이다. S. Lott- 네 말이 맞아, 나는 그 일을하는 것이 나쁘다. 내 게시물을 조금 편집 할 것입니다 .- 하하. 방금 '익숙하지 않은 부분이었던 호출자에게 반환 값을 전달하는'것을 발견했습니다. 필자는 지금까지 한꺼번에 배열을 사용하여 함수를 정의함으로써 간단한 시뮬레이션으로 도망 갈 수있었습니다. 하지만 그래, 내 게시물의 요지는 - WTF 였어? 나는 옳은 길에 있다고 생각한다. 오늘 나중에 재교부하겠습니다. – DocDubya