☰
储能接入提升新能源消纳的优化调度建模与求解实践
2026/10/20 17:44:35 网站建设 项目流程

做新能源消纳分析时,常会遇到这样一个场景:对方拿着一张储能配置表来找你,问“储能接进来之后,系统到底能多消纳多少风电、能省多少钱”。嘴上说的是消纳,手上要的却是经济账。这时候如果模型的目标函数只写“弃风量最小”,结果通常会很难看——优化器会不计代价地把所有风电收进来,把火电压到近乎熄火,算出来的方案在现实中根本执行不下去。所以真正做“储能接入对新能源消纳能力影响”的分析,标准做法是把目标函数定义成系统经济性最优,也就是燃料成本加弃风惩罚成本最小,再配合机组、储能、电网的一系列约束,才能得出既满足物理规律、又敢拿去汇报的结论。

这篇文章就围绕这个目标函数和其背后的约束展开,适合正在搭电力系统优化调度模型、做新能源消纳能力评估的工程师和研究生。我尽量把建模逻辑、参数标定、求解细节和踩过的坑一次讲透。

1. 储能接入到底在改变什么:从弃风惩罚成本说起

1.1 弃风惩罚成本:目标函数里的那个“价格信号”

很多人第一次看到“弃风惩罚成本”会觉得奇怪:弃风本来就是电网运行中的结果,为什么要给它专门加一个成本项?原因在于,如果你不在目标函数里给弃风一个“价格”,优化器就会倾向于通过弃风来规避其他成本,尤其是火电的深度调峰成本。

可以这样理解:弃风惩罚成本其实是一个虚拟电价,它代表了“系统每少消纳一度风电时,全社会承担的经济损失”。这个价格信号直接决定了储能是否“值得被使用”。罚因子设低了,模型会主动选择弃风,储能变成摆设;设高了,模型会强迫系统硬吞风电,储能被过度利用,算出来的结果同样失真。

在实际项目中,这个罚因子的标定通常参考三个方向:可再生能源消纳责任权重对应的绿电价值、缺电损失电价的折算值、以及当地风电上网电价与火电标杆电价的差值。没有统一标准,但有一个工程经验必须记住——罚因子至少要高于火电在高峰负荷时的边际煤耗成本,否则弃风惩罚在目标函数里没有权重,模型永远优先保火电。

1.2 燃料成本与弃风惩罚之间的拉扯关系

储能接入之所以能提升新能源消纳能力,表面上是把弃掉的风电存了起来,本质上是在目标函数里制造了一个新的“权衡边界”。系统的总成本由燃料成本和弃风惩罚成本构成,储能改变了这两项之间的帕累托前沿。

举个例子。假设某时刻负荷很低,风电预测出力很高,火电如果继续压出力,会逼近最小技术出力,煤耗率快速恶化,单位发电成本飙升。这时候系统面临两个选择:要么降低风电消纳,承担弃风惩罚;要么让储能充电,把多余风电吸收掉。储能接入后,相当于给了系统第三条路——既不全弃风,也不硬压火电,而是先把电存起来,等到晚高峰火电边际成本最高时再放出来。

这也是为什么储能接入后的结果不能只看“弃风率降了多少”,还要看“燃料成本怎么变”。正常情况下,储能充电时段对应风电大发、火电被压低,放电时段对应火电边际成本最高峰,一压一顶之间,总成本下降。如果算出来的结果显示储能既没降低弃风率、也没省燃料成本,那大概率是模型参数或者约束设置出了问题,而不是储能没用。

2. 目标函数建模:把“经济性最优”写成可求解的数学表达式

2.1 燃料成本:为什么是二次函数,线性化怎么做

火电机组的燃料成本通常用一个二次凸函数表示:

C_fuel = Σ_{t∈T} Σ_{i∈G} (a_i · P_{i,t}² + b_i · P_{i,t} + c_i)

其中 P_{i,t} 是机组i在时段t的有功出力,a_i、b_i、c_i 是煤耗特性系数。有人会问,为什么不用线性的?因为现实中的机组热力特性决定了它不是线性的:低负荷区热耗率高、边际煤耗上升;中负荷区接近设计工况,效率最好;高负荷区又要略微恶化。二次函数是这个特性的最简近似,工程上用起来足够。

但这给求解带来了麻烦:二次函数进入优化模型后,如果你用的是线性规划或混合整数线性规划,就得把它线性化。我的做法是增量成本法,不是直接对总成本曲线做分段近似,而是对边际成本曲线(也就是一阶导数 2a_i·P + b_i)做分段。把机组出力范围切成若干段,每段定义一个固定的增量成本系数和段容量,再用连续变量表示各段投入量。这样既保持了凸性,又不会出现分段点上的“假拐点”。

分段数量一般取8到12段就够。分段太少,误差大;分段太多,模型规模膨胀,求解速度明显下降,收益却不明显。我在模拟项目X里对比过,同样的数据,4段和12段的总成本差距在0.5%以内,但分段多了之后求解时间翻了三倍,完全不划算。

2.2 弃风惩罚成本的参数设定:罚因子怎么标定

弃风惩罚成本写成公式很简单:

C_abandon = β · Σ_{t∈T} (P_wf,t − P_w,t) · Δt

其中 P_wf,t 是风电预测出力,P_w,t 是系统实际消纳的风电出力,β就是罚因子,单位是元/MWh。数学上很好写,麻烦的是β取多少。

我的经验是,β的下界取系统里边际煤耗最高的机组在高负荷时的增量成本,上界取当地缺电损失电价的折算值。如果你只是做一个评估性分析,可以从“弃风损失电价”的角度赋值,比如按风电上网电价加上环境溢价来算。比如当地风电上网电价0.45元/kWh,绿电环境溢价算0.1元/kWh,那β取550元/MWh左右就是一个合理起步值。

这里有个常见误区:有人把β设置成一个大数,比如9999,理由是“反正就是要多消纳风电”。结果模型确实把弃风率压到了很低的水平,但代价是火电在低负荷区深度调峰,煤耗剧增,甚至出现启停状态频繁切换的荒唐结果。做消纳能力分析时,弃风率只是个中间指标,总成本才是最终落脚点;β一旦脱离现实经济含义,整个目标函数就失去了“经济性最优”的资格。

2.3 储能运行成本要不要写进目标函数

这个问题我在项目评审里被问过好几次。严格的完整模型里,储能运行会产生损耗和运维费用,都应该计入目标函数。但如果你的核心目标是分析“储能接入对新能源消纳能力的影响”,我建议先做两版对比:

处理方式适用场景特点
储能运维成本写入目标函数做投资决策、容量配置优化结果偏保守,因为储能使用被收费,模型只在有净收益时才调用
储能运维成本不写入、只放约束评估消纳潜力上限结果偏乐观,反映的是物理能力上的最大消纳空间

两版结果通常需要同时汇报:一个是经济最优消纳能力,一个是物理极限消纳能力。如果经济最优结果里储能几乎没有动作,说明这个储能配置在现有电价和罚因子体系下不具备经济性,问题不在模型,而在储能容量或电网结构本身。

储能运维成本如果一定要写,最简方式是用一个固定的单位充放成本,比如按充电量或放电量收取 20~40 元/MWh 的运维费用,再叠加充放电效率带来的能量损耗成本。效率损耗其实比运维费用更值得关注,后面约束部分会展开。

3. 约束条件设计:那些被省略号吞掉的部分

标题里“约束:”后面是一串省略号,但搞调度优化的人都知道,约束比目标函数难写得多。目标函数写错了,结果只是个数值偏差;约束写漏了,求解器会直接给你一个“纸面最优、现场不可行”的方案。这个章节把常见的约束列全,并解释每个约束为什么要长这样。

3.1 功率平衡约束:整条能量链条的地基

功率平衡是所有调度模型的第一约束,公式是:

Σ_{i∈G} P_{i,t} + P_{w,t} + P_dch,t − P_ch,t = D_t

注意储能这部分的符号:P_dch,t(放电)作为电源加在等式左侧,P_ch,t(充电)作为负荷减掉。这个符号约定必须统一,我见过有人把充电功率写成负数然后又在储能约束里取了绝对值,结果算出来的总负荷曲线和实际完全对不上,排查了半天。

功率平衡约束在每个时段都要严格成立,这意味着时间分辨率直接决定模型精度。用1小时分辨率做分析,相当于假设每个小时内所有功率都恒定,这显然会低估风电的波动性,高估消纳能力。后面踩坑章节我会专门讲这个问题。

3.2 储能约束:SOC递推、充放电互斥与效率不对称

储能约束是整个模型里最容易写错的地方。首先是SOC递推约束:

SOC_t = SOC_{t−1} + (η_ch · P_ch,t − P_dis,t / η_dis) · Δt / E_ess

其中 η_ch 和 η_dis 分别是充电和放电效率,E_ess 是储能额定容量。这里隐含了一个物理事实:储能存在能量守恒,你充进去的能量打个折扣才能放出来。如果两个效率都设成1,等于给了储能一个“能量永动机”,结果就是储能频繁充放电来赚取电价差,数据很好看但完全不真实。

其次是SOC上下限约束,一般取 10%~90%,下限不为0是为保护电池寿命,上限留一点是为了避免充满后无法回收可再生制动能量(虽然电力系统场景里更多是给调频留空间)。

最关键的是充放电互斥约束,也就是同一个时段不能同时充电又放电。数学上需要引入一个二元变量:

P_ch,t ≤ M · (1 − s_t) P_dis,t ≤ M · s_t s_t ∈ {0,1}

如果不加这个约束,某些求解器会给出同时充放电的解——储能一边充电一边放电,自身在循环损耗能量,系统层面却显得很“灵活”。这在纯线性规划模型里尤其容易出现。我在调试某储能分析Demo时被这个坑坑过一次:结果里储能充放电功率都很大,总成本还降了不少,仔细一查,原来模型是在用储能“刷”效率损耗,相当于一个自耗电的假电源。

3.3 火电机组的出力与爬坡约束

火电约束是传统调度模型的基石,主要包括三部分:

出力上下限:P_i,min ≤ P_{i,t} ≤ P_i,max。P_i,min 就是最小技术出力,通常燃气轮机可以压到20%~30%,燃煤机组可能只能压到40%~50%。这个约束直接决定了系统低谷时段的调峰能力,也是弃风发生的结构性原因之一。

爬坡约束:P_{i,t} − P_{i,t−1} ≤ R_up_i,P_{i,t−1} − P_{i,t} ≤ R_down_i。爬坡速率是火电机组应对风电波动能力的物理上限。如果风电在1小时内从大风骤降到无风,而火电爬坡速率不够,就必须有储能或者其他快速调节资源顶上。储能接入对消纳能力的提升,很大一部分就来自于对爬坡瓶颈的缓解,这一点经常被只做稳态分析的人忽略。

旋转备用约束可以理解为一种安全约束,它保证系统在高负荷或风电骤降时仍有足够的可调容量:

Σ_{i∈G} (P_i,max − P_{i,t}) + (P_dis,max − P_dis,t) ≥ R_up,t

Σ_{i∈G} (P_{i,t} − P_{i,min}) + (P_ch,max − P_ch,t) ≥ R_down,t

正备用应对负荷突增或机组跳闸,负备用应对风电预测偏高。有些简化模型把备用约束省了,我建议不要省——储能接入后,备用约束经常会成为新的瓶颈,尤其是在风电占比高的系统里,备用约束决定储能容量上限,比SOC约束还“硬”。

3.4 风电出力约束和弃风量的表达

风电的约束并不复杂,核心是实际消纳功率不能超过预测功率:

0 ≤ P_{w,t} ≤ P_wf,t

同时 P_w,t 还要满足电网对风电并网的技术要求(比如爬坡率受风电场AGC限制),但作为宏观消纳分析,先把预测值作为上限就够了。

弃风量就是预测值和实际值之差:Q_abandon,t = (P_wf,t − P_w,t) · Δt。这个表达式不需要显式地写成约束,因为目标函数里惩罚的是弃风量,模型自然会通过优化 P_w,t 的大小来平衡。但有一个细节要注意:弃风变量需要设置成非负,即 P_wf,t − P_w,t ≥ 0。这个不等式隐含在风电出力上限约束里,不需要单独写。如果你把弃风量单独做成了一个变量,记得加非负约束,否则在极少数数值病态情况下,优化器可能会出现“负弃风”这种荒谬结果。

4. 求解路径与一个24小时算例:有储能和没储能差多少

4.1 先线性化再上求解器:LP和MILP的取舍

把前面所有的目标和约束放在一起,这就是一个标准的混合整数线性规划(因为充放电互斥引入了二元变量)。如果只做消纳能力的粗算,也可以把二元变量去掉,把储能建模成“只能充电或者只能放电”的简化对象,这就退化成了线性规划,但结果会有偏差。我的建议是:第一次做分析直接上MILP,别偷懒,因为储能的行为模式本身就是动态调度的核心,砍掉互斥约束就等于砍掉了储能“削峰填谷”的经济本质。

求解器选型方面,商业求解器速度快,开源求解器(比如那个常用的开源求解器)在中小规模模型上也完全够用。一个典型的24时段、3台火电机组、1座储能的模型,变量数量大概在200到300个,二元变量不超过24个,任何求解器都能秒解。如果扩展到8760小时全年连续调度,变量量级到了几万个,就需要场景削减和滚动时域技巧,那是另一篇文章的话题了。

4.2 反调峰场景下的算例设计

为了让储能的价值看得清楚,我在模拟项目X里构造了一个典型的“反调峰”场景:夜间风电大发但负荷低,白天负荷高峰时风电反而小。这是中国三北地区风电消纳困境的典型缩影,用这个场景做算例,结论最直观。

算例设置如下:两条火电机组,G1额定容量600MW,最小出力240MW,煤耗系数按典型亚临界机组设置;G2额定容量400MW,最小出力120MW。负荷曲线双峰型,峰荷1200MW出现在19点,谷荷620MW出现在4点。风电预测出力在凌晨2点到6点之间达到峰值,占当时负荷的60%以上,白天急剧下降。

储能参数:额定功率100MW,容量400MWh,充电效率0.92,放电效率0.95,初始SOC为0.5,SOC上下限取10%~90%。弃风惩罚因子取600元/MWh。24时段,每时段1小时。

4.3 算例结果对比:总成本、弃风率与储能运行轨迹

无储能场景下,夜间风电大发时段,两条火电压到各自最小出力后仍然“挤”不掉多余风电,系统被迫弃风约262MWh,弃风率接近14%。总成本里燃料成本是主体,但弃风惩罚成本已经占到总成本的8%左右,这个占比已经能说明弃风不是“小问题”了。

接入储能后,结果发生了两个显著变化:

指标无储能有储能
弃风量262 MWh81 MWh
弃风率13.7%4.2%
燃料成本102.4万元96.8万元
弃风惩罚成本15.7万元4.9万元
总成本118.1万元101.7万元
系统总电量20130 MWh20195 MWh

总成本下降了约16.4万元,其中6.7万元来自燃料成本下降,10.8万元来自弃风惩罚成本下降。储能的实际运行轨迹也符合预期:凌晨2点到6点之间充电,累计充入约190MWh;傍晚19点前后放电,恰好顶替了G2机组的高峰出力。这个“低充高放”的轨迹才是储能价值的全部来源。

4.4 从对偶乘子看储能容量上限

算例做完后,我建议额外做一个敏感性分析:把储能容量从0逐步加到800MWh,观察弃风率变化。结果是典型的边际递减曲线——前400MWh的容量把弃风率从13.7%压到4.2%,后面每增加100MWh,弃风率只能再降零点几个百分点。400MWh之后,储能SOC约束的对偶乘子已经趋近于零,说明储能不再是弃风的瓶颈约束,系统真正的瓶颈变成了火电最小出力和线路传输能力。

这个现象在报告里非常重要。它说明“储能不能无限解决消纳问题”,一旦储能容量超过消纳瓶颈的对应值,再增大容量的边际收益趋近于零。如果你面对的决策问题是“储能配多大”,不要只看平均弃风率,要看对偶乘子何时归零——这个点就是经济上的储能容量上限。

5. 建模和求解中我踩过的几个坑

5.1 罚因子数量级不匹配,结果完全跑偏

第一次搭这个模型时,我把燃料成本单位设成了万元/MWh,弃风罚因子顺手写了个600,单位还是元/MWh。结果模型算出弃风率为0,储能充满后又放空,反复循环,看起来“完美消纳”,实际上是把罚因子和燃料成本放到了一个错误的量纲对比下——罚因子显得太贵,优化器宁可让火电压到极限也要多消纳。后来养成了习惯:所有单位先统一再进模型,燃料成本用元/MWh,罚因子用元/MWh,容量用MWh,功率用MW。单位不统一,数值再对也没用。

5.2 SOC初值处理不好,多日滚动全是“白给”

做单日24小时分析时,SO0初始值的影响很大。如果把初始SOC设成0.5,日终不考核SOC,模型会倾向于把SOC放到底——因为放电收益曲线在夜间低谷和高高峰之间的电价差是正的,储能没有理由留着电量不用。这在单日分析里勉强说得过去,但做全年8760小时连续模拟时就会出问题:第一天之后SOC早就在下限附近徘徊,储能的灵活度被高估了。

解决办法有三个:一是加循环约束 SOC_T ≥ SOC_0,要求一个调度周期结束时SOC不低于初始值;二是给终值SOC一个软约束,在目标函数里加一个小的惩罚项;三是做多日滚动,把前一天的SOC结果作为后一天的初始状态。三种做法各有适用场景,但核心只有一个——不能让储能“免费”消耗初始存电量,否则算出来的经济性会虚高。

5.3 线性化分段数不是越多越好

我在2.1里提过增量成本法,这里补一个具体的误差数据。同样是两台机组24时段的模型,煤耗二次函数用4个分段线性化,总成本相对精确值的误差约1.2%;用12个分段,误差约0.2%;用20个分段,误差降到0.1%以下,但模型规模大了近一倍,求解时长增加了70%。做日常消纳影响评估,分8到12段足够,过剩的精度只会浪费你的调试时间。

另外一个隐蔽问题是线性化分段点分布。如果机组出力范围是200MW到600MW,你把分段点均匀地放在200、300、400、500、600,结果误差分布是均匀的;但如果你只在低负荷区加密分段,中高负荷区稀疏,模型会对低负荷区过度敏感,高负荷区失真。分段点的布置要和目标函数曲线的“曲率”匹配,曲率大的地方多切几段。

5.4 时间分辨率:15分钟和1小时算出来是两回事

用1小时分辨率做出来的弃风率,通常比15分钟分辨率偏低。原因是风电的瞬时波动在1小时内被平均掉了,那些“小时平均风较大、但瞬时风很小”的时刻被掩盖了。我做过一个对比测试:同一组风电原始数据,15分钟分辨率下弃风率12.8%,聚合成1小时数据后变成10.5%,整整差了2.3个百分点。这个偏差在消纳能力评估里是足以改变结论的。

如果数据源只有小时级,一个折中做法是给风电出力曲线叠加一个基于历史统计的波动扰动,但这本质上是在“造数据”,适合做趋势敏感性验证,不适合做最终结论。真正要对外发布的分析结论,我建议至少做到15分钟分辨率,爬坡类约束和大规模储能响应行为只有在这个尺度下才能看得清楚。

5.5 对偶信息异常时的归因思路

最后说一个容易被忽略的技巧:模型求解后不要只看目标函数值和弃风率,顺手看一眼所有约束的对偶乘子(影子价格)。在储能容量约束的乘子异常大的时候,说明系统对储能的边际需求很高,增加储能容量的收益明显;如果功率平衡约束在某个时段乘子突然跳跃,说明那个小时是系统最脆弱的时段,储能应该优先在那个时段放电。

有一次我发现功率平衡约束的对偶乘子在凌晨3点出现了一个极大值,顺着数据往下查,原来那个时段风电预测出力有一处尖峰突增,火电爬坡约束已经拉满,系统几乎全靠弃风来维持平衡。这个现象光看SOC曲线和弃风率完全看不出来,但对偶乘子直接暴露了瓶颈时段。从那以后,我的仿真报告里都会附一张“关键时段对偶乘子分布”表,标注哪些时段系统最紧张,比单纯堆“平均弃风率”直观得多。

做储能接入分析这两年,我最深的体会是:模型本身不难,难的是每个参数背后有没有物理依据。目标函数里的罚因子、约束里的效率系数、SOC的初值,这些看起来不起眼的小数点,最终决定了算出来的是“能落地的方案”还是“纸上谈兵的漂亮曲线”。如果你也在搭类似的模型,建议先从一个小规模但单位严谨的算例开始,跑通之后再慢慢加复杂度,每一步改动都盯住总成本和弃风率的变化方向,方向不符就停下查。这个思路帮我避开了至少一半的模型错误,应该也能帮你省下不少调试时间。

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询