在python中求解非线性耦合微分方程

时间:2018-07-12 19:25:48

标签: python numpy scipy simulation

我正在研究包含耦合微分方程的系统。我的主要目的是解决稳态下的质量平衡并将稳态解作为动态模拟的初始猜测提供。 基本上有三个状态变量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)

如何绘制这样的稳定​​状态? steady state plot 解决方案也不是我想要的,因为等式意味着Ss和Xs的减少以及Xbh值随时间的增加。还有一种解决方案具有负值,这实际上是不可能的。 任何建议将不胜感激。在此先感谢!!

1 个答案:

答案 0 :(得分:0)

这是为您的解决方案获取负值的一种解决方案:代替使用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)