2017-07-28 55 views
2

我有一个由一个函数描述的方程组。用于ODE系统的Python编码

  1. 产品从反应物
  2. 部分产品打破
  3. 的细分产品的某一百分比被回收到初始反应物
  4. 系统继续提供更多的产品周期正在进行,直到所有的构建极限反应物在非循环产品内或不可用的“损失产品”内

鉴于产品组成上没有变化。我需要进入系统的反应物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() 

问候。

+0

欢迎设置您的大规模行动颂歌堆栈溢出。这里你真正的问题是什么? – MrLeeh

+0

感谢您的欢迎。我想知道为什么当我试图回收反应物时,会影响它们被利用的比例。 – Uaru427

+0

另外我想知道为什么产品2,迷失1和迷失2不会随着时间积累。我希望系统耗尽反应物,使整个数量陷入这三组中。 – Uaru427

回答

0

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

- 如果来自质量作用法则的每个ODE都是线性的(即没有浓度相乘),隐式方法很容易实现。我建议先从“梯形方法”开始,然后再实施高阶整合方案,让人恶心。

- 如果你的系统是非线性的,这个问题有点难以解决。如果所有的均衡/速率常数的幅度相似,那么可以使用明确的整合方案,而不会有太多麻烦。显式RK4不应太难实现。

- 我会建议您验证您在科学文献中发布的针对大规模行动派生的任何微分方程组,尤其是如果化学动力学不是您的专业领域。如果这是一个通常被调查的化学系统,这样的推导不应该太难找到。

- 如果您的质量操作系统已正确设置并且您的集成方案正常工作,应该明显地保持质量守恒。为了证实这一点,我将选择这个系统中所有形式(即二氧化碳和一氧化碳中的碳)具有相同化学计量系数的元素,并确认它在系统中的丰度是恒定的。

这里是一个链接,可以帮助您开始

Law of Mass Action