Gekko 模拟有干扰的过程

问题描述 投票:0回答:1

我正在学习 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,我猜这是因为我将其定义为参数?

process controls simulation gekko
1个回答
0
投票

能量平衡的方程是:

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()
© www.soinside.com 2019 - 2024. All rights reserved.