将字典和字符串列表转换为变量以解决ODE

时间:2015-11-18 11:51:54

标签: string list dictionary ode equation-solving

说我有一个表示方程式的字符串列表

['', '-protein_0*Kdeg_protein_0+mRNA_0*Ktrans_0', 
'-mRNA_0*Kdeg_mRNA_0+gene_0*Kprod_0', '+mRNA_0*Kdeg_mRNA_0+protein_0*Kdeg_protein_0']

参数值为浮点数的字典

{'Kdeg_protein_0': 0.5865674906323503, 'Kdeg_mRNA_0': 0.873345564768431, 'Kprod_0': 13.403565061372824, 'Ktrans_0': 10.37622098808632}

和州的字典

{'Bin': 'y[3]', 'gene_0': 'y[0]', 'mRNA_0': 'y[2]', 'protein_0': 'y[1]'}

我想把它变成这样的形式,以便它可以通过scipy integrate.odeint来解决,比如

def ODEs(y,t,input_1,input_2,input_3):  
   Equations   = input_1
   Parameters  = input_2
   States      = input_3


   for key,value in Parameters.items():
     exec(key + '=value')  
   for key,value in States.items():
     exec(key + '=value') 
   for i in range(len(Equations)):
     Equations[i] = eval(Equations[i])   
   return Equations

def main():
    t = numpy.linspace(0,24,24*60)
    y0 = [10,0,0,0]
    y = integrate.odeint(ODEs,y0,t,(GG,PP,LL),)
    print y

我还没有能够解决这个问题,任何解决这个或其他方法的建议,初始数据必须是包含字符串的列表或字典形式

此刻我收到此错误: 一元+的坏操作数类型:' str' 对于被评估的方程式

2 个答案:

答案 0 :(得分:1)

编辑:对参数做了一些错误的假设;需要使用正则表达式来保证状态变量名称不包含在参数名称中。

你的问题是你写的方程包含未定义的变量,你需要用y [0],y [1]等替换状态变量。我假设方程总是包含有效的python语法?

如果添加

,您的解决方案应该有效
import re

到文件顶部,然后替换

for key,value in Parameters.items():
   exec(key + '=value')  
for key,value in States.items():
   exec(key + '=value') 

for key,value in Parameters.items():
   exec('{} = {}'.format(key,value))

for key,value in States.items():
   for i in range(len(Equations)):
      Equations[i] = re.sub(r"\b%s\b" % key, value, Equations[i])

并按照答案中的方式对空字符串进行排序。正则表达式确保整个单词匹配,而不是子字符串。

答案 1 :(得分:1)

由于某些原因,在尝试为ODE求解器构建函数时将字符串转换为变量是很棘手的,只能考虑先用浮点数和矩阵索引单独替换所有内容并将其插入到构建模型的模型构建函数中可以通过odeint解决的模型

def Equation_Builder(input_1,input_2,input_3):  
    Equations   = input_1
    Parameters  = input_2
    States      = input_3   
    for key,value in Parameters.items(): 
       exec('{} = {}'.format(key,value))
    print Parameters
    for i in range(len(Equations)):
      for key,value in States.items():
          Equations[i] = Equations[i].replace(key,value)
    for i in range(len(Equations)):          
      for key,value in Parameters.items():
          Equations[i]  = Equations[i].replace(key,value)
    for i in range(len(Equations)):
        if Equations[i] == '':
            Equations[i] ='0'
    return Equations  

def Model_Builder(input_1):
    Equations = input_1
    def model(y,t):
        dydt = numpy.zeros(len(Equations))
        for i in range(len(Equations)):
            dydt[i] = eval(''.join(Equations[i]))
        return dydt
    return model

def main():
    t = numpy.linspace(0,24,24*60)
    y0 = [10,0,0,0]
    model = Model_Builder(Equations)
    y = integrate.odeint(model,y0,t)
    print y