2017-07-28 51 views
2

私は、関数で記述された方程式のシステムを持っています。ODEシステム用のPythonコーディング

  • の製品は、すべてのまで行われて
  • いくつかの製品が
  • システムはより多くの製品とのサイクルに続く初期反応物質に戻して再利用される分解物のいくつかの割合を打破反応物から構成されている
      制限された反応物は、非循環製品または使用不能な「失われた製品」内にある。

    生成物の組成が変化しないと仮定すると、システムに入る反応物1の量は、システムに入る反応物2の量に正比例している必要があります。したがって、反応物1の全てが消費されると、それ以上の反応物2が消費されない。

    現在、反応物のリサイクルがない場合、反応物消費量の比は一定であるが、反応物がライン内で循環される場合には、使用される反応物の比率が変更される。

    2番目の問題は、製品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が時間の経過とともに蓄積していない理由を知りたいと思います。システムが反応物質から使い果たして、その3つのグループにすべての量が詰まっていないようにしたい。 – Uaru427

    答えて

    0

    OPダフィモは、私の意見では、健全な観察を提供します。反応物ごとに個別のODEが必要です。

    - 質量作用の法則からの各ODEが線形(すなわち、濃度が掛け合わされていない)であれば、暗黙のアプローチが容易に実現される。私は、 "台形法"から始めて、高次の統合スキームを実行することをお勧めします。

    - システムが非線形である場合、この問題は解決するのが少し難しいです。 euqilibrium/rate定数のすべての大きさが類似している場合、あまり問題なく明示的な統合スキームを使用できます。明示的なRK4は実装するのが難しくありません。

    -Iは、特に化学反応速度論があなたの専門分野ではない場合、科学文献に掲載された大量派生派生に対して、どのような微分方程式の系を検証するかを示唆します。これが一般的に調査された化学システムであれば、そのような派生物は見つけにくいはずはありません。

    - マスアクションシステムが正しく設定されていて、統合スキームが適切に機能している場合は、質量の保全を目に見える形で維持する必要があります。これを確かめるために、私はすべての形の化学量論的係数が等しいこのシステムの要素(すなわち、CO2とCO中の炭素)を選択し、システム内の存在量が一定であることを検証する。ここで

    は、あなたがスタックオーバーフローにご質量作用のODE

    Law of Mass Action