import numpy as np
import math
from numba import jit
Qpvec = np.logspace(-2,1,101,10)
lenQp = len(Qpvec)
delta = 1e-3
P0vec = Qpvec/delta
SimNum = 100
maxtime = 0.1
PTotStoch = np.zeros((SimNum,lenQp))
k_minus = 1e-3
k_cat = 1-1e-3
k_plus = 1e-3
zeta = 1e-4
D0 = 10000
kappa_M = (k_cat+k_minus)/zeta
QpDeg = np.true_divide(1000*D0*Qpvec*k_cat,1000*Qpvec + kappa_M)
@jit
def mmm():
for lenQpInd in range(0,lenQp):
for SimNumInd in range(0,SimNum):
Qp = Qpvec[lenQpInd]
P0 = P0vec[lenQpInd]
DP0 = 0
P = math.floor(P0)
DP = DP0
D = D0
time = 0
while time < maxtime:
u_time = pl.rand()
u_event = pl.rand()
rates=np.array([Qp,zeta*P*D,k_minus*DP,k_cat*DP])
PTot = P + DP
kT = np.sum(rates)
tot = np.cumsum(rates)
deltaT = -np.log(1-u_time)/kT
time += deltaT
if time > maxtime:
PTotStoch[SimNumInd,lenQpInd] = PTot
break
elif u_event*kT < tot[0]:
P += 1
elif u_event*kT < tot[1]:
P -= 1
DP += 1
D -= 1
elif u_event*kT < tot[2]:
P += 1
DP -= 1
D += 1
elif u_event*kT < tot[3]:
DP -= 1
D += 1
PMean = PTotStoch.mean(axis=0)
PStd = PTotStoch.std(axis=0)
return PMean
return PStd
return PMean, PStd
PMean, PStd = mmm()
from __future__ import print_function
return PMean, PStd print(PMean) print(PStd)