如何解决GEKKO实现24小时多变量乘积和优化的方程定义错误?
GEKKO优化模型方程定义错误问题分析与修正
错误原因
- 数组变量未按时刻索引:循环中直接使用数组(如
pwr_grid、pwr_dr_forecast)而非对应时刻t的元素,导致GEKKO将整个数组代入运算,生成了无等式/不等式的非法表达式(如报错中的(185-v80)(185-v81)...)。 - 变量命名冲突:优化变量
p_dg覆盖了输入数据数组p_dg,引发逻辑混乱。 - 功率平衡约束逻辑错误:原约束对所有时刻的功率变量求和,不符合单时刻功率平衡的物理意义,应为每个时刻单独的功率平衡等式。
修正后的代码
from gekko import GEKKO import numpy as np # data for 10th of January pwr_cl = np.ones(24) * 584 # base load pwr_fl = [185, 188, 167, 155, 168, 169, 168, 187, 190, 181, 211, 227, 233, 230, 222, 216, 234, 237, 248, 250, 255, 247, 248, 206] # variable loads in kW # 重命名输入数据数组,避免与优化变量冲突 pwr_dg_gen = [1479.652, 586.589, 1452.378, 1452.822, 1249.333, 1112.853, 1319.44, 1568.773, 1778.94, 1832.277, 1917.526, 1995.028, 1955.759, 1900.253, 1781.595, 1548.431, 1495.562, 1496.265, 1497.333, 1497.333, 1495.562, 1495.041, 1496.586, 1481.391] # renewables production in kW c_sub = 10 # €/KW p_grid = [0.1039, 0.09324, 0.08758, 0.07987, 0.09473, 0.1086, 0.17634, 0.1849, 0.22304, 0.21307, 0.17866, 0.17144, 0.16287, 0.16202, 0.16835, 0.18127, 0.19067, 0.20084, 0.19173, 0.18842, 0.1822, 0.17953, 0.17208, 0.143] # electricity cost from the grid €/kW m = GEKKO() # variables I want to optimise p_sell = m.Array(m.Var, 24, lb=0.2, ub=0.3) # electricity sale price # 重命名优化变量,避免与输入数据冲突 p_dg_buy = m.Array(m.Var, 24, lb=0.15, ub=0.25) # electricity purchase price from renewable sources pwr_grid = m.Array(m.Var, 24, lb=0, ub=5000) # power from the grid pwr_dr_forecast = m.Array(m.Var, 24, lb=-750, ub=750) # power that can be regulated by batteries for t in range(24): # 计算当前时刻的功率需求缺口 pwr_balance = pwr_cl[t] + pwr_fl[t] - pwr_dg_gen[t] # 单时刻功率平衡约束:电网购电+储能调节=需求缺口 m.Equation(pwr_grid[t] + pwr_dr_forecast[t] == pwr_balance) # 目标函数:最小化总成本,每项均为当前时刻的标量运算 cost = p_grid[t] * pwr_grid[t] \ + pwr_dg_gen[t] * p_dg_buy[t] \ + c_sub * m.abs(pwr_dr_forecast[t]) \ - m.max2(pwr_fl[t] - pwr_dr_forecast[t], 0) * p_sell[t] \ - m.min2(pwr_fl[t] - pwr_dr_forecast[t], 0) * p_dg_buy[t] m.Minimize(cost) m.options.IMODE = 3 m.options.SOLVER = 1 m.solve() # 输出结果示例 print("优化结果:") for t in range(24): print(f"时刻{t}: p_sell={p_sell[t].value[0]:.4f}, p_dg_buy={p_dg_buy[t].value[0]:.4f}, pwr_grid={pwr_grid[t].value[0]:.2f}, pwr_dr={pwr_dr_forecast[t].value[0]:.2f}")
关键修正说明
- 变量命名隔离:将输入数据的可再生发电数组重命名为
pwr_dg_gen,优化变量购电价格命名为p_dg_buy,避免命名冲突。 - 单时刻约束:功率平衡约束改为针对每个时刻
t的变量等式,符合时间序列优化的物理逻辑。 - 标量运算修正:目标函数中所有变量均取
t时刻的元素,确保运算为标量操作,避免GEKKO生成非法的数组乘积表达式。 - 目标函数逻辑:确认
m.min2项的经济意义(原逻辑为负偏差时用购电价格计算收益/成本,需根据实际业务场景验证)。
内容的提问来源于stack exchange,提问作者matteof12
相关产品推荐
相关产品推荐

