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

CVXPY可再生能源成本计算项目异常结果排查求助

克利夫兰7月单日全可再生电力成本优化问题排查与解决

项目背景

使用CVXPY求解克利夫兰市7月单日全可再生电力的最小成本,核心参数:

  • 单日总需求:481GWh
  • 风电装机成本:$1300/kW
  • 光伏装机成本:$300/kW
  • 锂电池储能成本:$153/kWh

模型通过随机模拟天气、风速,用正弦曲线模拟日照,手动设定类正弦逐小时需求,多次运行优化器覆盖不同场景。

现存问题

  1. 已给风电/光伏装机容量添加非负约束,但输出频繁出现接近0的负值(如-1e-6量级)
  2. 初始提供满电(481GWh)电池时,优化器未完全依赖初始储能,仍会配置风光装机

问题1:非负约束失效的排查与修复

可能原因

  • 求解器浮点精度误差:CVXPY依赖的凸优化求解器(如ECOS、OSQP)存在微小数值噪声,接近0的负值是求解器计算误差,并非约束被突破
  • 约束遗漏:未给wind_power_capacity和solar_power_capacity添加显式非负约束(仅约束了电池相关变量)
  • 约束逻辑冲突:需求类约束过严,求解器只能通过极小负值满足等式约束

修复方案

  1. 补全显式非负约束:确保装机容量的非负约束明确写入代码:
    # 强制风光装机容量非负
    constraints += [wind_power_capacity >= 0]
    constraints += [solar_power_capacity >= 0]
    
  2. 处理数值精度问题:
    • 若为求解器噪声,可在结果后做截断:
      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]
      
  3. 检查约束冲突:验证需求相关约束的合理性,比如当前代码中energy_in_battery[i] >= cuyahoga_county_energy_requirement[i]的逻辑是否正确(电池剩余电量无需大于当前需求,应为总供电满足需求)

问题2:初始储能未被充分利用的排查与修复

核心原因:约束逻辑错误

当前电池电量更新和需求约束的逻辑完全颠倒:

  • 错误约束:要求energy_in_battery[i] >= 需求(电池剩余电量必须大于等于当前小时需求)
  • 错误电量更新:energy_in_battery[i] = 风光发电 + 前序电量 - 需求,这会导致初始满电的电池在满足需求后,剩余电量仍需大于需求,迫使求解器额外配置风光发电来“填充”电池剩余量

修复方案:重构储能与需求约束逻辑

正确的能量平衡逻辑应围绕「总供电满足需求」和「电池电量在合理区间」展开:

  1. 重新定义约束:

    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]
    
  2. 检查目标函数:确保目标函数仅最小化装机成本(风光+储能):

    objective = cp.Minimize(1300 * wind_power_capacity + 300 * solar_power_capacity + 153 * battery_capacity)
    

    初始储能属于已有资源,无需计入成本,这样求解器会优先使用免费的初始储能,仅当风光+储能的综合成本更低时才会配置装机。

  3. 验证初始储能设置:确保starting_energy被正确赋值为481GWh,且没有额外约束强制要求风光装机容量大于0。


内容的提问来源于stack exchange,提问作者Ben

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.25 16:27:29