基于Gekko的换热网络清洗调度中清洗触发时结垢厚度置零问题
问题解决方案
- 变量类型修正:原来将动态计算的
U/LMTD/Tco/EL/ELchc定义为固定值Param是错误的,全部改为Intermediate即可,避免求解器报错。 - 结垢厚度重置逻辑实现:通过
if3配合约束实现清洗触发时sigm清零,把原来循环内的结垢相关方程替换为以下代码:# 结垢增长+清洗重置逻辑 kg = kglist[u] # reset=1时触发清洗,reset=0时正常结垢 reset = m.if3(x[u] - 0.5, 0, 1) # 清洗时停止结垢增长 m.Equation(sigm[u].dt() == kg * lambdag * (1 - reset)) # 清洗时强制结垢厚度为0 m.Equation(sigm[u] <= 1e-6 * reset + 1e6 * (1 - reset)) m.Equation(sigm[u] >= 0) # 原结垢热阻关联逻辑保留 m.Equation(sigm[u] == Rf[u] * lambdag) - 换热网络逻辑修正:如果你的换热器是串联结构,需要把前一个换热器的出口
Tco[u]赋值给下一个的入口Tci[u+1],删掉循环内的Tci = Thi-8这行错误赋值,避免热力计算不符合实际流程。 - MV参数优化:给每个x变量增加允许跳变的配置,放在x初始化之后:
for i in range(N): x[i].STATUS=1 x[i].MV_STEP_HOR = 1 # 允许每个时间步调整清洗信号 - 冗余代码清理:删掉for循环末尾无用的
u +=1,for循环会自动迭代计数变量。
修改后运行代码,即可在x[u]取1的时间点将对应换热器的结垢厚度sigm[u]重置为0,求解结束后绘图可验证重置逻辑是否生效。
内容的提问来源于stack exchange,提问作者MikkelB
相关产品推荐
相关产品推荐

