我正在学习使用GEKKO MPC求解器,并将上面的代码作为测试编写。经过多次尝试,我仍然无法使其运行,并不断出现以下异常。
APMonitor, Version 1.0.1
APMonitor Optimization Suite
----------------------------------------------------------------
@error: Inequality Definition
invalid inequalities: z > x < y
minimize<generatorobject<genexpr>at0x7f8cb1a1c950>
STOPPING . . .
---------------------------------------------------------------------------
Exception Traceback (most recent call last)
<ipython-input-11-e92d32444662> in <module>
122 # Solver
123 m.options.IMODE = 6 # control
--> 124 m.solve(disp=True, debug=True)
125
126 # Plot the results
/usr/local/lib/python3.7/dist-packages/gekko/gekko.py in solve(self, disp, debug, GUI, **kwargs)
2183 #print APM error message and die
2184 if (debug >= 1) and ('@error' in response):
-> 2185 raise Exception(response)
2186
2187 #load results
Exception: @error: Inequality Definition
invalid inequalities: z > x < y
minimize<generatorobject<genexpr>at0x7f8cb1a1c950>
STOPPING . . .
任何帮助都将不胜感激。这是我写的代码:
import numpy as np
import pandas as pd
m = GEKKO()
ALPHA = 0.5
NUM_FANS = 8 # MAX Number of fans
NUM_PUMPS = 1 # MAX number of pumps
n_steps = 25
m.time = np.linspace(0, n_steps - 1, n_steps)
DELTA_TOP = 5 # 5 degC
DELTA_HOT = 5 # 5 degC
DELTA_PU = 0.05 # 0.05 p.u
fan_powers = np.array([145, 130, 120, 100, 500, 460, 430, 370, 860, 800, 720, 610, 1500, 1350, 1230, 1030]) # kW
pump_powers = np.array([0.43, 1.07, 2.95, 6.92, 8.83]) # kW
C_base = NUM_FANS * np.max(fan_powers) + NUM_PUMPS * np.max(pump_powers) # kW
x_state = np.array([61.29027692, 70.15582365, 0.86972331])
u_state = np.array([5, 1.00, 1500.00, 0.43]) # np.array(pd.DataFrame([[5, 1.00, 1500.00, 0.43]], columns=['nfans', 'npumps', 'fpower', 'ppower'] )) #np.array([1.00, 1500.00, 0.43])
ref_state = pd.DataFrame([
[0, '2022-08-30T19:33:07.637217', 50.949829, 56.055570, 0.70],
[1, '2022-08-30T19:33:07.719390', 46.113708, 48.741882, 0.60],
[2, '2022-08-30T19:33:07.754899', 43.921465, 49.425708, 0.60],
[3, '2022-08-30T19:33:07.782037', 44.792515, 49.895490, 0.60],
[4, '2022-08-30T19:33:07.831646', 45.814439, 51.055404, 0.60],
[5, '2022-08-30T19:33:07.910940', 46.677830, 51.900248, 0.60],
[6, '2022-08-30T19:33:07.951684', 47.500278, 52.609172, 0.60],
[7, '2022-08-30T19:33:08.050460', 48.187270, 53.240813, 0.60],
[8, '2022-08-30T19:33:08.126050', 48.866124, 53.806335, 0.60],
[9, '2022-08-30T19:33:08.205533', 49.395292, 54.303250, 0.60],
[10, '2022-08-30T19:33:08.237825', 49.908234, 54.732465, 0.60],
[11, '2022-08-30T19:33:08.261200', 50.315668, 55.112417, 0.60],
[12, '2022-08-30T19:33:08.303079', 50.750658, 55.793464, 0.70],
[13, '2022-08-30T19:33:08.370096', 51.341523, 57.619243, 0.70],
[14, '2022-08-30T19:33:08.463300', 51.666736, 58.602764, 0.80],
[15, '2022-08-30T19:33:08.524749', 52.738678, 60.785766, 0.80],
[16, '2022-08-30T19:33:08.552913', 53.460458, 62.226178, 0.90],
[17, '2022-08-30T19:33:08.589561', 55.055422, 64.867184, 0.90],
[18, '2022-08-30T19:33:08.633709', 56.231096, 66.286857, 0.90],
[19, '2022-08-30T19:33:08.671211', 57.876352, 67.644409, 0.90],
[20, '2022-08-30T19:33:08.708004', 59.015503, 68.931404, 0.90],
[21, '2022-08-30T19:33:08.729763', 60.586943, 70.227752, 0.90],
[22, '2022-08-30T19:33:08.753146', 61.809524, 71.492779, 0.90],
[23, '2022-08-30T19:33:08.779459', 63.232974, 72.710304, 0.90],
[24, '2022-08-30T19:33:08.808419', 64.324357, 74.556550, 1.05]], columns=['id', 'sampdate', 'optopoil', 'ophotspot', 'opload'])
# Initial State at i = 0
puload_0 = x_state[2]
hotspot_0 = x_state[1]
topoil_0 = x_state[0]
# Initial Controls at i =0
n_fans_0 = u_state[0]
n_pumps_0 = u_state[1]
Cw_0 = u_state[0] * u_state[2]
Cp_0 = u_state[1] * u_state[3]
# References
ref_puload = np.array(ref_state['opload'])
ref_hotspot = np.array(ref_state['ophotspot'])
ref_topoil = np.array(ref_state['optopoil'])
# Controlled variables
tophigh = m.Param(value = ref_topoil)
toplow = m.Param(value = ref_topoil - DELTA_TOP)
hothigh = m.Param(value=ref_hotspot)
hotlow = m.Param(value=ref_topoil - DELTA_TOP)
pulow = m.Param(value=ref_puload)
puhigh= m.Param(value=ref_puload - DELTA_PU)
puload = m.CV (value = np.array([puload_0]*n_steps), lb = ref_puload - DELTA_PU, ub = ref_puload)
hotspot = m.CV (value = np.array([hotspot_0]*n_steps), lb = ref_hotspot - DELTA_HOT, ub = ref_hotspot)
topoil = m.CV (value = np.array([topoil_0]*n_steps), lb = ref_topoil - DELTA_TOP, ub = ref_topoil)
m.Equations([topoil >= toplow, topoil <= tophigh])
m.Equations([hotspot >= hotlow, hotspot <= hothigh])
m.Equations([puload >= pulow, puload <= puhigh])
puload.STATUS = 1
hotspot.STATUS = 1
topoil.STATUS = 1
# Manipulated variables
fan_low = m.Param(value = np.zeros(n_steps))
fan_high = m.Param(value = np.array([NUM_FANS]*n_steps))
pump_low = m.Param(value = np.ones(n_steps))
pump_high = m.Param(value = np.array([NUM_PUMPS]*n_steps))
Cw_low = m.Param(value = np.zeros(n_steps))
Cw_high = m.Param(value= np.array([NUM_FANS * np.max(fan_powers)]*n_steps))
Cp_low = m.Param(value = np.ones(n_steps))
Cp_high = m.Param(value = np.array([NUM_PUMPS * np.max(pump_powers)]*n_steps))
n_fans = m.MV (value = np.array([n_fans_0]*n_steps), lb = np.zeros(n_steps), ub = np.array([NUM_FANS]*n_steps))
n_pumps = m.MV (value = np.array([n_pumps_0]*n_steps), lb = np.ones(n_steps), ub = np.array([NUM_PUMPS]*n_steps))
Cw = m.MV (value = np.array([Cw_0]*n_steps), lb = np.zeros(n_steps), ub = np.array([NUM_FANS * np.max(fan_powers)]*n_steps))
Cp = m.MV (value = np.array([Cp_0]*n_steps), lb = np.ones(n_steps), ub = np.array([NUM_PUMPS * np.max(pump_powers)]*n_steps))
m.Equation([n_fans >= fan_low, n_fans <= fan_high])
m.Equation([n_pumps >= pump_low, n_pumps <= pump_high])
m.Equation([Cw >= Cw_low, Cw <= Cw_high])
m.Equation([Cp>= Cp_low, Cp <= Cp_high])
n_fans.STATUS = 1
n_pumps.STATUS = 1
Cw.STATUS = 1
Cp.STATUS = 1
# Objective Function
Fuv = m.Var(value=0)
m.Minimize(Fuv = sum(ALPHA * (Cw[i] + Cp[i]) / C_base
+ (1 - ALPHA) * (
pow ((ref_puload[i] - puload[i]) / DELTA_PU, 2)
+ pow ((ref_hotspot[i]- hotspot[i]) / DELTA_HOT, 2)
+ pow ((ref_topoil[i] - topoil[i]) / DELTA_TOP, 2)
)) for i in range(n_steps))
# Solver
m.options.IMODE = 6 # control
m.solve(disp=True, debug=True)
Gekko进行时间索引。以下是成功解决问题的代码的修改版本。解决方案是通过首先求解而不存在如下不等式:
#%% Solve without inequalities
m.options.IMODE = 6 # control
m.options.SOLVER=1
m.solve(disp=True, debug=True)
----------------------------------------------
Dynamic Control with APOPT Solver
----------------------------------------------
Iter Objective Convergence
0 6.51001E+07 0.00000E+00
1 1.19052E+16 0.00000E+00
2 7.77312E+01 0.00000E+00
3 7.49548E+00 0.00000E+00
4 7.49548E+00 0.00000E+00
6 7.49548E+00 0.00000E+00
Successful solution
---------------------------------------------------
Solver : APOPT (v1.0)
Solution time : 0.043000000000000003 sec
Objective : 7.4954845726019945
Successful solution
---------------------------------------------------
然后使用该解决方案初始化具有不等式的情况:
#%% Turn on DOF and include inequalities
n_fans.STATUS = 1
n_pumps.STATUS = 1
Cw.STATUS = 1
Cp.STATUS = 1
m.Equations([topoil >= toplow, topoil <= tophigh])
m.Equations([hotspot >= hotlow, hotspot <= hothigh])
m.Equations([puload >= pulow, puload <= puhigh])
m.Equations([n_fans >= fan_low, n_fans <= fan_high])
m.Equations([n_pumps >= pump_low, n_pumps <= pump_high])
m.Equations([Cw >= Cw_low, Cw <= Cw_high])
m.Equations([Cp>= Cp_low, Cp <= Cp_high])
m.options.TIME_SHIFT=0
m.solve(disp=True, debug=True)
----------------------------------------------
Dynamic Control with APOPT Solver
----------------------------------------------
Iter Objective Convergence
0 7.91421E-02 7.49900E+03
1 7.70285E-02 1.30000E-09
2 7.70285E-02 2.00000E-10
3 7.70285E-02 2.00000E-10
Successful solution
---------------------------------------------------
Solver : APOPT (v1.0)
Solution time : 0.033999999999999996 sec
Objective : 0.07702852753968847
Successful solution
---------------------------------------------------
以下是完整的脚本:
import numpy as np
import pandas as pd
from gekko import GEKKO
m = GEKKO(remote=False)
ALPHA = 0.5
NUM_FANS = 8 # MAX Number of fans
NUM_PUMPS = 1 # MAX number of pumps
n_steps = 25
m.time = np.linspace(0, n_steps - 1, n_steps)
DELTA_TOP = 5 # 5 degC
DELTA_HOT = 5 # 5 degC
DELTA_PU = 0.05 # 0.05 p.u
fan_powers = np.array([145, 130, 120, 100, 500, 460, 430, 370, 860, 800, 720, 610, 1500, 1350, 1230, 1030]) # kW
pump_powers = np.array([0.43, 1.07, 2.95, 6.92, 8.83]) # kW
C_base = NUM_FANS * np.max(fan_powers) + NUM_PUMPS * np.max(pump_powers) # kW
x_state = np.array([61.29027692, 70.15582365, 0.86972331])
u_state = np.array([5, 1.00, 1500.00, 0.43])
ref_state = pd.DataFrame([
[0, '2022-08-30T19:33:07.637217', 50.949829, 56.055570, 0.70],
[1, '2022-08-30T19:33:07.719390', 46.113708, 48.741882, 0.60],
[2, '2022-08-30T19:33:07.754899', 43.921465, 49.425708, 0.60],
[3, '2022-08-30T19:33:07.782037', 44.792515, 49.895490, 0.60],
[4, '2022-08-30T19:33:07.831646', 45.814439, 51.055404, 0.60],
[5, '2022-08-30T19:33:07.910940', 46.677830, 51.900248, 0.60],
[6, '2022-08-30T19:33:07.951684', 47.500278, 52.609172, 0.60],
[7, '2022-08-30T19:33:08.050460', 48.187270, 53.240813, 0.60],
[8, '2022-08-30T19:33:08.126050', 48.866124, 53.806335, 0.60],
[9, '2022-08-30T19:33:08.205533', 49.395292, 54.303250, 0.60],
[10, '2022-08-30T19:33:08.237825', 49.908234, 54.732465, 0.60],
[11, '2022-08-30T19:33:08.261200', 50.315668, 55.112417, 0.60],
[12, '2022-08-30T19:33:08.303079', 50.750658, 55.793464, 0.70],
[13, '2022-08-30T19:33:08.370096', 51.341523, 57.619243, 0.70],
[14, '2022-08-30T19:33:08.463300', 51.666736, 58.602764, 0.80],
[15, '2022-08-30T19:33:08.524749', 52.738678, 60.785766, 0.80],
[16, '2022-08-30T19:33:08.552913', 53.460458, 62.226178, 0.90],
[17, '2022-08-30T19:33:08.589561', 55.055422, 64.867184, 0.90],
[18, '2022-08-30T19:33:08.633709', 56.231096, 66.286857, 0.90],
[19, '2022-08-30T19:33:08.671211', 57.876352, 67.644409, 0.90],
[20, '2022-08-30T19:33:08.708004', 59.015503, 68.931404, 0.90],
[21, '2022-08-30T19:33:08.729763', 60.586943, 70.227752, 0.90],
[22, '2022-08-30T19:33:08.753146', 61.809524, 71.492779, 0.90],
[23, '2022-08-30T19:33:08.779459', 63.232974, 72.710304, 0.90],
[24, '2022-08-30T19:33:08.808419', 64.324357, 74.556550, 1.05]],
columns=['id', 'sampdate', 'optopoil', 'ophotspot', 'opload'])
# Initial State at i = 0
puload_0 = x_state[2]
hotspot_0 = x_state[1]
topoil_0 = x_state[0]
# Initial Controls at i =0
n_fans_0 = u_state[0]
n_pumps_0 = u_state[1]
Cw_0 = u_state[0] * u_state[2]
Cp_0 = u_state[1] * u_state[3]
# References
ref_puload = m.Param(np.array(ref_state['opload']))
ref_hotspot = m.Param(np.array(ref_state['ophotspot']))
ref_topoil = m.Param(np.array(ref_state['optopoil']))
# Controlled variables
tophigh = m.Param(value = ref_topoil)
toplow = m.Param(value = ref_topoil - DELTA_TOP)
hothigh = m.Param(value=ref_hotspot)
hotlow = m.Param(value=ref_topoil - DELTA_TOP)
pulow = m.Param(value=ref_puload)
puhigh= m.Param(value=ref_puload - DELTA_PU)
puload = m.Var(value = puload_0)
hotspot = m.Var(value = hotspot_0)
topoil = m.Var(value = topoil_0)
# Manipulated variables
fan_low = m.Param(value = 0)
fan_high = m.Param(value = NUM_FANS)
pump_low = m.Param(value = 1)
pump_high = m.Param(value = NUM_PUMPS)
Cw_low = m.Param(value = 0)
Cw_high = m.Param(value= NUM_FANS * np.max(fan_powers))
Cp_low = m.Param(value = 1)
Cp_high = m.Param(value = NUM_PUMPS * np.max(pump_powers))
n_fans = m.MV(value = n_fans_0, lb = 0, ub = NUM_FANS)
n_pumps = m.MV(value = n_pumps_0, lb = 1, ub = NUM_PUMPS)
Cw = m.MV(value = Cw_0, lb = 0, ub = NUM_FANS * np.max(fan_powers))
Cp = m.MV(value = Cp_0, lb = 1, ub = NUM_PUMPS * np.max(pump_powers))
# Objective Function
Fuv = m.Intermediate(ALPHA * (Cw + Cp) / C_base
+ (1 - ALPHA) * ((ref_puload - puload) / DELTA_PU)**2
+ ((ref_hotspot- hotspot) / DELTA_HOT)**2
+ ((ref_topoil - topoil) / DELTA_TOP)**2)
m.Minimize(Fuv)
#%% Solve without inequalities
m.options.IMODE = 6 # control
m.options.SOLVER=1
m.solve(disp=True, debug=True)
#%% Turn on DOF and include inequalities
n_fans.STATUS = 1
n_pumps.STATUS = 1
Cw.STATUS = 1
Cp.STATUS = 1
m.Equations([topoil >= toplow, topoil <= tophigh])
m.Equations([hotspot >= hotlow, hotspot <= hothigh])
m.Equations([puload >= pulow, puload <= puhigh])
m.Equations([n_fans >= fan_low, n_fans <= fan_high])
m.Equations([n_pumps >= pump_low, n_pumps <= pump_high])
m.Equations([Cw >= Cw_low, Cw <= Cw_high])
m.Equations([Cp>= Cp_low, Cp <= Cp_high])
m.options.TIME_SHIFT=0
m.solve(disp=True, debug=True)