亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

使用 GEKKO 的 MPC 中的可變邊界

使用 GEKKO 的 MPC 中的可變邊界

一只名叫tom的貓 2022-09-06 19:45:55
我正在嘗試使用MPC和GEKKO實現恒溫器控制。狀態變量(溫度)應該在預先指定的溫度值的上限和上限內,并在下面的代碼中。temp_lowtemp_upper兩者綁定在一天中都有所不同:每小時一個值。目標函數是使用加熱的成本。價格也隨天變化,如下所示。 是房間的外部溫度,在微分方程中起作用。TOUT_external如何實現這一點以進行優化?這是我的嘗試:from gekko import GEKKOimport numpy as npm = GEKKO(remote=False)m.time = np.linspace(0,23,24)#initialize variablesT_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 VariableT = 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 = 6m.solve(debug=True)當我運行這個時,我得到:@error: Model Expression *** Error in syntax of function string: Missing operatorPosition: 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    ?
查看完整描述

1 回答

?
www說

TA貢獻1775條經驗 獲得超8個贊

Gekko 需要將 constaint 作為不等式表達式,其中變量與上限或下限值進行比較。如果你有,它會導致一個不可行的解決方案,因為加熱器的功率不足以將溫度保持在上限和下限。我將值更改為 以獲得可行的解決方案。TTHTLb=1.b=10


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_v = [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=10.)

k = m.Param(value=0.05)

T_e = m.Param(value=T_external)

TL = m.Param(value=temp_low)

TH = m.Param(value=temp_upper)

TOU = m.Param(value=TOU_v)


u = m.MV(lb=0, ub=1)

u.STATUS = 1  # allow optimizer to change


# Controlled Variable

T = m.SV(value=60)


m.Equations([T>=TL,T<=TH])

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


m.Minimize(TOU*u)


m.options.IMODE = 6

m.solve(disp=True,debug=True)

一個可能更好的解決方案是通過將限制重新定義為錯誤來設置軟約束。您可以將誤差降至最低以保持在限制范圍內。即使它不能保持在限制范圍內,優化程序也會盡最大努力將不可行性降至最低。這還允許您同時權衡多個目標,例如在舒適度和成本之間

http://img1.sycdn.imooc.com//6317331700015ec308500369.jpg

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_v = [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=10.)

k = m.Param(value=0.05)

T_e = m.Param(value=T_external)

TL = m.Param(value=temp_low)

TH = m.Param(value=temp_upper)

TOU = m.Param(value=TOU_v)


u = m.MV(lb=0, ub=1)

u.STATUS = 1  # allow optimizer to change


# Controlled Variable

T = m.SV(value=60)


# Soft constraints

eH = m.CV(value=0)

eL = m.CV(value=0)


eH.SPHI=0; eH.WSPHI=100; eH.WSPLO=0  ; eH.STATUS = 1

eL.SPLO=0; eL.WSPHI=0  ; eL.WSPLO=100; eL.STATUS = 1


m.Equations([eH==T-TH,eL==T-TL])


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


m.Minimize(TOU*u)


m.options.IMODE = 6

m.solve(disp=True,debug=True)


import matplotlib.pyplot as plt

plt.subplot(2,1,1)

plt.plot(m.time,temp_low,'k--')

plt.plot(m.time,temp_upper,'k--')

plt.plot(m.time,T.value,'r-')

plt.ylabel('Temperature')

plt.subplot(2,1,2)

plt.step(m.time,u.value,'b:')

plt.ylabel('Heater')

plt.xlabel('Time (hr)')

plt.show()


查看完整回答
反對 回復 2022-09-06
  • 1 回答
  • 0 關注
  • 123 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號