Как писать формулы, содержащие много констант в функции, сохраняя их имена значимыми без использования глобальных переменных? - PullRequest
0 голосов
/ 04 марта 2011

У меня есть функция, которую нужно решить с помощью ode solver. Проблема в том, что у него много констант (скажем, 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 solver и повторяется около 50000 раз. Поэтому мне нужно что-то эффективное.

P.S. Я использую Python (библиотека Scipy), но я думаю, что такая же проблема может возникнуть и на других языках.

Большое спасибо

Ответы [ 3 ]

2 голосов
/ 04 марта 2011

Если подумать, почему бы просто не использовать глобальные переменные? Это даст вам красивый, простой и быстрый результат. В python глобальные переменные будут ограничены модулем, в котором они определены, поэтому вам не нужно беспокоиться о том, что они загрязняют всю программу, как, скажем, в C.

1 голос
/ 04 марта 2011

Вы можете использовать аргументы ключевых слов функции, чтобы "распаковать" диктовку в локальное пространство имен:

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)) означает.

1 голос
/ 04 марта 2011

Если вы хотите избежать загрязнения пространства имен, вы можете использовать словарь:

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
...