电力系统调度员最头疼的就是负荷曲线上的“尖峰时刻“,储能系统就像个会算账的中间商,在电网里玩转时间差。咱们今天用数学语言聊聊这个“高抛低吸“的生意经

张开发
2026/4/7 0:35:03 15 分钟阅读

分享文章

电力系统调度员最头疼的就是负荷曲线上的“尖峰时刻“,储能系统就像个会算账的中间商,在电网里玩转时间差。咱们今天用数学语言聊聊这个“高抛低吸“的生意经
储能的削峰填谷作用如下图所示的削峰填谷数学模型利用cplex求解混合整数规划可得结果。先看模型骨架整个问题可以抽象成24小时时间窗里的充放电策略。我习惯把模型拆解成三个关键部分决策变量、经济目标、物理约束。用CPLEX建模时代码结构基本遵循这个逻辑。from docplex.mp.model import Model mdl Model(namePeak_Shaving) # 决策变量全家福 charge mdl.binary_var_dict(24, namecharge) # 充电标志位 discharge mdl.binary_var_dict(24, namedischarge) # 放电标志位 soc mdl.continuous_var_dict(24, lb0, ub100, nameSOC) # 荷电状态这里有个小技巧用binaryvardict处理0-1变量比挨个声明变量清爽多了。charge和discharge这两个互斥的开关量后面会用约束条件把它们焊死——就像现实中的电池不能同时充放电。目标函数要兼顾电网公司和储能业主的利益# 构建目标函数 peak_power mdl.max([grid_power[t] for t in range(24)]) # 找出最大外购功率 energy_cost mdl.sum(grid_power[t] * price[t] for t in range(24)) mdl.minimize(peak_power * 1000 energy_cost) # 峰需惩罚项放大1000倍这里用了个加权法把多目标转化成单目标。把peak_power乘以1000是工程上的经验值——确保削峰优先级远高于电量费用毕竟容量电费才是电网公司的大头支出。物理约束就像给电池套上的紧箍咒。举个有意思的约束充放电互斥for t in range(24): mdl.add(charge[t] discharge[t] 1) # 不能又充又放 mdl.add(soc[t] soc[t-1] charge[t]*P_char - discharge[t]*P_dischar) # 电量守恒 mdl.add(grid_power[t] load[t] - discharge[t]*P_dischar charge[t]*P_char) # 电网供电平衡这几个等式像齿轮一样环环相扣。特别是电网供电平衡式把负荷、储能动作、外购电量串联成闭环系统稍微算错个符号就会导致模型崩盘。储能的削峰填谷作用如下图所示的削峰填谷数学模型利用cplex求解混合整数规划可得结果。求解后发现个有趣现象最优解往往会在电价谷时疯狂充电哪怕此时负荷并不低。比如某次求解日志显示Optimal solution found Objective value: 58432.79 Peak shaved from 156MW to 128MW Charging hours: [1,2,3,4,23] Discharging at: [9,10,11,15,16,17,18]负荷高峰期的放电动作像精准的外科手术把原本突兀的负荷尖峰削成缓坡。更妙的是模型自动利用了凌晨的低谷电价实现了成本最小化。不过这种完美解依赖准确的负荷预测。现实中可以引入鲁棒优化给模型穿上防弹衣# 鲁棒性改造 uncertain_load load[t] mdl.uniform(-10,10) mdl.add(grid_power[t] uncertain_load - discharge[t]*P_dischar charge[t]*P_char)用不确定集包裹负荷预测值让优化结果具备抗干扰能力。这就像给储能策略买了份保险虽然可能略微提高成本但避免了实际运行中的翻车风险。最后展示下优化前后的负荷曲线对比假设此处有图。原本像针尖的峰谷被储能熨成了波浪线电网设备利用率提升15%而用户侧甚至感觉不到这种后台的调度魔法。或许这就是数学模型的魅力——用隐形的优化之手守护着每一度电的旅程。

更多文章