Python 如何将lambda表达式与scipy.derivative方法正确结合使用?

Python 如何将lambda表达式与scipy.derivative方法正确结合使用?,python,function,lambda,scipy,Python,Function,Lambda,Scipy,我编写了以下函数来计算反应系统中单个反应激发的概率,并将函数的输出、系统激发的每个反应的概率存储为一个数组: 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)

我编写了以下函数来计算反应系统中单个反应激发的概率,并将函数的输出、系统激发的每个反应的概率存储为一个数组:

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
是一个2D数组,具有系统中每个反应的每个分子种类之间的比率,
stoch_rate
是每个反应的速率

现在我想用SimPi.MISC.Mead方法在不同函数中调用<代码> PROSPIONITY CALC/<代码>函数,计算偏导数:BJI(x)= DAJ(x)/Xi,其中AJ(x)是由上述的PosithySalc函数的结果,席席是相应的PuxnNUM数组的相应元素。p> 这是我到目前为止写的:

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
来自scipy.misc导入衍生工具
从scipy导入优化
定义时间步长计算(人口数、状态变化数组、a0):
#等式22:
expctd_net_change=a0*状态_change_数组
打印(“预期净变化:\n”,expctd\u净变化)
#方程24偏微分:
对于范围内的x(len(popul_num)):

part_-property_diff=导数(lambda LHS,popul_num,stoch_rate:property_calc,popul_num[x])您定义的
lambda
是一个由三个参数组成的常数函数,总是返回一个函数。因为你想要一个一维函数(据我所知),你的意思可能是:

lambda popul\u num:倾向性计算(LHS、popul\u num、stoch\u rate)
这可以理解为“接受名为
popul\u num
的参数并返回
property\u calc(LHS、popul\u num、stoch\u rate)
”的函数


通过使用上述
lambda
populi_num[x]
点调用
scipy.misc.derivative
,您将获得
倾向计算
相对于
populi_num
(LHS,populi_num,stoch_rate)
的偏导数值。这意味着在这种情况下,您必须定义
LHS
stoch_rate
。事实上,不要忘记偏导数仍然是三个参数的函数。

您定义的
lambda
是三个参数的常数函数,总是返回一个函数。因为你想要一个一维函数(据我所知),你的意思可能是:

lambda popul\u num:倾向性计算(LHS、popul\u num、stoch\u rate)
这可以理解为“接受名为
popul\u num
的参数并返回
property\u calc(LHS、popul\u num、stoch\u rate)
”的函数


通过使用上述
lambda
populi_num[x]
点调用
scipy.misc.derivative
,您将获得
倾向计算
相对于
populi_num
(LHS,populi_num,stoch_rate)
的偏导数值。这意味着在这种情况下,您必须定义
LHS
stoch_rate
。事实上,不要忘记偏导数仍然是三个参数的函数。

通常,Scipy只向lambda函数传递一个参数,因此它只传递LHS的值。请看下面的示例:

这里,4.99是将x移动1e-6时f对x=1的导数。假设f有两个变量:

def f(x, y):
    return x**3 + y**2

如果需要y的偏导数,那么需要为scipy提供一个包装函数来了解要更改的变量。这看起来像:

def wrapper(y):
    return f(x, y)
当然,现在你需要一个x的值

x = 1
derivative(wrapper, 2)
4.0

通常,Scipy只向lambda函数传递一个参数,因此它只传递LHS的值。请看下面的示例:

这里,4.99是将x移动1e-6时f对x=1的导数。假设f有两个变量:

def f(x, y):
    return x**3 + y**2

如果需要y的偏导数,那么需要为scipy提供一个包装函数来了解要更改的变量。这看起来像:

def wrapper(y):
    return f(x, y)
当然,现在你需要一个x的值

x = 1
derivative(wrapper, 2)
4.0

谢谢你的帮助,但是w.r.t速记代表什么?关于感谢帮助,但是w.r.t速记代表什么?关于感谢,我对包装函数有点不确定。你能给我指一个能让我更多了解他们的地方吗?Cheeset只是一个调用另一个函数的函数(在本文中,使用较少的参数)。这相当于做:导数(λy:f(x,y),2)谢谢,我对包装函数有点不确定。你能给我指一个能让我更多了解他们的地方吗?Cheeset只是一个调用另一个函数的函数(在本文中,使用较少的参数)。它等价于doing:导数(λy:f(x,y),2)