我试图解决四种不同的微分方程。在谷歌搜索和研究之后,我终于能够理解求解器的工作原理,但我无法专门正确地运行这个问题。代码编译但图表不正确。
我认为问题在于函数内部的卷表达式,它将根据已经过了多长时间而改变。然后将使用特定时间的体积来求解微分方程的右侧。
时间向量的间隔,起点和终点是正确的。常数也是正确的。
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)
答案 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个方程中。在音量的处理中,您以不一致的方式混合两种方法。 V
是t
的已知函数,因此不是状态向量的组成部分,那么
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])
结果