储能的削峰填谷作用,如下图所示的削峰填谷数学模型,利用cplex求解混合整数规划可得结果。
先看模型骨架,整个问题可以抽象成24小时时间窗里的充放电策略。我习惯把模型拆解成三个关键部分:决策变量、经济目标、物理约束。用CPLEX建模时,代码结构基本遵循这个逻辑。
from docplex.mp.model import Model
mdl = Model(name='Peak_Shaving')
# 决策变量全家福
charge = mdl.binary_var_dict(24, name='charge') # 充电标志位
discharge = mdl.binary_var_dict(24, name='discharge') # 放电标志位
soc = mdl.continuous_var_dict(24, lb=0, ub=100, name='SOC') # 荷电状态
这里有个小技巧:用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) # 电网供电平衡
这几个等式像齿轮一样环环相扣。特别是电网供电平衡式,把负荷、储能动作、外购电量串联成闭环系统,稍微算错个符号就会导致模型崩盘。
求解后发现个有趣现象:最优解往往会在电价谷时疯狂充电,哪怕此时负荷并不低。比如某次求解日志显示:
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%,而用户侧甚至感觉不到这种后台的调度魔法。或许这就是数学模型的魅力——用隐形的优化之手,守护着每一度电的旅程。

被折叠的 条评论
为什么被折叠?



