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

Python Gekko优化求解报错:等式定义问题求助

解决Gekko优化求解中的方程定义错误

错误根源分析

  1. 变量赋值方式错误:直接对Gekko变量(如p_i[0,0] = 30)赋值会破坏变量对象,需通过约束或初始值设置实现。
  2. SOC更新逻辑与索引问题:循环中tt=0时tt-1=-1导致索引越界,且原方程逻辑不符合“当前SOC=前一时段SOC+时段充电量”的需求。
  3. 无效方程定义:部分约束为恒等式(如p_j[tt,0] >= p_j[tt,0]),无实际约束作用,且未正确传递有效方程给Gekko。
  4. 目标函数偏离需求:原代码用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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.12 08:45:36