基于Gekko的生物反应器最优控制长时间仿真收敛问题求助
生物反应器Gekko优化收敛问题
仿真时间较短(t≈20)时,模型可收敛(需精细时间步长dt<0.1),但延长至t=30时,持续出现以下错误:
EXIT: Converged to a point of local infeasibility. Problem may be infeasible
已尝试以下解决方法:
- 切换不同求解器,设置
m.options.SOLVER = 1、2、3 - 将
m.options.MAX_ITER增大至10000 - 降低
m.options.NODES至1(低阶离散化似乎有助于收敛) - 为操纵变量(MV)指定合理初始值,例如声明时设置:
D = m.MV(value=0.1,lb=0.0,ub=0.1)
简化模型(3个状态变量、5个参数、2个MV)的优化效果较好,但延长时间后同样会失败。完整代码如下:
from gekko import GEKKO import numpy as np import matplotlib.pyplot as plt #Parameters and IC full_params = [0.027,2.12e-9,7.13e-3,168,168,0.035,1e-3] full_x0 = [5e6,0.0,0.0,0.0,1.25e5,0.0] mu,k1,k2,k3,k33,k4, f= full_params #Initialize model m = GEKKO() #Time discretization n_steps = 201 m.time = np.linspace(0,20,n_steps) #Define MVs D = m.MV(value=0.1,lb=0.0,ub=0.1) D.STATUS = 1 D.DCOST = 0.0 Tin = m.MV(value=1e7,lb=0.0,ub=1e7) Tin.STATUS = 1 Tin.DCOST = 0.0 #Define States T = m.Var(value=full_x0[0]) Id = m.Var(value=full_x0[1]) Is = m.Var(value=full_x0[2]) Ic = m.Var(value=full_x0[3]) Vs = m.Var(value=full_x0[4]) Vd = m.Var(value=full_x0[5]) #Define equations m.Equation(T.dt() == mu*T -k1*(Vs+Vd)*T + D*(Tin-T)) m.Equation(Id.dt() == k1*Vd*T -(k1*Vs -mu)*Id -D*Id) m.Equation(Is.dt() == k1*Vs*T -(k1*Vd + k2)*Is -D*Is) m.Equation(Ic.dt() == k1*(Vs*Id + Vd*Is) -k2*Ic -D*Ic) m.Equation(Vs.dt() == k3*Is - (k1*(T+Id+Is+Ic) + k4 + D)*Vs) m.Equation(Vd.dt() == k33*Ic + f*k3*Is - (k1*(T+Id+Is+Ic) + k4 + D)*Vd) #Define objective function J = m.Var(value=0) # objective (profit) Jf = m.FV() # final objective Jf.STATUS = 1 m.Connection(Jf,J,pos2="end") m.Equation(J.dt() == D*(Vs + Vd)) m.Obj(-Jf) m.options.IMODE = 6 # optimal control m.options.NODES = 1 # collocation nodes m.options.SOLVER = 3 m.options.MAX_ITER = 10000 #Solve m.solve()
模型方程详情:
恳请提供解决建议,例如如何实现参数缩放。
内容的提问来源于stack exchange,提问作者Pavan Inguva
相关产品推荐
相关产品推荐

