光伏电站电池储能优化模型输出异常结果的原因排查
核心问题定位
你遇到的反常放电行为(高价时分次少量放电、低价时持续放电),根源是电池放电量的约束条件完全写反了:
原代码中错误约束:
model.addConstrs(battery_discharge[i] <= battery_status[i] for i in range(0,num_hours))
这里的battery_status[i]是第i小时结束后的电池电量,但第i小时的放电操作只能基于第i小时开始时的电量(即第i-1小时结束后的battery_status[i-1])。这个错误导致模型被迫限制每小时放电量不超过该小时结束后的剩余电量,形成了"每次只能放当前电量一半"的诡异结果——当不充电时,battery_status[i] = battery_status[i-1] - battery_discharge[i],代入约束得battery_discharge[i] <= battery_status[i-1] - battery_discharge[i],即battery_discharge[i] <= battery_status[i-1]/2,正好对应你看到的0.5→0.25→0.125的递减规律。
修复方案
1. 修正放电约束
删除原错误的放电约束,替换为基于上一小时结束电量的约束:
# 修正放电约束:第i小时放电量不能超过第i-1小时结束时的电池电量(i从1开始) model.addConstrs(battery_discharge[i] <= battery_status[i-1] for i in range(1, num_hours))
注:第0小时的放电已被设为0,无需额外约束。
2. 补充严谨性约束(可选)
虽然battery_status变量已设置lb=0,可显式添加约束确保每小时结束后电量非负:
model.addConstrs(battery_status[i] >= 0 for i in range(num_hours))
3. 冗余约束优化(可选)
你当前用二进制变量实现充放电互斥,但对于连续变量模型,只要无充放电效率损耗,最大化收益的目标会自动避免同时充放电(无意义的能量浪费)。若需保留互斥逻辑,可简化为:
# 替换原二进制互斥约束,无需自定义变量(会转为MIQCP,计算量略有增加) model.addConstrs(battery_charge[i] * battery_discharge[i] == 0 for i in range(num_hours))
或直接删除该约束,不影响核心收益逻辑。
其他潜在优化点
- 添加充放电效率:实际电池存在损耗,可修正电池状态约束(示例:充电效率0.95、放电效率0.95):
charge_efficiency = 0.95 discharge_efficiency = 0.95 model.addConstrs(battery_status[i] == battery_status[i-1] - battery_discharge[i]/discharge_efficiency + battery_charge[i]*charge_efficiency for i in range(1, num_hours)) - 调整日放电总量约束:原约束
gp.quicksum(battery_discharge[i]) <= discharge_limit*num_hours/24,可根据实际电池参数(如每日最大放电量等于电池容量)调整逻辑。
验证效果
修正后,模型会在电价最高的时段优先放完所有可用电池电量,完全符合最大化收益的常规逻辑。
内容的提问来源于stack exchange,提问作者mchingoska

