[英]Solving non-linear coupled differential equations in python
我正在研究包含耦合微分方程的系统。 我的主要目的是解决稳态下的质量平衡并将稳态解作为动态模拟的初始猜测提供。 基本上有三个状态变量Ss,Xs和Xbh。 速率方程如下所示:
r1 = µH(Ss /(Ks + Ss))(So /(Koh + So))Xbh + Kh((Xs⁄Xbh)/(Xs⁄Xbh + Kx))(So /(Koh + So))Xbh
r2 =(1-fp)bH * Xbh-Kh((Xs⁄Xbh)/(Xs⁄Xbh + Kx))(So /(Koh + So))Xbh
r3 = µH(Ss /(Ks + Ss))(So /(Koh + So))Xbh-bH * Xbh
由CSTR的摩尔平衡得出的主要微分方程为:
dSs / dt = Q(Ss_in-Ss)+ r1 * V
dXs / dt = Q(Xs_in-Xs)+ r2 * V
dXbh / dt = Q(Xbh_in-Xbh)+ r2 * V
到目前为止,这是我的代码:
import numpy as np
from scipy.optimize import fsolve
parameter=dict()
parameter['u_h']=6.0
parameter['k_oh']=0.20
parameter['k_s']=20.0
parameter['k_h']=3.0
parameter['k_x']=0.03
parameter['Y_h']=0.67
parameter['f_p']=0.08
parameter['b_h']=0.62
Bulk_DO=2.0 #mg/L
#influent components:
infcomp=[56.53,182.9,16.625] #mgCOD/l
Q=684000 #L/hr
V=1040000 #l
def steady(z,*args):
Ss=z[0]
Xs=z[1]
Xbh=z[2]
def monod(My_S,My_K):
return My_S/(My_S+My_K)
#Conversion rates
#Conversion of Ss
r1=((-1/parameter['Y_h'])*parameter['u_h']*monod(Ss,parameter['k_s'])\
+parameter['k_h']*monod(Xs/Xbh,parameter['k_x'])*monod(Bulk_DO,parameter['k_oh']))\
*Xbh*monod(Bulk_DO,parameter['k_oh'])
#Conversion of Xs
r2=((1-parameter['f_p'])*parameter['b_h']-parameter['k_h']*monod(Xs/Xbh,parameter['k_x']))*Xbh
#Conversion of Xbh
r3=(parameter['u_h']*monod(Ss,parameter['k_s'])*monod(Bulk_DO,parameter['k_oh'])-parameter['b_h'])*Xbh
f=np.zeros(3)
f[0]=Q*(infcomp[0]-Ss)+r1*V
f[1]=Q*(infcomp[1]-Xs)+r2*V
f[2]=Q*(infcomp[2]-Xbh)+r3*V
return f
initial_guess=(0.1,0.1,0.1)
soln=fsolve(steady,initial_guess,args=parameter)
print (soln)
我如何绘制这样的稳定状态? 稳态图该解决方案也不是我想要的,因为这些方程式暗示了Ss和Xs的减少以及Xbh值随时间的增加。 还有一种解决方案具有负值,这实际上是不可能的。 任何建议将不胜感激。 提前致谢 !!
这是为您的解决方案获取负值的一种解决方案:代替使用fsolve,而使用minimum_squares,它可以将边界设置为可能的值。
在顶部,导入:
from scipy.optimize import least_squares
并将fsolve语句替换为:
soln = least_squares(steady, initial_guess, bounds=[(0,0,0),(np.inf,np.inf,np.inf)], args=parameter)
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.