用于ODE系统的Python编码

时间:2017-07-28 10:34:38

标签: python math ode differential-equations

我有一个由函数描述的方程组,其中。

  1. 产品由反应物构成
  2. 一些产品崩溃
  3. 一部分分解产品再循环回初始反应物
  4. 系统继续循环,产生更多产品,直到所有限制性反应物都在非循环产品中或不能使用的产品中。
  5. 鉴于产品的成分没有变化。我需要进入系统的反应物1的量与进入系统的反应物2的量成正比。因此,当所有反应物1被消耗时,不再消耗反应物2。

    目前,当没有反应物再循环时,反应物消耗的比率是恒定的,然而,当反应物在管线react1=-R1 - R5react2=-R2 - R6中循环时,所用反应物的比例被改变。

    第二个问题是在循环产品2期间,丢失的产品不会持续增加。相反,它们似乎分别与产品1和再生产品保持固定比例。

    我认为这两个问题都是由于我试图回收系统内的反应物的原因造成的。任何帮助,将不胜感激。

    import numpy as np
    from scipy.integrate import odeint
    import matplotlib.pyplot as plt
    import math
    import pylab as p
    
    def sample_func (y,t):
    
    
        k1 = 10**-4
        k2 = k1/4
        k3 = 0.1
        Recycle0=0.8
        Recycle2=0.7
    
    
        R1= -k1*y[0]*y[2]  # Rate of substance 1 consumption
        R2= -k2*y[0]*y[2]  # Rate of substance 2 consumption 
        #These must be constantly proportional to one another 
    
        R3= 0.2*R1+0.7*R2    #Product 1
        R4= 0.8*R1+0.3*R2    #Product 2 
    
        R5=R3*Recycle0      #Recycled substance 1 of product 1  
        R6=R3*Recycle2      #Recycled substance 2 of product 1
    
        R7=R3*(1-Recycle0)
        R8=R3*(1-Recycle2)
    
        used1 =     R1
        react1=     -R1 - R5 
        used2 =     R2
        react2=     -R2 - R6
        prod1=      -R3 
        prod2=      -R4
        recycledr1 =-R5
        recycledr2 =-R6
        lost1      =-R7
        lost2      =-R8
    
        return [used1, react1, used2,react2,prod1,prod2, recycledr1,recycledr2,lost1,lost2]
    
    
    
    
    
    y0=(3,11,3,12,0.01,0.01,0.01,0.01,0.01,0.01)
    tspan=np.arange(0,15000,1)
    Conc= odeint(sample_func,y0,tspan)
    
    
    
    react1          = Conc[:,0]
    used1           = Conc[:,1] 
    react2          = Conc[:,2]
    used2           = Conc[:,3]
    prod1           = Conc[:,4]
    prod2           = Conc[:,5]
    recycledr1      = Conc[:,6]
    recycledr2      = Conc[:,7]
    
    print("Consumed R1 & R2 RATIOS AT DIFFERENT TIME POINTS")
    print((Conc[1:2,1]-Conc[0:1,1])/(Conc[1:2,3]-Conc[0:1,3]), " 1 HOURS")
    print((Conc[50:51,1]-Conc[0:1,1])/(Conc[50:51,3]-Conc[0:1,3]), "50 HOURS")
    print((Conc[1000:1001,1]-Conc[0:1,1])/(Conc[1000:1001,3]-Conc[0:1,3]), "1000 HOURS")
    
    plt.plot(tspan,react1,label='react1')
    plt.plot(tspan,used1,label='used1')
    plt.plot(tspan,react2,label='react2')
    plt.plot(tspan,used2,label='used2')
    plt.plot(tspan,prod1,label='product1')
    plt.plot(tspan,prod2,label='product2')
    plt.plot(tspan,recycledr1,label='recycled react 1')
    plt.plot(tspan,recycledr2,label='recycled react 2')
    
    
    plt.xlabel("time (hours)")
    plt.ylabel("quantity")
    plt.title("production v time")
    plt.legend()
    
    p.show()
    

    的问候。

1 个答案:

答案 0 :(得分:0)

在我看来,OP Duffymo提供了一个合理的观察。每个反应物应该有一个单独的ODE。我曾多次处理过这种性质的问题,我也有一些建议:

- 如果来自质量作用定律的每个ODE是线性的(即没有浓度相乘),则可以容易地实施隐式方法。我建议从"梯形方法开始#34;然后实施更高阶的集成方案恶心。

- 如果你的系统是非线性的,这个问题就更难解决了。如果所有均衡/速率常数的大小相似,那么您可能会使用显式积分方案而不会有太多麻烦。明确的RK4不应该太难实现。

- 我建议验证您在科学文献中发表的针对质量作用推导的任何微分方程系统,特别是如果化学动力学不是您的专业领域。如果这是一个经常被研究的化学系统,那么推导应该不会太难找到。

- 如果您的质量操作系统设置正确并且您的整合方案正常工作,则应明显保持质量守恒。为了验证这一点,我将选择该系统中所有形式具有相等化学计量系数的元素(即CO2和CO中的碳),并验证其在系统中的丰度是恒定的。

这是一个可能有助于您开始设置群发动作ODE的链接

Law of Mass Action