说我有一个表示方程式的字符串列表
['', '-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' 对于被评估的方程式
答案 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