【发布时间】:2020-06-02 08:15:12
【问题描述】:
我编写了以下函数来计算反应系统中单个反应触发的概率并将函数的输出,即系统触发中每个反应的概率存储为数组:
def propensity_calc(LHS, popul_num, stoch_rate):
propensity = np.zeros(len(LHS))
for row in range(len(LHS)):
a = stoch_rate[row]
for i in range(len(popul_num)):
if (popul_num[i] >= LHS[row, i]):
binom_rxn = binom(popul_num[i], LHS[row, i])
a = a*binom_rxn
else:
a = 0
break
propensity[row] = a
return propensity
此函数的输入是 3 个数组 popul_num 具有每个反应物的离散分子数,LHS 是一个二维数组,其中包含系统中每个反应的每个分子种类之间的比率,stoch_rate 是每个反应的速率。
我现在想在不同的函数中使用 scipy.misc.derivative 方法调用 propensity_calc 函数来计算偏导数:bji(x) = daj(x)/xi,其中 aj(x) 是上述 propensity_calc 函数的结果,xi 是 popul_num 数组的对应元素。
这是我目前所写的:
from scipy.misc import derivative
from scipy import optimize
def time_step_calc(popul_num, state_change_array, a0):
# equation 22:
expctd_net_change = a0*state_change_array
print("expected net change:\n", expctd_net_change)
# equation 24 partial differentiation:
for x in range(len(popul_num)):
part_propensity_diff = derivative(lambda LHS, popul_num, stoch_rate: propensity_calc, popul_num[x]) <-- Error here with the number of arguments passed to lambda
# equation 26:
t_step = epsi*a0 / sum(expctd_net_change*part_propensity_diff)
delta_t = optimize.fmin(t_step, 0.00012)
print("calculated delta_t:\n", delta_t)
return delta_t
为了将 propensity_calc 函数传递给 scipy.derviative,我尝试使用 lambda 函数,但出现以下错误:
File "C:\Users\Mike\AppData\Local\Programs\Python\Python38-32\lib\site-packages\scipy\misc\common.py", line 119, in derivative
val += weights[k]*func(x0+(k-ho)*dx,*args)
TypeError: <lambda>() missing 2 required positional arguments: 'popul_num' and 'stoch_rate'
我已经阅读了 lambda 文档,但我仍然不明白我哪里出错了,关于如何修复这个错误并进行偏微分的任何建议?
干杯
【问题讨论】:
标签: python function lambda scipy