今天是农历腊月二十八,我坐在调度大厅里看着大屏幕上的负荷曲线发呆。光伏出力正在快速往上爬,而风电场因为夜间低温满发,整个上午的风光总出力预计会冲到系统负荷的45%以上。旁边的值班长嘀咕了一句:“今晚谷段又要压火电厂出力了,再压就要深调了,机组受不了。”这句话放在过去十年,根本不值得拿出来说——那时候调峰就是调度往下发指令,火电机组老老实实跟着走。但今天不一样了,新能源装机占比到了三成以上,净负荷的峰谷差越拉越大,你光让火电硬顶,顶不动;你再让水电只作为“被动跟随者”,它也跟不上现代调峰的节拍。
这个项目标题“计及调峰主动性的风光水火储多能系统互补协调优化调度”,说白了就是解决上面这个真实痛点:让风电、光伏、水电、火电、储能这些不同电源不再各自为战,而是通过一个统一的优化调度模型协同出力,并且最关键的一点——把“调峰主动性”作为一个正式变量和收益项写进模型里,而不是让火电和储能被动接受调度指令。
这篇文章我会从问题拆解、建模思路、求解方法、典型算例到实操避坑,把整套做下来需要的东西都讲透。做电力系统优化调度研究的研究生、电网调度和新能源场站的技术人员,以及刚开始接触“多能互补”方向的人,都能在这篇里面找到可以直接抄作业的部分。
1. 项目背景与需求拆解
1.1 电网调峰压力到底从哪里来
先捋一捋调峰压力的根源。系统负荷一天之内有峰有谷,比如冬夏两季的负荷峰谷差常常在40%-50%之间波动。过去火电为主力电源,负荷高就多烧煤,负荷低就压煤,只要旋转备用够,调峰问题并不尖锐。
但现在的情况变了。新能源装机比例持续上升,光伏午间大发、夜间归零,风电夜间大风、白天小风,这种出力特性和负荷走势往往错开——负荷高峰在夜晚或午间,光伏反而在午间冲击系统;负荷低谷在凌晨,风电却经常在凌晨满发。这种“反调峰特性”直接让净负荷(系统负荷减去风光出力)的峰谷差进一步放大。
更棘手的是,火电的调峰潜力已经挖得差不多了。常规火电机组最小技术出力通常要维持在额定容量的50%左右,供热机组的调峰能力更弱,冬季“以热定电”时最小出力可能只能压到70%。你让火电往下压,压的是煤耗、是寿命、是安全裕度;你让火电频繁爬坡,它可能一天之内就得从300MW爬到600MW再压回300MW,机组疲劳和辅机故障率都会显著上升。
这时候水电和储能就应当顶上。但水电受来水条件、生态流量、水位限制约束,不能像火电那样随心所欲;储能响应快但容量有限,不能当作无限调节池用。所以问题的本质就变成:在一个含风光水火储的复杂系统里,如何让不同调节特性的电源按照各自的“意愿”和“成本”合理分工,在最小化系统运行成本的前提下满足调峰要求。
1.2 “调峰主动性”是个真变量,不是个口号
我最想强调的是标题里“调峰主动性”这五个字。很多人做多能互补优化,还是把火电、储能、水电当成一群“听命令”的机组,给定了上下限和爬坡率,让优化模型去分配功率就行。但实际操作中,你会发现一个关键现象:火电深度调峰每多压一兆瓦,机组煤耗、寿命损耗和辅机风险都在上升;储能每多循环一次,电池寿命就有损耗。这些资源不是没有调峰能力,而是“调峰有成本、参与有意愿”的问题。
“计及调峰主动性”就是把这种成本和意愿显式地放进模型。比如火电在正常技术出力区间内运行,成本是常规煤耗成本;一旦进入深度调峰区(低于最小技术出力),我给它增加一个“深度调峰损耗补偿成本”——这个成本直接反映机组在低负荷区运行的额外损耗。储能则按照循环次数折算成本,每次充放都计入寿命损耗。这样一来,模型在优化时会自动权衡:是让火电继续深调更便宜,还是调用储能、水电更划算。
这个思路的另一个好处是提高了系统的“可解释性”。你不只是在做一个数学优化,你是在用经济信号引导各类电源主动参与调峰。你要让一个火电机组深度调峰,你得告诉模型它要付出什么代价;你要让储能顶上去,你得告诉模型它值不值这个循环寿命损耗。我在实际项目里验证过,把调峰主动性计入了优化模型后,火电深度调峰时段明显减少,储能利用次数也变得更集中、更合理,系统总成本反而下降了几个百分点。
2. 系统建模与关键技术点分析
2.1 五类电源的互补特性与角色划分
建立模型之前,先把“风光水火储”五类电源各自的特点摸清楚。它们在不同时间尺度上的互补关系,决定了模型的结构设计。
我习惯用一张表格把五类电源的互补性列出来,这也是项目方案论证阶段最常拿出来的材料:
| 电源类型 | 时间尺度 | 可调度性 | 调节速率 | 主要约束 | 调峰主动角色 |
|---|---|---|---|---|---|
| 风电 | 15min-6h波动 | 低,靠预测 | 不可控 | 出力上限、爬坡限制 | 需消纳对象,可弃风降出力 |
| 光伏 | 日内强波动 | 极低 | 秒级突变 | 出力上限、预测误差大 | 需消纳对象,可弃光 |
| 水电 | 分钟-日调节 | 较高 | 快 | 水量平衡、生态流量、水位 | 主动调峰主力之一 |
| 火电 | 小时级 | 高 | 中/慢 | 最小出力、爬坡、启停 | 主动调峰主要成本方 |
| 储能 | 秒-小时级 | 很高 | 极快 | SOC、充放次数、功率上限 | 快速调峰、平抑波动 |
从这张表能直接看出:风光出力是不可控的,调度上只能通过“弃风弃光”来降出力;水电和储能响应快,适合做日内调节;火电调节范围大但速度慢、成本高,适合做基底和深度调节。多能互补的核心,就是让“快”的电源去对付快波动,“慢”的电源去扛大趋势,最终由调度模型来统筹分配。
2.2 调峰主动性的量化建模方法
这是整个项目的灵魂。调峰主动性不是一句口号,它需要翻译成数学模型里的变量和约束。我的做法主要分三步。
第一步,给火电的调峰定义“角色区间”。设火电机组额定出力为P_max,最小技术出力为P_min,深度调峰极限出力为P_dp(一般取P_min的60%-80%)。当机组出力位于[P_dp, P_min]之间时,我认为它处于“主动深度调峰”状态,此时额外产生一个与调峰深度成正比的附加成本项。
第二步,定义调峰参与度指标。用一个0到1之间的值表示机组当天的调峰参与水平。可以定义成:
调峰参与度 = 实际调峰电量变化量 / 最大可调电量变化范围这个指标不需要写进求解过程,但很适合作为后处理评估指标。我在项目报告中经常用它来横向对比不同机组的贡献度,调度员能一眼看出“谁在主动出力、谁在消极应付”。
第三步,也是最重要的一步,把主动性转化为经济信号。储能考虑循环寿命损耗成本,每次深度充放电折算成本;火电深调区加惩罚项;水电根据日前的来水和预测负荷设置“主动调峰意愿因子”——比如在电网负荷落山时段,如果水电还有调节库容,模型会自动倾向于让水电多顶一段负荷,而不是让火电继续高负荷运行。
这样“调峰主动性”就真正进入了优化模型的目标函数,变成影响调度决策的实体变量。
2.3 多能互补协调调度的整体架构
调度策略上,我不建议一次性做超长时间尺度的全局优化。工程上最稳的结构是“日前计划+日内滚动+实时调整”三层架构。
日前计划以日为单位,采用15分钟或1小时分辨率,给定风光出力预测和负荷预测,优化全天96点或24点的各机组出力计划。日内滚动调度每2-4小时滚动一次,用最新的预测数据更新未来4-8小时的调度计划,修正日前预测误差的影响。实时调整依靠AGC(自动发电控制)或者其他快速控制手段,应对分钟级波动。
这个架构的好处是:模型规模可控,预测信息的时效性也能抓住。我之前见过有人试图做一个“全年8760小时的超大规模多能互补优化”模型,结果数据准备和求解时间都爆炸了,最终很难落地。实际运行中没人会用一个全年最优的计划去指导下个时刻的操作,三层滚动是更符合工程现实的。
3. 优化调度模型与求解方法
3.1 目标函数设计:从单一成本到多目标协同
模型的目标函数是整个项目的心脏。我采用“系统综合运行成本最低”作为主目标,同时将新能源消纳量、调峰资源利用情况通过成本惩罚项折算进目标。
目标函数的主体结构可以写成:
min F = Σ(火电燃料成本 + 火电启停成本 + 火电深度调峰补偿成本) + Σ(水电运行成本) + Σ(储能寿命损耗成本 + 储能循环调用成本) + Σ(弃风弃光惩罚成本) + Σ(系统失负荷惩罚成本)逐项说明。火电燃料成本采用分段线性成本函数,不同出力区间煤耗率不同;启停成本计入机组从冷态启动到并网全过程的热应力损耗,防止模型为了省钱频繁启停机组。深度调峰补偿成本就是前面调峰主动性的量化体现——机组每进入一次深度调峰区,补偿成本就会上升,模型则优先寻找其他成本更低的调节手段。
储能寿命损耗成本我参考了常用的对数循环损耗模型,在工程实践中简化为每MWh充放电量对应的等效循环损耗成本。这个简化虽然在学术界会被诟病“不够精细”,但工程中数据可得性强、计算量小,实测效果也很好。
弃风弃光惩罚成本的系数取值需要反复校准。设太低,模型会为了省钱毫不客气地弃掉大量新能源;设太高,模型又会不惜成本让火电压到极限甚至虚构调节能力来消纳风光的每一度电。我的经验是:以系统综合度电燃料成本的8-15倍作为弃电惩罚的参考值,再根据实际消纳率目标调整。这样既不会过度强迫消纳,又能体现新能源优先调度的方向。
3.2 约束条件体系:把物理规律写清楚
目标函数定了之后,约束条件决定了模型算出来的是不是一个能用的电网运行方案。这一部分最考验功底——约束太松,结果离谱;约束太紧,模型可能直接无解。我按以下几个方面逐一说明。
功率平衡约束是最底层的约束。每个时段所有电源出力的总和必须等于系统负荷与储能充放电功率之和。这个约束一旦被轻微违背,模型就会给出一个虚假的“补电”行为,必须作为硬约束严格保证。
各机组运行约束方面,火电需要设置出力上下限、最大爬坡速率、最小运行/停机时间。特别注意最小运行/停机时间约束不能设置为0,否则模型会高频启停机组来“投机”——这在数学上可行、工程上完全不可接受。水电需要设置出力上下限、日可用水量约束和库容动态约束;风电和光伏设置出力上限约束,并在约束中允许“弃风弃光”,但要在目标函数里付出惩罚成本。
储能约束稍微复杂一些。除了SOC动态方程外,还需要设置充放电功率上限、SOC上下限,以及充放电互斥约束(同一时段不能同时充电和放电)。充电和放电同时为正的状态在物理上不可能出现,但在数学模型中如果不显式加互斥约束,就容易出现“储能既给负荷供电又接受充电”的荒谬结果,白白浪费容量。
系统备用约束同样关键。我一般把旋转备用设置为系统负荷的3%-5%加上最大单机容量的一个比例,还要额外考虑新能源出力的不确定性备用,例如取风光预测出力的一定比例作为备用需求。这个备用约束如果缺失,当预测出现偏差时系统会失去平衡恢复能力。
3.3 为什么选MILP而不是启发式算法
很多初接触这个方向的人喜欢用粒子群、遗传算法等启发式算法来求解调度模型,理由是“实现简单、不要求凸性”。但我的实际经验是:除非你处理的系统真的小到不需要考虑最优性,否则我强烈建议你优先采用混合整数线性规划(MILP)建模并用商业求解器求解。
原因是多方面的。首先,电力系统调度模型中的变量天然是混合的——火电启停是0-1整数变量,储能充放电状态是0-1整数变量,而功率输出是连续变量,这个结构天然适合MILP建模。其次,MILP求解器(如CPLEX、Gurobi)能给出全局最优解的可达性证明和最优性间隙(MIP Gap),这让调度结果有说服力;而启发式算法只能给出一个可能不错的可行解,你没法告诉调度员“为什么是它”。
第三,我实测对比过:一个包含20台火电机组、10个水电单元、2个储能电站的日前调度模型,变量约3万个、整数变量约4000个,用Gurobi在默认参数下一般能在30秒内得到一个MIP Gap小于1%的可行解。而用粒子群去跑同一个模型,稳定性和可复现性都要打折扣。
求解器参数方面有几点经验。MIP Gap我一般设成0.5%-1%,太小的Gap会让求解时间指数上升,实际工程中没必要死磕到0.01%。CPLEX和Gurobi都可以设置多个线程并行计算,我有一次把线程从1加到8,求解时间直接缩短了70%。如果模型依然很大,可以用时间分层或滚动优化去分解,而不是盲目增加求解器的计算上限。
4. 算例设置与结果分析
4.1 测试场景与数据准备
为了验证模型的效果,我搭了一个典型的区域电网简化算例。系统总装机约5000MW,包含4台600MW火电(其中1台为供热机组)、水电1400MW、风电1800MW、光伏1200MW、储能200MW/400MWh。负荷峰值约5200MW,谷值约2600MW,典型日负荷曲线参考某实际电网冬季典型日归一化数据。新能源出力和负荷预测曲线都用实测数据做基础再添加一定幅度的预测误差模拟。
调度周期选日前24小时、15分钟一个时段,共96个时段。这样既足够精细地反映储能和社会负荷的日内波动,又不至于把模型扩大到难解的程度。
我设置了三个场景做对比:
- 场景一:纯火电调峰(不考虑多能互补、不考虑调峰主动性)
- 场景二:多能互补协调调度,但不计及调峰主动性的量化成本
- 场景三:完整模型,计及调峰主动性的多能互补协调调度
这样三个场景一套跑下来,可以清晰分离出“多能互补”和“调峰主动性”各自带来的改进。
4.2 三类场景的关键指标对比
跑完三个场景后,我把关键调度指标汇总成一张对比表。需要说明的是,以下数值是基于这个算例环境得到的相对趋势,具体数值会随系统结构变化,但整体结论在多个案例中保持了稳定。
| 指标 | 场景一(纯火电调峰) | 场景二(不计主动性) | 场景三(计及主动性) |
|---|---|---|---|
| 系统总运行成本(万元) | 385 | 359 | 342 |
| 弃风弃光率(%) | 12.6% | 7.2% | 4.1% |
| 火电深度调峰时段数 | 32 | 18 | 9 |
| 储能循环利用次数 | 1.2次/日 | 2.4次/日 | 3.1次/日 |
| 系统峰谷差(MW) | 2350 | 1980 | 1730 |
从表里能直接读出几个关键结论。首先,纯火电调峰毫无疑问是最贵的:火电反复深调和爬坡,煤耗高,还得频繁启停,弃风弃光也最严重。其次,不考虑调峰主动性的场景二虽然总成本比场景一低,但它对储能的利用太“随意”——一天循环2.4次,很多充放电是无序的浅充浅放,火电依然有18个时段硬着头皮去做深度调峰。
场景三加入调峰主动性之后,调度模型开始精打细算:火电深度调峰的时段从18个降到9个,储能循环次数上升到一天3.1次且分布更集中、更规律,系统峰谷差也被进一步压缩。总成本在场景二的基础上又下降了约4.7%,弃风弃光率降到4.1%。
4.3 调峰主动性如何影响运行曲线
我特意把场景二和场景三中典型日的火电出力曲线拉出来对比。场景二的火电出力曲线呈现明显的“锯齿状”——每隔2-3个时段就有一个明显的爬坡再降回来,这是因为模型没有量化深调成本,反正压下去不用付出代价,索性把火电当成一个“无限调节”的电源来用。
场景三的火电出力曲线则平滑很多:夜间风电大发时段,调度模型主动调用储能在谷段充电,同时让水电压负荷,火电不是简单压到最低出力,而是保持在一个相对经济且稳定的出力水平;到了午间光伏大发时段,储能放电、水电爬升,火电则提前一个时段降低出力,整个过程“提前响应、平滑过渡”。
这就是调峰主动性对调度行为的直接影响:调节资源不再被动地“被压、被顶”,而是根据各自的成本信号主动选择在最合理的时刻、以最合理的深度参与调峰。
5. 实操经验与常见问题排查
5.1 建模阶段容易踩的坑
做这类调度优化项目,建模期最容易翻车的几个问题我挨个说一遍。
第一个坑是量纲不统一。负荷、光伏、风电单位用MW,燃料消耗用吨,储能容量用MWh,价格用元/MWh,目标函数里如果要相加,全部要折成统一的货币量纲。我见过有新手把弃风惩罚的单位设成了元/MW而不是元/MWh,导致惩罚成本虚高一个数量级,模型宁可花几倍的燃料费去消纳新能源。这种错误非常隐蔽,要在建模完成后做量纲检查矩阵逐项核对。
第二个坑是储能SOC初始值不合理。如果初始SOC设太高,模型会在前几个时段用储能“补贴”负荷,末端SOC却放空到下限以下;初始SOC设太低,储能从头到尾充不满,白白浪费调节能力。我的做法是引入“首末SOC一致性约束”,让SOC初值等于末值,再额外给一个初始SOC的实际变量参数。这样模型可以自主寻优首末值,不会出现首末割裂的问题。
第三个坑是火电最小运行/停机时间约束被忽略。很多初版模型只设置了启停成本和爬坡约束,结果求解结果中机组频繁启停——因为启停成本可能比持续低负荷运行省煤,但真实机组的机械损耗远远不是这个数学成本能覆盖的。务必把最小运行时间和最小停机时间以硬约束形式加入模型。
第四个坑是新能源预测误差的“侥幸”。直接用预测曲线做调度计划当然简单,但调度计划要有抗偏差能力。我建议在日前模型中预留旋转正备用,最小要覆盖风光预测出力误差的10%-20%,否则预测一偏,实时调度直接就崩了。
5.2 求解阶段效率问题
模型建好之后,求解器经常给你找麻烦。最常见的报错就是“无可行解”。出现这种情况,我的排查顺序是:先把备用约束、储能SOC约束、最小启停时间约束这些“软一点”的约束逐条松绑,看看放掉哪条之后模型就能解了。
Gurobi和CPLEX都有不可行性分析工具(IIS),能直接指出不可行约束的最小集合,这个功能一定要会用。我第一次被无可行解卡住时,花了两天手动猜约束,后来发现只是联络线功率约束和储能充电功率约束在某个时段互相冲突,IIS三秒钟就找出来了。
求解时间过长是另一个高频问题。模型规模一旦超过几万个变量,求解器经常需要大量分支定界搜索。我的经验是:不要把所有的物理细节都塞进一个MILP模型里。比如水电站内部机组启停组合问题,可以放到后处理阶段用启发式规则分配,不要和主调度模型耦合在一起;某些非线性关系也尽量分段线性化,避免引入大量二进制辅助变量——二进制变量数量是MILP求解时间的“头号杀手”。
如果确实需要处理超大规模问题,可以试试先求解一个24点日内调度模型(每小时一个时段),把整数变量固定下来,再按固定结果拆分,做15分钟96点的小型滚动优化。这样算出来的结果与全天96点统一优化差距在2%-3%以内,但求解时间可以缩短一个数量级。
5.3 结果合理性校验的经验
模型算完不等于项目结束。结果出来之后,我最常做的校验动作是“看图做题”——把每个典型时段的风光出力、火电出力、水电出力、储能充放电功率、负荷曲线叠在一起画成时序图,人工逐段检查。
你会发现光看表格指标根本发现不了的问题。比如有一次我的结果指标很漂亮——总成本降了、弃风弃光率低了、储能循环次数也适中——但把时序图拉出来,发现有一台火电机组在中午光伏大发前的半小时突然停机了,下午又突然启动。从成本指标看这好像“合理”,但实际上这种频繁启停在真实调度中根本不会有人批。
针对这个现象,我在后处理环节专门加了一个自动校验规则:检查所有机组逐时段的状态变化次数和出力跳变幅度,凡是出现短期频繁启停或出力抖动超过工程允许范围的时段,自动标红。这一步在项目汇报的时候特别有用,调度中心的老法师一看你连这种细节都盯住了,对你的模型信任度会高一大截。
另外要养成“对比基态”的习惯。每次跑一个新方案,先跑一个只含火电的基态调度,作为参照基准。两个方案对比时,哪个指标变化、变化率多少、哪里变化不合理,一目了然。我也会把不同场景下每台机组的出力曲线分别画出来纵向比较,这比只比较汇总表格更有说服力。
6. 最后一点实际体会
做了几个区域调度优化的实际项目之后,最深的体会是:模型不是越复杂越好,越复杂的模型越需要清晰的经济物理逻辑来支撑每一个新增的变量和约束。“调峰主动性”这个概念,听起来有点虚,但真把它落到“深调补偿成本”“储能寿命损耗成本”这些具体的成本项上之后,调度行为确实发生了质的变化,火电不再被当成一个无代价的调节工具,储能也不再被无差别调用,整个系统多能互补的格局是真的活起来了。
我对刚开始做这个方向的人有一个建议:先不要急着上全风光水火储的大模型,从一个小系统、几台机组、单一时间尺度开始,跑通一遍完整的建模仿真流程,再去扩展规模和复杂度。等你熟练了就会发现,做这类优化调度项目,最花时间的其实不是求解,而是处理数据、校验约束、解读结果这三步。
附带一个很实用的小技巧:做多场景方案对比的时候,建议把所有调度结果统一导出成相同格式的时序表,再用同一个脚本批量生成对比图。这个习惯能帮你节约大量重复整理的时间,也更方便你事后翻看每个方案的异常时段,发现很多藏在表格指标背后的隐蔽问题。