You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何解决GEKKO实现24小时多变量乘积和优化的方程定义错误?

GEKKO优化模型方程定义错误问题分析与修正

错误原因

  1. 数组变量未按时刻索引:循环中直接使用数组(如pwr_grid、pwr_dr_forecast)而非对应时刻t的元素,导致GEKKO将整个数组代入运算,生成了无等式/不等式的非法表达式(如报错中的(185-v80)(185-v81)...)。
  2. 变量命名冲突:优化变量p_dg覆盖了输入数据数组p_dg,引发逻辑混乱。
  3. 功率平衡约束逻辑错误:原约束对所有时刻的功率变量求和,不符合单时刻功率平衡的物理意义,应为每个时刻单独的功率平衡等式。

修正后的代码

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.26 11:14:59