如何在函数中编写包含许多常量的公式,同时在不使用全局变量的情况下保持其名称有意义?

时间:2011-03-03 21:41:12

标签: python chemistry

我有一个应该使用ode求解器解决的函数。问题是它有很多常数(比如100),同时我不想把它们放在一个数组中,因为很难理解公式(化学物质)。我在此函数中的部分代码如下所示:

 # Component: Calcium Fluxes

    J_rel =  v1*(P_O1+P_O2)*(Ca_JSR - Ca_ss)*P_RyR # (micromolar_per_millisecond)
    J_tr = (Ca_NSR - Ca_JSR)/tau_tr #  (micromolar_per_millisecond)
    J_leak =  v2*(Ca_NSR - Ca_i) #  (micromolar_per_millisecond)
    J_up = ( v3*(Ca_i ^ 2.00000))/((K_m_up ^ 2.00000)+(Ca_i ^ 2.00000)) #  (micromolar_per_millisecond)
    J_xfer = (Ca_ss - Ca_i)/tau_xfer #  (micromolar_per_millisecond)
    P_RyR_prime =  - 0.0400000*P_RyR -  (( 0.100000*I_Ca_channels)/i_CaL_max)*(exp(( - ((V_m - 5.00000) ^ 2.00000)/648.000))) #  (micromolar_per_millisecond)

如果我想把它们放在一个数组中,它就会变成这样:

J_rel =  algebraic[2]*(constants[21]+constants[3])*(constants[4] - Ca_ss)*P_RyR # (micromolar_per_millisecond)
J_tr = (Ca_NSR - Ca_JSR)/tau_tr #  (micromolar_per_millisecond)
J_leak =  constants[31]*(Ca_NSR - Ca_i) #  (micromolar_per_millisecond)
J_up = ( constants[69]*(Ca_i ^ 2.00000))/((constants[17] ^ 2.00000)+(Ca_i ^ 2.00000)) #  (micromolar_per_millisecond)
J_xfer = (Ca_ss - Ca_i)/tau_xfer #  (micromolar_per_millisecond)
P_RyR_prime =  - 0.constants[5]*P_RyR - (( 0.100000*constants[65])/constants[43])*(exp(( - ((V_m - constants[4]) ^ 2.00000)/constants[34]))) #  (micromolar_per_millisecond)

很难“看到”实际的公式。我必须将常量定义为全局变量吗?这个函数由ode求解器使用,并且迭代大约50000次。所以我需要一些有效的东西。

P.S。我正在使用python(scipy库),但我认为其他语言也可能存在同样的问题。

非常感谢

3 个答案:

答案 0 :(得分:2)

第二个想法,为什么不使用全局变量?它会给你一个漂亮,简单,快速的结果。在python中,全局变量将仅限于它们所定义的模块,因此您不必担心它们会像C一样污染整个程序。

答案 1 :(得分:1)

如果您想避免污染命名空间,可以使用字典:

c = { 'Ca_NSR' : 1.5, ... }

J_rel =  v1*(P_O1+P_O2)*(c['Ca_JSR'] - c['Ca_ss'])*P_RyR

你也可以使用一个类:

def Constants(object):
    def __init__(self):
        self.Ca_NSR = 1.5
        # etc...

c = Constants()
J_rel =  v1*(P_O1+P_O2)*(c.Ca_JSR - c.Ca_ss)*P_RyR

答案 2 :(得分:1)

您可以使用函数关键字参数将dict“解包”到本地名称空间中:

c = { 'Ca_NSR' : 1.5, ... }

def f(Ca_JSR, Ca_ss, ...):
  J_rel =  v1*(P_O1+P_O2)*(Ca_JSR - Ca_ss)*P_RyR

f(**c)

有关f(** c)含义的详细信息,请参阅keyword argument上的文档。