优化odeint的写方程

时间:2016-05-18 17:46:43

标签: python scipy odeint

我为odeint

解决的简单化学网络编写了以下代码
def chemnet(y,t):
    assoc=0.1,0.001,1
    oxy=0.001,0.1,0.001
    f=zeros(6,float)
    f[0]= -2*assoc[0]*y[0]**2-assoc[1]*y[0]*y[1]-assoc[2]*y[0]*y[2]-oxy[0]*y[0]*y[4]+oxy[1]*y[1]*y[4]
    f[1]= +assoc[0]*y[0]**2-assoc[1]*y[0]*y[1]-oxy[1]*y[1]*y[4]+oxy[2]*y[2]*y[4]
    f[2]= +assoc[1]*y[0]*y[1]-assoc[2]*y[0]*y[2]-oxy[2]*y[2]*y[4]  
    f[3]= +assoc[2]*y[0]*y[2]
    f[4]= -oxy[0]*y[0]*y[4]-oxy[1]*y[1]*y[4]-oxy[2]*y[2]*y[4]
    f[5]= +oxy[0]*y[0]*y[4]+oxy[1]*y[1]*y[4]+oxy[2]*y[2]*y[4]
    return f
time = linspace(0.0,10.0,1000)
yinit = array([1,0,0,0,0.25,0]) 
y = odeint(chemnet,yinit,time)

随着我扩大网络的规模,方程的数量和每个方程的长度增加,因为一些物种有许多可能的反应。我想自动创建这些方程的过程,即伪代码:

#reaction 0+n->n+1
for n in range(len(assoc)):
    f[0].append(-assoc[n]*y[0]*y[n])
    f[n].append(-assoc[n]*y[0]*y[n])
    f[n+1].append(+assoc[n]*y[0]*y[n])

但我不太确定如何做到这一点,或者它是否可能。我仍然是一个蟒蛇新手,但似乎这应该比它更直接。

1 个答案:

答案 0 :(得分:1)

您可以自动构建等式,但如果不明确地构建等式,则更容易自动化评估。

修改您的示例:

def chemnet(y,t):
    assoc=0.1,0.001,1
    oxy=0.001,0.1,0.001
    f=zeros(6,float)
    f[0]= -oxy[0]*y[0]*y[4]+oxy[1]*y[1]*y[4]
    f[1]= -oxy[1]*y[1]*y[4]+oxy[2]*y[2]*y[4]
    f[2]= -oxy[2]*y[2]*y[4]  
    f[3]= 0.
    f[4]= -oxy[0]*y[0]*y[4]-oxy[1]*y[1]*y[4]-oxy[2]*y[2]*y[4]
    f[5]= +oxy[0]*y[0]*y[4]+oxy[1]*y[1]*y[4]+oxy[2]*y[2]*y[4]

    #reaction 0+n->n+1
    for n,assoc_n in enumerate(assoc):
        f[0] -= assoc_n*y[0]*y[n]
        f[n] -= assoc_n*y[0]*y[n]
        f[n+1] += assoc_n*y[0]*y[n]
    return f

time = linspace(0.0,10.0,1000)
yinit = array([1,0,0,0,0.25,0]) 
y = odeint(chemnet,yinit,time)

通过这样的线性关系,您还可以构建稀疏交互矩阵并使用矩阵产品进行更新。