CVXPY可再生能源成本计算项目异常结果排查求助
克利夫兰7月单日全可再生电力成本优化问题排查与解决
项目背景
使用CVXPY求解克利夫兰市7月单日全可再生电力的最小成本,核心参数:
- 单日总需求:481GWh
- 风电装机成本:$1300/kW
- 光伏装机成本:$300/kW
- 锂电池储能成本:$153/kWh
模型通过随机模拟天气、风速,用正弦曲线模拟日照,手动设定类正弦逐小时需求,多次运行优化器覆盖不同场景。
现存问题
- 已给风电/光伏装机容量添加非负约束,但输出频繁出现接近0的负值(如
-1e-6量级) - 初始提供满电(481GWh)电池时,优化器未完全依赖初始储能,仍会配置风光装机
问题1:非负约束失效的排查与修复
可能原因
- 求解器浮点精度误差:CVXPY依赖的凸优化求解器(如ECOS、OSQP)存在微小数值噪声,接近0的负值是求解器计算误差,并非约束被突破
- 约束遗漏:未给
wind_power_capacity和solar_power_capacity添加显式非负约束(仅约束了电池相关变量) - 约束逻辑冲突:需求类约束过严,求解器只能通过极小负值满足等式约束
修复方案
- 补全显式非负约束:确保装机容量的非负约束明确写入代码:
# 强制风光装机容量非负 constraints += [wind_power_capacity >= 0] constraints += [solar_power_capacity >= 0] - 处理数值精度问题:
- 若为求解器噪声,可在结果后做截断:
wind_result = max(wind_power_capacity.value, 0.0) solar_result = max(solar_power_capacity.value, 0.0) - 或用极小下界替代严格0,避免求解器波动:
constraints += [wind_power_capacity >= 1e-9] constraints += [solar_power_capacity >= 1e-9]
- 若为求解器噪声,可在结果后做截断:
- 检查约束冲突:验证需求相关约束的合理性,比如当前代码中
energy_in_battery[i] >= cuyahoga_county_energy_requirement[i]的逻辑是否正确(电池剩余电量无需大于当前需求,应为总供电满足需求)
问题2:初始储能未被充分利用的排查与修复
核心原因:约束逻辑错误
当前电池电量更新和需求约束的逻辑完全颠倒:
- 错误约束:要求
energy_in_battery[i] >= 需求(电池剩余电量必须大于等于当前小时需求) - 错误电量更新:
energy_in_battery[i] = 风光发电 + 前序电量 - 需求,这会导致初始满电的电池在满足需求后,剩余电量仍需大于需求,迫使求解器额外配置风光发电来“填充”电池剩余量
修复方案:重构储能与需求约束逻辑
正确的能量平衡逻辑应围绕「总供电满足需求」和「电池电量在合理区间」展开:
重新定义约束:
for i in range(24): # 计算当前小时风光发电量 wind_gen = today_wind_speed * wind_cp * wind_power_capacity solar_gen = solar_power_capacity * cloudy_factor * sun[i] demand = cuyahoga_county_energy_requirement[i] # 1. 总供电(风光发电 + 电池放电)≥ 当前需求 constraints += [wind_gen + solar_gen + (energy_in_battery[i-1] if i>0 else starting_energy) >= demand] # 2. 电池电量更新:剩余电量 = 前序剩余 + 风光发电 - 需求 if i == 0: constraints += [energy_in_battery[i] == starting_energy + wind_gen + solar_gen - demand] else: constraints += [energy_in_battery[i] == energy_in_battery[i-1] + wind_gen + solar_gen - demand] # 3. 电池电量边界约束:不能过度放电(≥0),不能超过容量(≤battery_capacity) constraints += [energy_in_battery[i] >= 0] constraints += [energy_in_battery[i] <= battery_capacity]检查目标函数:确保目标函数仅最小化装机成本(风光+储能):
objective = cp.Minimize(1300 * wind_power_capacity + 300 * solar_power_capacity + 153 * battery_capacity)初始储能属于已有资源,无需计入成本,这样求解器会优先使用免费的初始储能,仅当风光+储能的综合成本更低时才会配置装机。
验证初始储能设置:确保
starting_energy被正确赋值为481GWh,且没有额外约束强制要求风光装机容量大于0。
内容的提问来源于stack exchange,提问作者Ben
相关产品推荐
相关产品推荐

