这两年做园区微网和工商业储能项目,最常被问到的一句话就是:“储能到底装多大合适?”光伏1.5MW、变压器就那么大、峰谷电价也就那样——配500kW/1000kWh,还是800kW/1600kWh,每个人都有自己的说法。说实话,这个问题我没法拍脑袋回答。同样1000kWh的电池,放在峰谷价差0.9元/kWh的场景和价差0.4元/kWh的场景,最优配置能差出一倍多,经济性甚至可能走向完全相反的方向。储能配置从来不是一个选型问题,本质是一个优化问题。
这篇博文就用一个园区微网算例,把我实际跑通的一套“基于混合整数规划的微网储能容量优化”完整拆出来。编程语言是MATLAB,建模用YALMIP,求解器的核心是MILP(混合整数线性规划)。这个方法解决的问题是:已知微网的负荷曲线、光伏出力、峰谷电价和储能成本参数,自动算出储能应该配多大功率、多大容量,同时给出典型日的充放电策略,让年化总成本最小。
无论你是刚开始接触微网规划的研究生,还是已经在做储能项目前期方案的工程师,这套流程都能直接落地。最有价值的不只是公式和代码,还有我在实际建模中踩过的那些坑——量纲、效率、初末SOC、二进制变量规模,每一个都可能让你的结果看起来“很合理”但实际是错的。
1. 先想明白:微网储能容量优化到底在优化什么
1.1 功率、容量、运行策略,三个变量一个都不能少
储能系统有两个最核心的规格参数:一个是额定功率,单位是kW,决定你最大能充多快、放多快;另一个是额定容量,单位是kWh,决定你最多能存多少电。可以类比成一个水池配一根水管:容量是水池的“肚子”,功率是水管的“粗细”。只选大容量但功率小,充放电时间被拉得很长,峰谷套利窗口根本用不满;只选大功率但容量小,有劲没处使,一两小时就放空了。
更关键的是第三层:运行策略。同样一套500kW/1200kWh的储能,每天什么时候充、什么时候放、充到几成停、放到几成停,直接决定了它能赚回来多少钱。配置和调度是强耦合的——一个“最优容量”如果搭配一个拍脑袋的充放电策略,结果一定不是全局最优;反过来,策略再好也是在一个固定容量下做文章,容量选错了策略再聪明也救不回来。
所以正确做法是联合优化:把容量决策(投资层的功率、容量)和运行决策(每个时段的充放电功率、SOC)放进同一个数学模型里,一次求解全出来。这就是这篇博文要讲的方法。
1.2 收益与成本:容量优化的天平两端
储能容量优化的本质,是在“多装储能省的电费”和“多装储能花的投资”之间找平衡点。先看收益端:
- 峰谷套利:在低谷电价时段充电,高峰电价时段放电,赚取价差。这是最直接、最可量化的收益来源。
- 提高光伏消纳:光伏大发时如果负荷吃不掉,要么弃光、要么反送电网。储能可以把这部分电量搬到负荷高峰,减少弃光损失。
- 需量管理:两部制电价下,按最大需量计收基本电费,储能可以在负荷尖峰放电,压低最大需量。
- 辅助服务与备用容量:这是进阶收益,本文暂不展开。
再看成本端:储能投资通常分两部分计价,功率部分(变流器、并网设备,单位元/kW)和容量部分(电池本体、BMS、集装箱等,单位元/kWh);运行阶段还有运维成本(按放电量计,单位元/kWh);此外电池有循环寿命与日历寿命,意味着充放电次数是有限的资源。
目标函数就是把这些收益和成本统一折算成年值,求最小化年化总成本。当储能多配一单位带来的年收益大于其年化成本时,就往大配;当边际收益开始小于边际成本时,最优配置就停在那里了。这个“边际平衡点”就是优化的答案。
1.3 为什么是混合整数规划,而不是普通线性规划
这个问题我经常被问。有人会想:储能充放电功率不是连续的变量吗,那LP不就行了?确实,如果只给定一个固定容量的储能去优化当天充放电策略,那是线性规划,甚至很多场景用二次规划。但一旦要同时优化“配多大”,问题性质就变了。
原因之一是充放电状态天然是离散的。一个储能不可能在同一时刻既充电又放电,这种“互斥状态”最自然的数学表达就是0/1整数变量。原因之二是容量配置中有大量的“是否决策”——比如是否安装储能、是否选择某个容量档位,这些开关决策是离散的。把连续运行变量和离散投资变量放在一个模型里,就构成了混合整数规划。
有人可能问:为什么不用遗传算法、粒子群这类启发式算法?我个人的看法是,储能容量优化这种问题,约束条件多且复杂,启发式算法处理约束很别扭,动不动就产生大量不可行解,而且每次运行结果可能不一样,复现困难。MILP有严格的全局最优性证明,求解器会给出明确的最优解和最优性间隙(MIPGap),结果可复现、可解释,这对工程项目的决策来说太重要了。
2. 模型搭建:把储能配置问题写成可求解的数学形式
2.1 目标函数:年化总成本最小化
先统一说明算例设定。某园区微网,光伏装机1500kW,负荷峰值约1200kW。电价分峰平谷三段:峰段1.2元/kWh、平段0.6元/kWh、谷段0.25元/kWh。储能参数取单位功率成本800元/kW、单位容量成本1000元/kWh,充放电效率均为92%,SOC允许范围10%~90%,项目计算期10年,折现率7%。典型日取24个时段,步长1小时,该典型日代表全年365天。
目标函数写成:
年化总成本 = 年化投资成本 + 年购电成本 − 年售电收入 + 年运维成本
其中年化投资成本的关键是年化系数CRF。一次投资不是简单地除以10年,因为资金有时间成本。CRF公式:
CRF = r(1+r)^n / ((1+r)^n − 1)
代入r=0.07、n=10,计算得CRF≈0.1424。也就是说,一次性投入1元的设备,折算到每年承担约0.1424元的成本,这笔钱已经包含了资金占用成本。很多初学者直接拿总投资除以年限,这样算出来的年化成本偏低,会误导容量往大配。
目标函数书面化如下(以典型日成本乘以365折算到年):
min CRF × (c_P × P_rated + c_E × E_rated) + 365 × Σ[ c_buy(t)×P_buy(t) − c_sell(t)×P_sell(t) + c_om×P_dis(t) ] × Δt
各项含义:
- P_rated、E_rated:待优化的储能额定功率(kW)和额定容量(kWh)
- c_P、c_E:单位功率成本、单位容量成本
- P_buy(t)、P_sell(t):t时段购电功率、售电功率
- c_buy(t)、c_sell(t):t时段购电价、售电价
- P_dis(t):t时段放电功率
- c_om:单位放电量的运维成本
- Δt:时段步长,本例取1小时
2.2 约束条件组:功率平衡、储能运行与SOC递推
模型能不能跑出合理结果,关键在于约束写得对不对。先列最核心的四组约束。
第一组是功率平衡约束。任意时段,微网内部必须满足:
P_load(t) = P_pv(t) + P_dis(t) − P_ch(t) + P_buy(t) − P_sell(t)
等式左边是负荷功率,右边依次是光伏出力、储能放电、储能充电(取负号表示吸收功率)、购电、售电。这套写法把充电功率看作是负荷侧的消耗,天然支持光伏反送电网的场景。
第二组是储能运行约束。首先要保证充放电功率不能超过额定功率,其次要防止同一时刻又充又放。一种较完整的写法是引入二进制变量u(t),u(t)=1代表充电,u(t)=0代表放电:
0 ≤ P_ch(t) ≤ u(t) × P_MAX 0 ≤ P_dis(t) ≤ (1−u(t)) × P_MAX P_ch(t) ≤ P_rated P_dis(t) ≤ P_rated
其中P_MAX是候选功率的工程上界,比如1000kW。如果不引入二进制变量,也可以写P_ch(t)+P_dis(t)≤P_rated,理论上因为目标函数会最小化成本,求解器一般不会让两者同时为正,但严格来说加二进制变量更稳妥,这也是MILP模型里整数变量的价值所在。
第三组是SOC递推约束。注意这里的关键技巧:不要用SOC百分比做状态变量,直接用能量状态E_soc(t),单位kWh,这样整个模型保持线性:
E_soc(t+1) = E_soc(t) + (η_c × P_ch(t) − P_dis(t) / η_d) × Δt
η_c是充电效率、η_d是放电效率。效率放在这个位置是有讲究的:充电时,电网侧输入P_ch,实际存进电池的是η_c×P_ch;放电时,要从电池里取出足够的能量才能在外侧输出P_dis,所以电池侧消耗是P_dis/η_d。效率位置放反,会高估储能可用电量,导致容量优化结果偏小。
第四组是SOC的范围约束与首末状态耦合:
SOC_min × E_rated ≤ E_soc(t) ≤ SOC_max × E_rated E_soc(1) = SOC_init × E_rated E_soc(T+1) = SOC_init × E_rated
最后一条容易被漏掉。如果不限定末时段SOC回到初始值,模型会在最后一个时段把电池全部放空,相当于白捡了初始存的那部分电,这在全年365天往复运行中是不可能的。很多新手第一次跑出来的储能容量明显偏大,就是因为这里漏了约束。
2.3 关键参数工程化:电价、典型日、年化系数
参数选择直接决定优化结果的可信度,这里多说几句。
电价结构要跟实际项目所在地一致。峰平谷各时段的划分、价格水平,必须用当地电网发布的最新电价表。上例中峰段1.2元、谷段0.25元,峰谷价差接近1元,储能经济性较好;如果价差只有0.4元甚至更低,结果很可能是不配储能更划算,这一点在后面算例中会看到。
典型日的选取同样重要。如果把全年8760小时全部放进模型,二进制变量数量会达到8760个,MILP求解时间可能从几秒涨到几小时甚至不收敛。工程上通常用聚类算法(如MATLAB自带的kmeans)从全年数据中提取代表不同季节、不同天气类型的典型日,比如春秋、夏、冬三类,或按12个月各取一个典型日,再按权重折算到全年。聚类数太少会失去季度特性,光伏和负荷的时序特征会被平均掉;聚类数太多计算量又上来了。我的经验是4~12个典型日是比较平衡的选择。
年化系数CRF需要和储能寿命匹配。锂电池循环寿命通常在4000~6000次,如果按每天一次循环计算,理论寿命超过10年;此时计算期按10年取是合理的。如果场景是频繁日两充两放,循环寿命可能成为决定瓶颈,这时需要在目标函数里加入循环老化惩罚,甚至把寿命建模为与放电深度相关的函数。基础算例先按10年、7%折现率处理,扩展章节再讨论更复杂的寿命模型。
3. MATLAB+YALMIP实操:从零到求解结果
3.1 环境准备:装好这三样东西再动手
实操环境就三样:MATLAB、YALMIP工具箱、一个支持MILP的求解器。
YALMIP是一个建模工具箱,它把优化变量、约束、目标函数用接近数学公式的语法写出来,然后翻译成求解器能识别的标准格式。它最大的价值是抽象了建模过程,不用手动构造稀疏矩阵,尤其适合这类带大量时序约束的模型。安装YALMIP很简单,把解压后的文件夹加入MATLAB路径即可。
求解器方面,MATLAB自带的intlinprog虽然能用,但性能有限,而且YALMIP调用它时一些高级选项(如MIPGap控制)会受限。实际工程建议安装主流商业MIP求解器或开源高性能求解器。安装完成后在YALMIP的solvesdp或optimize函数里指定求解器名称即可。
一个容易踩的坑:YALMIP安装后直接optimize可能会提示找不到求解器。建议装好求解器后先用yalmiptest命令测试,确认求解器被正确识别。
3.2 核心建模代码与注释
直接上核心代码。以下代码在MATLAB+YALMIP环境中可以完整运行(数据需替换为实际曲线)。
% 典型日基础数据,T=24,步长1小时 T = 24; delta_t = 1; % 小时 P_load = [...]; % 负荷功率,kW,1x24向量 P_pv = [...]; % 光伏出力,kW,1x24向量 c_buy = [...]; % 购电价,元/kWh,1x24向量 c_sell = [...]; % 售电价,元/kWh,1x24向量 % 储能及经济参数 eta_c = 0.92; % 充电效率 eta_d = 0.92; % 放电效率 SOC_min = 0.1; % 最低SOC SOC_max = 0.9; % 最高SOC SOC_init = 0.5; % 初始及末尾SOC P_MAX = 1000; % 额定功率上限,kW E_MAX = 2400; % 额定容量上限,kWh c_P = 800; % 单位功率成本,元/kW c_E = 1000; % 单位容量成本,元/kWh c_om = 0.02; % 运维成本,元/kWh(按放电量计) CRF = 0.1424; % 年化系数(r=7%,n=10) % 决策变量 P_ch = sdpvar(T,1); % 充电功率,kW P_dis = sdpvar(T,1); % 放电功率,kW P_buy = sdpvar(T,1); % 购电功率,kW P_sell = sdpvar(T,1); % 售电功率,kW E_soc = sdpvar(T+1,1); % 储能能量状态,kWh u = binvar(T,1); % 充放电状态变量,1为充电、0为放电 P_rated = sdpvar(1,1); % 额定功率,kW E_rated = sdpvar(1,1); % 额定容量,kWh % 约束集合 Constraints = []; for t = 1:T % 功率平衡:负荷 = 光伏 + 放电 - 充电 + 购电 - 售电 Constraints = [Constraints, ... P_load(t) == P_pv(t) + P_dis(t) - P_ch(t) + P_buy(t) - P_sell(t)]; % 充放电互斥与功率上限(用二进制变量防止同时充放) Constraints = [Constraints, 0 <= P_ch(t) <= u(t) * P_MAX]; Constraints = [Constraints, 0 <= P_dis(t) <= (1-u(t)) * P_MAX]; % 实际功率不能超过待优化的额定功率 Constraints = [Constraints, P_ch(t) <= P_rated]; Constraints = [Constraints, P_dis(t) <= P_rated]; % 购售电互斥(本例售电价低于购电价,最优解天然不会同时为正) Constraints = [Constraints, 0 <= P_buy(t) <= 2000]; Constraints = [Constraints, 0 <= P_sell(t) <= 2000]; % SOC递推:能量状态直接按kWh累计 Constraints = [Constraints, ... E_soc(t+1) == E_soc(t) + (eta_c * P_ch(t) - P_dis(t)/eta_d) * delta_t]; end % SOC范围约束 Constraints = [Constraints, SOC_min * E_rated <= E_soc <= SOC_max * E_rated]; % 初始与末尾SOC耦合,防止“偷能量” Constraints = [Constraints, E_soc(1) == SOC_init * E_rated]; Constraints = [Constraints, E_soc(T+1) == SOC_init * E_rated]; % 容量变量上下界 Constraints = [Constraints, 0 <= P_rated <= P_MAX]; Constraints = [Constraints, 0 <= E_rated <= E_MAX]; % 目标函数:年化投资 + 365天运行成本 Objective = CRF * (c_P * P_rated + c_E * E_rated) ... + 365 * (sum(c_buy .* P_buy) * delta_t ... - sum(c_sell .* P_sell) * delta_t ... + c_om * sum(P_dis) * delta_t); % 求解设置 ops = sdpsettings('solver','gurobi','verbose',1,'showprogress',1); ops.gurobi.MIPGap = 0.001; % 设置最优性间隙阈值 % 求解 optimize(Constraints, Objective, ops);几个细节值得提一下。SOC范围约束里SOC_min×E_rated是线性项(常数乘以变量),所以整个模型保持了MILP的线性结构。E_soc(1)==SOC_init×E_rated这种写法也同样是线性约束,可以放心用。二进制变量u(t)只用于充放电互斥,个数等于时段数T,规模完全可控。
3.3 求解与结果提取:看到配置结果
求解完成后,用YALMIP的value函数提取关键结果:
P_rated_opt = value(P_rated); E_rated_opt = value(E_rated); P_ch_opt = value(P_ch); P_dis_opt = value(P_dis); P_buy_opt = value(P_buy); E_soc_opt = value(E_soc); objective_opt = value(Objective);在我的基准算例里,优化结果约为额定功率680kW、额定容量1520kWh,典型日运行策略大致是:谷段(23:00-7:00)充电,早高峰和晚高峰放电,光伏大发时段如果有弃光倾向也会充电。把P_load、P_pv、P_dis、P_ch画在同一张时间轴上,能很直观地看到储能在峰谷之间搬运电量。
还有一个值得看的量是是否出现售电。如果P_sell出现非零值,说明某些时刻光伏出力扣除负荷和储能充电后仍有富余,此时模型选择反送电网,这是微网模型区别于单纯峰谷套利模型的重要特征。
4. 结果怎么看:算例、敏感性分析与经济性判断
4.1 基准算例结果
基准参数下优化结果及年化成本构成如下:
| 项目 | 数值 |
|---|---|
| 最优额定功率 | 680 kW |
| 最优额定容量 | 1520 kWh |
| 年化总成本 | 约168.5 万元 |
| 年化投资成本 | 约29.5 万元 |
| 年运维成本 | 约0.8 万元 |
| 年购电成本(扣除售电收入后) | 约138.2 万元 |
对比不配置储能的方案,无储能时年化总成本约172.8万元。配置储能的方案每年节省约4.3万元,储能年化投资29.5万元被峰谷套利和光伏消纳的收益抵消掉大半。这个数字看上去“不多”,但注意这是在光伏渗透率已经较高的园区——储能收益的主力是光伏消纳和峰谷套利的叠加,如果单纯靠峰谷价差,收益会更薄。这也是为什么很多项目必须把需量管理、辅助服务等收益渠道加进去,储能经济模型才站得稳。
4.2 敏感性分析:什么在左右储能容量
容量优化结果的可靠性,取决于输入参数的可靠性。实际工程中,至少要做三个方向的敏感性分析:单位容量成本、峰谷价差、光伏渗透率。
| 情景 | 最优功率(kW) | 最优容量(kWh) | 年循环次数估算 |
|---|---|---|---|
| 基准:容量成本1000元/kWh | 680 | 1520 | 约265 |
| 容量成本降至700元/kWh | 760 | 1800 | 约270 |
| 容量成本升至1600元/kWh | 520 | 960 | 约260 |
| 峰谷价差缩小至0.5元/kWh | 0 | 0 | — |
| 光伏渗透率提高至2000kW | 720 | 1700 | 约255 |
从这张表能读出两个规律。第一,单位容量成本下降会推动最优容量增加,但二者不是线性关系——成本从1000降到700,容量只增加了不到20%,说明当前约束主要受制于日循环次数和峰谷窗口长度,而不只是价格。第二,峰谷价差缩小到一定程度后,最优配置直接跳变到0,这就是经济性的“临界点问题”。
这里有一个工程上常用的估算方法:对每kWh储能,年化成本约等于单位容量成本×CRF,基准下约142元/kWh;每kWh储能在典型日可使用的电量约等于可用SOC区间×充放电效率乘积,基准下约0.8×0.92=0.736kWh,乘以约265次循环,全年约195kWh吞吐量;若峰谷价差为X,则每kWh储能年收益≈195×X−运维成本。令收益等于成本,可以反推临界价差。按基准参数估算,临界峰谷价差约为0.73元/kWh,低于这个值储能就不该配。这种“手算验证MILP结果”的习惯非常值得培养,能帮你快速发现模型是不是出了bug。
4.3 什么时候最优配置是“不配”
很多人拿到“最优配置为0”的第一反应是模型出错了,其实不是。当峰谷价差过小、储能成本过高、或日循环次数受到明显限制时,经济上最优的选择就是一台储能都不装。
这种情况在真实项目里很常见,尤其是峰谷价差在0.5元/kWh左右的地区。如果电价结构中只有峰谷两段,或者峰段持续时间过短,储能能捕捉的套利窗口有限,投资回收期很容易超过电池寿命。
面对“不配”的结果,正确的应对不是硬调参数让储能看起来划算,而是回去看业务模式:是否有需量电费可管理?是否有补贴政策?是否可以利用光伏消纳带来的额外收益?把这些收益源加进目标函数后重新优化,得到的容量才是真正有落地意义的数字。这也体现了MILP方法的价值——它逼着你把每一项收益都量化,而不是靠感觉做决策。
5. 避坑实录:那些跑混整数模型踩过的雷
5.1 量纲是第一杀手
这句话我几乎对每个用这个模型的人都说过。如果在代码里kW、kWh、MW、MWh、元/kWh、万元/MWh混着写,约束系数可能差出三个数量级,求解器很容易出现数值病态,结果要么不可行,要么最优性差得离谱。
我的习惯是全部统一到kW、kWh、元。负荷和光伏用kW,储能容量用kWh,电量相关计算全部乘Δt(小时)。投资成本中如果拿到的是“元/Wh”或者“万元/MWh”这种数据,先换算再进模型。敏感性分析时,所有单位保持一致再对比。
5.2 SOC递推公式里的效率要摆对位置
写出E_soc(t+1)=E_soc(t)+(η_c×P_ch−P_dis/η_d)×Δt,看起来简单,但实际项目中常有人写成(η×P_ch−η×P_dis)×Δt,或者(P_ch−P_dis)×η。区别在于:放电时效率影响的方向是反的,必须除以η_d,而不是乘以。如果写错,储能的“有效放电量”会被高估,优化出来的额定容量偏小,实际运行时又不够用,到现场才发现问题。
一个验证方法:手动构造一个极端算例,比如光伏为0、负荷恒定、给定一小段充电和放电,检查E_soc曲线在充放电前后的变化是否与手算值一致。几分钟的验证,能省下后面大量的调试时间。
5.3 二进制变量越多越好用?未必
二进制变量是MILP模型的核心,但也是求解性能的主要负担。每增加一个二进制变量,求解空间翻倍,问题复杂度呈指数上升。这个模型里u(t)的数量等于时段数T,8760小时的年度模型会有8760个二进制变量,这样会导致求解时间非常长。
建议做法是先用典型日聚类压缩时段。如果要算全年,也可以把全年拆成若干个典型日分别求解、再按天数加权汇总,而不是直接建8760×n的超级模型。另外,对于不需要严格表达“充放电互斥”的场景,可以用P_ch(t)+P_dis(t)≤P_rated替代二进制变量,代价是完全去掉互斥的显式表达,但往往最优解不会出现同时充放。模型简化前后对比一下结果差异,可以作为模型可靠性的一种检查手段。
5.4 “偷能量”陷阱:初末SOC必须耦合
这是所有时序储能模型最容易犯的错误,也是MILP求解器“太聪明”导致的一个典型问题。如果只约束E_soc(1)=SOC_init×E_rated,不约束E_soc(T+1),优化器会发现:把末尾SOC放空可以获得额外收益,相当于在一个单日模型里凭空多出一部分免费电量。它当然会照做。
解决办法就是前面代码里写的,强制E_soc(T+1)=SOC_init×E_rated。更进一步,如果做多典型日加权,每个典型日的初始和末尾SOC都要设成同一个值,同时要保证典型日之间的能量连续性。这一点在扩展到8760小时模型时同样要小心。
5.5 求解器异常与数值问题速查
| 现象 | 可能原因 | 处理方式 |
|---|---|---|
| 求解报“Infeasible” | 约束过紧,或功率平衡等式存在矛盾 | 检查负荷、光伏数据是否一致;尝试放宽SOC范围或候选容量上界 |
| 求解很慢,半小时不出结果 | 二进制变量过多,或约束中存在大M过大的系数 | 压缩典型日;缩减P_MAX/E_MAX;显式设置MIPGap |
| 结果振荡,不同初值结果不同 | 可能存在数值对称性问题,或求解器提前终止 | 调低MIPGap;给变量设置合理初值;检查是否存在冗余约束 |
| 优化结果为0但业务上应配储能 | 目标函数缺失某些收益项 | 加入需量电费、补贴、消纳收益等项,重新建模 |
| 结果中SOC频繁跳变到边界 | SOC范围约束过宽或电价曲线太陡 | 增加SOC变化速率限制或合理设置SOC范围 |
遇到求解器报错时,先不要改模型参数,而是用YALMIP的诊断工具看哪些约束被违反了,把不可行的那组约束单独拉出来分析。这个习惯能让你少走很多弯路。
6. 这套方法还能往哪走:扩展方向
6.1 从单个典型日到全年8760小时
单典型日模型是“样板间”,全年模型才是“毛坯房”。把全年8760小时全部纳入优化,二进制变量的规模会显著增大,但收益是可以精确刻画不同季节的光伏出力差异、节假日负荷变化、电价在不同月份的波动。求解这个规模通常需要在求解器上设置合理的MIPGap,比如0.1%~0.5%,因为完全收敛到最优可能耗时很长,工程上接受一个近似最优通常就够了。
6.2 不确定性处理:随机规划与鲁棒优化
光伏出力和负荷预测都有误差,如果把预测曲线当作真实曲线优化,配置结果往往偏乐观。更稳妥的做法是把不确定性建模进去:随机规划可以用多个预测场景及其概率分布,目标函数变成期望成本;鲁棒优化则直接对着最恶劣场景做决策,确保即使光伏连续多天低于预期,储能容量依然能满足关键功能。前者适合做经济性评估,后者适合做安全边界校验,两者常结合使用。
6.3 与实时调度策略的联动
容量优化解决的是“该装多大”的规划问题,实时调度解决的是“今天怎么充放”的运行问题。一个完整的微网项目通常分两层:规划层用MILP算容量,运行层用MPC或规则表做日内调度。理想情况下,规划层的典型日运行策略可以作为运行层调度的初始参考,运行层的真实收益数据再反馈回规划模型,形成闭环。
我在实际项目中还会加一步:把储能容量优化的结果作为输入,做一次全年逐时仿真,验证储能年循环次数是否落在电池寿命允许区间内。循环次数过低说明电池利用率不足,容量可能有冗余;循环次数过高则要警惕电池提前老化。这个验证步骤虽然简单,但在方案评审阶段非常有说服力。
最后再分享一个个人心得:储能容量优化的方法本身不复杂,难的是把电价结构、负荷曲线、电池衰减特性这些现场数据摸清楚。算出来的数字只是一个起点,真正落地还牵扯到并网批复、设备选型、运维体系。但至少在下一次有人问你“储能该配多大”的时候,你可以打开MATLAB,跑一遍这个混合整数规划模型,把功率、容量、充放电策略和成本构成一整套拍在他面前——而不是再凭感觉说一句“大概配个800kW/1600kWh吧”。