Python Gekko优化求解报错:等式定义问题求助
解决Gekko优化求解中的方程定义错误
错误根源分析
- 变量赋值方式错误:直接对Gekko变量(如
p_i[0,0] = 30)赋值会破坏变量对象,需通过约束或初始值设置实现。 - SOC更新逻辑与索引问题:循环中
tt=0时tt-1=-1导致索引越界,且原方程逻辑不符合“当前SOC=前一时段SOC+时段充电量”的需求。 - 无效方程定义:部分约束为恒等式(如
p_j[tt,0] >= p_j[tt,0]),无实际约束作用,且未正确传递有效方程给Gekko。 - 目标函数偏离需求:原代码用SOC与充电功率的乘积求和,实际需求是最小化分时电价(TOU)与充电速率的乘积之和。
修正后的代码
from gekko import GEKKO import numpy as np m = GEKKO(remote=False) m.options.SOLVER = 1 hour = 24 Num_EV = 1 # 定义EV SOC变量,范围30-70 p_i = m.Array(m.Var, (hour, Num_EV), lb=30, ub=70) # 初始SOC约束 m.Equation(p_i[0,0] == 30) # 定义充电功率变量,范围0-7 Num_EV_C = 1 p_j = m.Array(m.Var, (hour, Num_EV_C), lb=0, ub=7) # 初始充电功率约束 m.Equation(p_j[0,0] == 0) # 分时电价数据 TOU = [64.9,64.9,64.9,64.9,64.9,64.9,64.9,64.9,152.6,239.8, 239.8,152.6,239.8,239.8,239.8,239.8,152.6,152.6, 152.6,152.6,152.6,152.6,152.6,64.9] # SOC更新约束:当前SOC = 前一时段SOC + 本时段充电功率 for tt in range(1, hour): m.Equation(p_i[tt,0] == p_i[tt-1,0] + p_j[tt,0]) # 目标函数:最小化TOU与充电速率的乘积之和 F_Obj = m.sum([TOU[tt] * p_j[tt,0] for tt in range(hour)]) m.Minimize(F_Obj) # 求解 m.solve(disp=True) # 输出结果 print("充电功率结果:") for tt in range(hour): print(f"时段 {tt}: {p_j[tt,0].value[0]:.2f}") print("\nSOC结果:") for tt in range(hour): print(f"时段 {tt}: {p_i[tt,0].value[0]:.2f}")
修正关键点说明
- 变量边界与初始值:直接在变量初始化时设置
lb/ub,通过m.Equation定义初始SOC和初始充电功率,避免直接赋值破坏变量。 - SOC更新约束:从
tt=1开始构建方程,避免索引越界,准确实现“初始SOC+时段内SOC变化”的规则(假设充电功率直接对应SOC增量,若有转换系数可自行调整)。 - 有效约束:移除无意义的恒等式约束,确保所有约束服务于需求。
- 目标函数对齐:替换为TOU与充电功率的乘积求和,完全匹配“最小化分时电价成本”的需求。
内容的提问来源于stack exchange,提问作者Chris
相关产品推荐
相关产品推荐

