如何让 python 计数器在具有多个 if 语句的函数中工作?
How can I get a python counter to work in a function with multiple if statements?
我有一个很大的函数可以模拟随时间变化的反应系统。我添加了一个 leap_couner
来计算时间的步数。
def gillespie_tau_leaping(propensity_calc, popul_num, LHS, stoch_rate, popul_num_all, tao_all, rxn_vector, delta_t, tao, epsi):
t = simulation_timer()
t.start()
while tao < tmax:
propensity = propensity_calc(LHS, popul_num, stoch_rate)
a0 = (sum(propensity))
if a0 == 0.0:
print("Propensity sum is zero end execution")
break
if popul_num.any() < 0:
print("Molecules numbers below zero end execution")
break
lam = (propensity_calc(LHS, popul_num, stoch_rate)*delta_t)
rxn_vector = np.random.poisson(lam)
if tao + delta_t > tmax:
break
tao += delta_t
leap_counter = 0
if delta_t >= 1 / a0:
for j in range(len(rxn_vector)):
state_change_lambda = np.squeeze(np.asarray(state_change_array[j])*rxn_vector[j])
popul_num = popul_num + state_change_lambda
leap_counter += 1 # Not working!
popul_num_all.append(popul_num)
tao_all.append(tao)
leap_counter += 1
else: # else execute the ssa because it's faster
next_t = np.random.exponential(1/a0)
rxn_probability = propensity / a0
num_rxn = np.arange(rxn_probability.size)
if tao + next_t > tmax:
tao = tmax
break
j = stats.rv_discrete(values=(num_rxn, rxn_probability)).rvs()
tao = tao + next_t
popul_num = popul_num + np.squeeze(np.asarray(state_change_array[j]))
popul_num_all.append(popul_num)
tao_all.append(tao)
print("Molecule numbers:\n", popul_num)
print("Time of final simulation:\n", tao)
print("leap counter:\n", leap_counter)
t.stop()
return popul_num_all.append(popul_num), tao_all.append(tao), popul_num
这就是完整的功能,这里是计数器的特定位:
if tao + delta_t > tmax:
break
tao += delta_t
leap_counter = 0
if delta_t >= 1 / a0:
for j in range(len(rxn_vector)):
state_change_lambda = np.squeeze(np.asarray(state_change_array[j])*rxn_vector[j])
popul_num = popul_num + state_change_lambda
leap_counter += 1 # Not working!
popul_num_all.append(popul_num)
tao_all.append(tao)
tao
是当前时间,delta_t
是增加的值,tmax
是最大模拟时间。如果 tao + delta_t
小于 tmax
,则当前时间增加 delta_t
。
然后我使用 delta_t
来确定我使用哪种飞跃方法。如果我使用第一个跳跃方法 if delta_t >= 1/a0
那么我想计算每次增量(按 delta_t
)和 return 增量数 leap_counter
只是我在使用计数器时遇到了问题,目前它 return 为零,我不确定如何更改它以使其正常工作
干杯
您需要移动线路
leap_counter = 0
在 while 循环之外。目前它被设置为 0
每次迭代
我有一个很大的函数可以模拟随时间变化的反应系统。我添加了一个 leap_couner
来计算时间的步数。
def gillespie_tau_leaping(propensity_calc, popul_num, LHS, stoch_rate, popul_num_all, tao_all, rxn_vector, delta_t, tao, epsi):
t = simulation_timer()
t.start()
while tao < tmax:
propensity = propensity_calc(LHS, popul_num, stoch_rate)
a0 = (sum(propensity))
if a0 == 0.0:
print("Propensity sum is zero end execution")
break
if popul_num.any() < 0:
print("Molecules numbers below zero end execution")
break
lam = (propensity_calc(LHS, popul_num, stoch_rate)*delta_t)
rxn_vector = np.random.poisson(lam)
if tao + delta_t > tmax:
break
tao += delta_t
leap_counter = 0
if delta_t >= 1 / a0:
for j in range(len(rxn_vector)):
state_change_lambda = np.squeeze(np.asarray(state_change_array[j])*rxn_vector[j])
popul_num = popul_num + state_change_lambda
leap_counter += 1 # Not working!
popul_num_all.append(popul_num)
tao_all.append(tao)
leap_counter += 1
else: # else execute the ssa because it's faster
next_t = np.random.exponential(1/a0)
rxn_probability = propensity / a0
num_rxn = np.arange(rxn_probability.size)
if tao + next_t > tmax:
tao = tmax
break
j = stats.rv_discrete(values=(num_rxn, rxn_probability)).rvs()
tao = tao + next_t
popul_num = popul_num + np.squeeze(np.asarray(state_change_array[j]))
popul_num_all.append(popul_num)
tao_all.append(tao)
print("Molecule numbers:\n", popul_num)
print("Time of final simulation:\n", tao)
print("leap counter:\n", leap_counter)
t.stop()
return popul_num_all.append(popul_num), tao_all.append(tao), popul_num
这就是完整的功能,这里是计数器的特定位:
if tao + delta_t > tmax:
break
tao += delta_t
leap_counter = 0
if delta_t >= 1 / a0:
for j in range(len(rxn_vector)):
state_change_lambda = np.squeeze(np.asarray(state_change_array[j])*rxn_vector[j])
popul_num = popul_num + state_change_lambda
leap_counter += 1 # Not working!
popul_num_all.append(popul_num)
tao_all.append(tao)
tao
是当前时间,delta_t
是增加的值,tmax
是最大模拟时间。如果 tao + delta_t
小于 tmax
,则当前时间增加 delta_t
。
然后我使用 delta_t
来确定我使用哪种飞跃方法。如果我使用第一个跳跃方法 if delta_t >= 1/a0
那么我想计算每次增量(按 delta_t
)和 return 增量数 leap_counter
只是我在使用计数器时遇到了问题,目前它 return 为零,我不确定如何更改它以使其正常工作
干杯
您需要移动线路
leap_counter = 0
在 while 循环之外。目前它被设置为 0
每次迭代