我正在学习 GEKKO,我想知道如何模拟一个过程,然后控制涉及的一些干扰变量。
让我们选择一个简单的热交换器,例如,我尝试使用来自 6.5 bar 蒸汽的热源将水流从 100°C 加热到 110°C。
假设唯一的热源来自蒸汽冷凝,因此我们的质量平衡为:
Q = m_s *羔羊_s = m_w * Cp * d(T_out - T-in)dt
哪里 m_s:蒸汽质量流量 Ram_s:蒸汽潜热 m_w:水质量流量 Cp:水的比热容 T_out:水温输出 T_in: 水温在
现在,我想用 m_s 控制 T_out,并将 T_out 的恒定设定点设为 110°C。但我希望能够迈出 m_w 和 T_in。我知道步进 m_w 很容易,因为它与时间无关,但是如果在方程中它是相对时间 (dT_in/dt) ,我该如何步进 T_in ?如果我迈入 T_in,我就无法将其从等式中删除,对吗?
这就是我尝试过的,我认为当我步进时 dT_in/dt 不会为 0。:
蒂亚[300] = -10 +273.15 Ti_in = m.Param(value=Tia) # K
m.Equation(T_out.dt() == (1.0/(m_wCp))(m_s *lambda_s)) + Ti_in)
但是响应是 T_out 中的一步。
我也尝试将方程 Ti_in 写为 T_in.dt(),但我得到了 AttributeError: dt,我猜这是因为我将其定义为参数?
能量平衡的方程是:
m.Equation(mass*Cp*T_out.dt() == m_s*lambda_s
+ mdot*Cp*(T_in - T_out))
其中
mass
是控制体积中的流体质量,T_in
、m_s
是模型的独立输入。 T_in
可以定义为输入干扰,m_s
可以定义为操纵变量。下面是一个示例脚本,它在模型预测控制应用程序中演示了这一点,其中包含 T_in
扰动中的一个步骤。
这是完整的脚本:
from gekko import GEKKO
import numpy as np
# Initialize Model
m = GEKKO(remote=False)
# Time points
n = 101
m.time = np.linspace(0, 10, n)
# Parameters
lambda_s = m.Param(value=2257) # Steam latent heat (kJ/kg)
Cp = m.Param(value=4.18) # Water specific heat (kJ/kg.K)
mdot = m.Param(value=1) # Water mass flow (kg/s)
mass = m.Param(value=0.5) # Mass of vessel fluid (kg)
# Disturbance
d = np.ones(n)*(100+273.15); d[50:]=(95+273.15)
T_in = m.Param(d) # Water temperature in (K)
# Controlled Variable
# Water temperature out (K)
T_out = m.CV(value=100+273.15,name='tout')
T_out.SPHI = 110 + 273.15 + 0.5 # Setpoint High
T_out.SPLO = 110 + 273.15 - 0.5 # Setpoint Low
T_out.TAU = 1
T_out.TR_INIT = 1
T_out.STATUS = 1 # Enable control
# Manipulated Variable
m_s = m.MV(value=0, lb=0, ub=5) # Steam mass flow (kg/s)
m_s.DCOST = 1e-3
m_s.STATUS = 1 # Allow optimizer to change m_s
m_s.FSTATUS = 0 # No MV measurement feedback
# Equation
m.Equation(mass*Cp*T_out.dt() == m_s*lambda_s
+ mdot*Cp*(T_in - T_out))
# Solve MPC
m.options.IMODE = 6 # Control mode
m.options.CV_TYPE = 1 # l1-norm objective
m.options.SOLVER = 3 # Solver
m.solve(disp=True)
# Plot results
# get additional solution information
import json
with open(m.path+'//results.json') as f:
results = json.load(f)
import matplotlib.pyplot as plt
plt.figure()
plt.subplot(3,1,1)
plt.plot(m.time,T_in.value,color='orange',
linestyle='-',label='DV Step')
plt.ylabel(r'$T_{in}$'); plt.legend(); plt.grid()
plt.subplot(3,1,2)
plt.plot(m.time,m_s.value,'b-',label='MV Optimized')
plt.ylabel(r'$m_s$'); plt.legend(); plt.grid()
plt.subplot(3,1,3)
plt.plot(m.time,results['tout.tr_hi'],'k-.',label='SPHI Traj')
plt.plot(m.time,T_out.value,'r--',label='CV Response')
plt.plot(m.time,results['tout.tr_lo'],'k:',label='SPLO Traj')
plt.ylabel(r'$T_{out}$'); plt.xlabel('Time'); plt.grid()
plt.legend(loc='best'); plt.tight_layout()
plt.savefig('mpc.png',dpi=300); plt.show()