Python 带GEKKO的MPC中的变量界

Python 带GEKKO的MPC中的变量界,python,gekko,Python,Gekko,我正在尝试使用MPC和GEKKO实现恒温器控制 状态变量(温度)应在以下代码中预先规定的较低和较高温度值、temp\u low和temp\u upper范围内 这两个界限在一天中都不同:每小时一个值 目标函数是使用供暖的成本。价格也会随着一天的变化而变化,TOU如下T_external是在微分方程中起作用的房间外部温度 如何实现这一点以使其优化? 这是我的尝试: from gekko import GEKKO import numpy as np m = GEKKO(remote=False)

我正在尝试使用MPC和GEKKO实现恒温器控制

状态变量(温度)应在以下代码中预先规定的较低和较高温度值、
temp\u low
temp\u upper
范围内

这两个界限在一天中都不同:每小时一个值

目标函数是使用供暖的成本。价格也会随着一天的变化而变化,
TOU
如下
T_external
是在微分方程中起作用的房间外部温度

如何实现这一点以使其优化?

这是我的尝试:

from gekko import GEKKO
import numpy as np

m = GEKKO(remote=False)
m.time = np.linspace(0,23,24)

#initialize variables
T_external = [50.,50.,50.,50.,45.,45.,45.,60.,60.,63.,64.,45.,45.,50.,52.,53.,53.,54.,54.,53.,52.,51.,50.,45.]
temp_low = [55.,55.,55.,55.,55.,55.,55.,68.,68.,68.,68.,55.,55.,68.,68.,68.,68.,55.,55.,55.,55.,55.,55.,55.]
temp_upper = [75.,75.,75.,75.,75.,75.,75.,70.,70.,70.,70.,75.,75.,70.,70.,70.,70.,75.,75.,75.,75.,75.,75.,75.]
TOU = [0.05,0.05,0.05,0.05,0.05,0.05,0.05,200.,200.,200.,200.,200.,200.,200.,200.,200.,200.,200.,200.,200.,200.,0.05,0.05,0.05]

b = m.Param(value=1.)
k = m.Param(value=0.05)
T_e = m.Param(value=T_external)

u = m.MV(value=[0]*24, lb=[0.0]*24, ub=[1.]*24)
u.STATUS = 1  # allow optimizer to change

# Controlled Variable
T = m.SV(value=[60]*24, lb=temp_low, ub=temp_upper)

m.Equation(T.dt() == k*(T_e-T) + b*u)

m.Obj(np.dot(TOU,u))

m.options.IMODE = 6
m.solve(debug=True)
当我运行此命令时,我得到:

@error: Model Expression
 *** Error in syntax of function string: Missing operator

Position: 4                   
 0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0
    ?

Gekko需要常量作为不等式表达式,其中变量
T
与上
TH
或下
TL
值进行比较。如果您有
b=1。
,则会导致不可行的解决方案,因为加热器功率不足,无法将温度维持在上限和下限范围内。我将值更改为
b=10
,以获得可行的解决方案

从gekko导入gekko
将numpy作为np导入
m=GEKKO(远程=False)
m、 时间=np.linspace(0,23,24)
#初始化变量
T_external=[50,50,50,50,45,45,60,60,63,\
64.,45.,45.,50.,52.,53.,53.,54.,54.,\
53.,52.,51.,50.,45.]
温度低=[55,55,55,55,55,55,55,55,55,68,68,68,68,\
55.,55.,68.,68.,68.,68.,55.,55.,55.,55.,55.,55.,55.]
温度上限=[75,75,75,75,75,75,75,75,70,70,70,70,75,\
75.,70.,70.,70.,70.,75.,75.,75.,75.,75.,75.,75.]
TOU_v=[0.05,0.05,0.05,0.05,0.05,0.05,0.05200,200,200,200,200,\
200.,200.,200.,200.,200.,200.,200.,200.,200.,200.,0.05,\
0.05,0.05]
b=m.Param(值=10.)
k=m.Param(值=0.05)
T_e=m.Param(值=T_外部)
TL=m.Param(值=温度低)
TH=m.Param(值=温度上限)
TOU=m.Param(值=TOU_v)
u=m.MV(磅=0,磅=1)
u、 状态=1#允许优化器更改
#受控变量
T=m.SV(值=60)

m、 方程式([T>=TL,T非常感谢您的帮助,这真是令人印象深刻。有一件事让我很感兴趣。昨天我一直试图让它工作,最后我用
IMODE=3
b=1.0
完成了。有什么不同,在一种模式下它工作,而在另一种模式下它导致不可行的解决方案。我在这里发布了一个问题:.Kind regards.我很乐意为这篇文章添加一个更详细的回复。
IMODE=3
将所有导数值设置为零,但您在另一种模式下的解决方案也允许初始条件更改为更高的值,这样加热器就不需要强大才能保持可行性。我如何在目标函数中编写这样的软约束n我想记录我的算法。?我是否只需在目标函数中添加e_{H}*权重和e_{L}*权重?@John Hedengren。以下是关于具有l1范数目标的CV目标函数的更多信息: