python求解微分方程

时间:2017-09-25 13:16:31

标签: python differential-equations odeint

我试图解决四种不同的微分方程。在谷歌搜索和研究之后,我终于能够理解求解器的工作原理,但我无法专门正确地运行这个问题。代码编译但图表不正确。

我认为问题在于函数内部的卷表达式,它将根据已经过了多长时间而改变。然后将使用特定时间的体积来求解微分方程的右侧。

时间向量的间隔,起点和终点是正确的。常数也是正确的。

import numpy as np
import scipy.integrate as integrate
import matplotlib.pyplot as plt

#defining all constants and initial conditions
k=2.2
CB0_inlet=.025
V_flow_inlet=.05
V_reactor_initial=5
CA0_reactor=.05
FB0=CB0_inlet*V_flow_inlet

def dcdt(C,t):
    #expression of how volume in reactor varies with time
    V=V_flow_inlet*t+C[4]   #C[4] is the initial reactor volume    ###we dont need things C to be C0 correct?

    #calculating right hand side of the four differential equations
    dadt=-k*C[0]*C[1]-((V_flow_inlet*C[0])/V)
    dbdt=((V_flow_inlet*(CB0_inlet-C[1]))/V)-k*C[0]*C[1]
    dcdt=k*C[0]*C[1]-((V_flow_inlet*C[2])/V)
    dddt=k*C[0]*C[1]-((V_flow_inlet*C[3])/V)

    return [dadt,dbdt,dcdt,dddt,V]  

#creating time array, initial conditions array, and calling odeint
t=np.linspace(0,500,100)
initial_conditions=[.05,0,0,0,V_reactor_initial]  # [CA0 CB0 CC0 CD0 
#V0_reactor]
C=integrate.odeint(dcdt,initial_conditions,t)
plt.plot(t,C)

1 个答案:

答案 0 :(得分:0)

采用变量名称和方程式结构的提示,您正在考虑化学反应

A + B -> C + D

反应物a,b,c,d的浓度A,B,C,D有两个变化来源,

  • 反应本身具有反应速度k*a*b
  • 反应物B在浓度b0_in和体积率V_in的溶液中的流入,导致所有组分中V_in/V的相对浓度变化和添加V_in*b0_in/V中的B

这一点很好地反映在系统的前4个方程中。在音量的处理中,您以不一致的方式混合两种方法。 Vt的已知函数,因此不是状态向量的组成部分,那么

V = V_reactor_initial + V_flow_inlet * t

或者您将其视为州的一个组成部分,那么当前的卷是

V = C[4]

和音量变化率

dVdt = V_flow_inlet.

修改第二种方法的代码如

import numpy as np
import scipy.integrate as integrate
import matplotlib.pyplot as plt

#defining all constants and initial conditions
k=2.2
CB0_inlet=.025
V_flow_inlet=.05
V_reactor_initial=5
CA0_reactor=.05
FB0=CB0_inlet*V_flow_inlet

def dcdt(C,t):
    #expression of how volume in reactor varies with time
    a,b,c,d,V = C

    #calculating right hand side of the four differential equations
    dadt=-k*a*b-(V_flow_inlet/V)*a
    dbdt=-k*a*b+(V_flow_inlet/V)*(CB0_inlet-b)
    dcdt= k*a*b-(V_flow_inlet/V)*c
    dddt= k*a*b-(V_flow_inlet/V)*d

    return [dadt,dbdt,dcdt,dddt,V_flow_inlet]  

#creating time array, initial conditions array, and calling odeint
t=np.linspace(0,500,100)
initial_conditions=[.05,0,0,0,V_reactor_initial]  # [CA0 CB0 CC0 CD0 
#V0_reactor]
C=integrate.odeint(dcdt,initial_conditions,t)
plt.plot(t,C[:,0:4])

结果

enter image description here