资讯动态

计及调峰主动性的风光水火储多能互补调度与Matlab实现

发布时间:2026/10/14 6:20:07 来源:尧图企业网站定制
风光水火储多能系统互补调度是我这些年接触过的电力系统优化课题里最常被问到的一类。很多人拿着题目时第一反应是“把五类电源写进目标函数加约束跑一个优化就完事”但真正动手之后才发现模型写出来容易能复现出合理的调度结果却是另一回事。尤其是标题里“计及调峰主动性”这几个字如果不先想清楚它到底在描述什么物理过程和管理逻辑后面所有代码都只是在数字上做排列组合。这篇内容我打算从问题源头开始讲清楚为什么传统调峰模式在高比例新能源面前越来越吃力再逐步拆解“调峰主动性”如何落到数学模型和Matlab代码里最后给出一个可以直接参考的建模框架、代码骨架、算例设计和实操避坑清单。适合正在做多能互补优化调度课题的研究生、刚接触电力系统调度算法的工程师也适合打算用Matlab做论文复现但被各种论文公式绕晕的人。1. 调峰困局为什么“被动调峰”模式已经顶不住了1.1 传统调峰机制的天然短板在传统电力系统里调峰这个概念很简单负荷高了多开机、负荷低了压出力。承担这个任务的绝大多数时候是火电机组因为水电受来水影响、核电几乎不参与日调节、风光的占比当时又太小。这种运行模式下负荷曲线是系统的“指挥棒”机组属于“源随荷动”只要调度员给指令机组就跟着调。这个方法在负荷相对平稳、电源结构单一的年代确实够用。但它的短板也很明显火电的调节能力是有物理边界的不是想调多快就多快、想压多低就多低。特别是供热期的热电联产机组电出力还受热负荷牵扯深度调峰会让锅炉燃烧稳定性变差甚至面临灭火风险。这些限制在源荷两侧都比较确定的年代可以被忽略因为大家都会预留充足的旋转备用。可一旦新能源渗透率上来场面就完全不同了。风电出力的反调峰特性、光伏出力的日内剧烈波动会让系统净负荷曲线变得又陡又毛糙。这时候再用“哪台机组调一下”的思路解决问题就会出现一个很尴尬的局面调度员手上能调的机组就那几台新能源限电和火电深调同时加剧两边都不满意。1.2 新能源高渗透率下的反调峰矛盾风电和光伏出力有几个让调度员特别头疼的特性。风电往往在夜间负荷低谷期出力反而很大这就是典型的反调峰特性夜间系统本来负荷就低风电再一顶上来多余的电力往哪送都是问题。光伏则是白天出力高峰与午间负荷之间勉强能配合但到了傍晚负荷快速攀升时光伏出力却在快速归零导致净负荷曲线出现一个非常陡的“爬坡悬崖”。这两类波动叠加到火电身上机组就需要在很短的时间内频繁调节出力、甚至频繁启停。每次启停都有不小的煤耗和磨损成本频繁变负荷还会加速金属部件的疲劳损耗。储能在这个阶段虽然能帮忙但容量有限社会面上储能投资也要算经济账不能指望它无限度地兜底。于是越来越多的人意识到系统调峰不能再是“几个电源被动接指令”的机械过程而是需要所有可调节资源都主动参与、协同配合的行为。这个思想上的转变就是“调峰主动性”出现的直接背景。1.3 调峰主动性的提出到底是想解决什么调峰主动性的核心内涵我理解下来有三层。第一层是时间上的主动机组不再等到调度指令下达才动作而是根据预测数据提前规划出力轨迹把爬坡过程摊到更长的时段里。第二层是空间上的主动系统里所有具备调节能力的资源都被纳入协调范围水电、储能、甚至可调节负荷都来分摊调峰压力而不是让火电单打独斗。第三层是策略上的主动调度目标不只看本时段的成本还考虑整个调度周期内的机组状态、储能荷电状态、清洁能源消纳程度相当于在更长的时间轴上做全局统筹。把这三层落到调度模型里就不再是“最小化成本基本约束”这么简单了。我们需要在目标函数里体现调节代价、在约束条件里刻画主动性指标、在求解框架里让模型同时兼顾经济性和可执行性。接下来我就从系统成员的角色分工讲起把模型该怎么搭、代码该怎么写一条线捋清楚。2. 风光水火储互补系统每个成员的脾气与分工2.1 五类电源的特性剖面与互补逻辑搞多能互补调度之前建议先给系统里的每个成员画个“特性画像”。我用一个表格把常见参数整理了一下这些数据在做算例设计时会反复用到。电源类型出力特性调节速率调节深度运行约束特征在系统里的角色风电反调峰、波动大不可控不可控受预测误差影响大优先消纳对象光伏昼出夜伏不可控不可控中午出力尖峰优先消纳对象水电调节快、启停灵活快较深受来水和库容约束快速调峰主力火电出力稳定慢中浅到深最小技术出力、爬坡、启停时间基荷与调峰兼顾储能双向调节极快全范围SOC连续变化、充放电次数受限时段搬移与爬坡缓冲互补逻辑的核心是“错峰”。风电半夜大发时储能充电、水电压低出力、火电适当压负荷白天光伏出力大时储能充电、火电维持基荷傍晚光伏快速退坡储能放电、水电顶上来火电逐步爬坡支撑晚高峰。这样安排系统净负荷曲线就被摊平了单台机组的调节压力也降下来了。2.2 调峰主动性的量化抓手聊“主动性”不能只停留在概念层面得放到模型里能算。我在做这类课题时常用四个量化指标来刻画主动性。第一个是可调容量参与率。机组参与调峰的实际出力范围占其理论可调范围的比例参与率越高说明机组在主动让出调节空间。第二个是爬坡提前量。机组实际爬坡时刻与调度要求爬坡时刻之间的时间差提前量越大说明机组响应越从容而不是被“逼”着陡坡调节。第三个是调节深度比。机组当前出力偏离额定出力的程度持续处于过深调节状态的机组的“主动性成本”会在模型里被惩罚。第四个是储能SOC带位置。储能电荷状态在调度过程中的变化轨迹是否保持在合理区间避免在需要它发力时已经没电了或者没空间充电。这四类指标可以放进目标函数的惩罚项也可以放进约束条件限定边界。灵活用起来模型对“主动性”的描述就会立体很多而不是只在论文摘要里喊口号。2.3 互补协调调度的时间尺度设计时间尺度的选择直接影响模型规模和求解难度。目前常见的有三种层次。日前调度以小时为间隔一天24个时段用于确定各机组的开机组合和基线出力计划。日内滚动调度以15分钟或5分钟为间隔根据最新预测修正日前计划主要用来应对风光预测偏差。实时自动发电控制AGC则以秒级到分钟级为单位负责跟踪秒级负荷波动和频率质量。如果标题里的“优化调度”没有特别指定时间尺度我一般建议论文复现或工程验证先做日前24时段调度原因很现实数据容易构造、模型规模适中、Yalmip加商用求解器几分钟就能出结果而且日前的出力计划和主动调峰效果已经从曲线图上看得非常直观。等日前框架跑通之后再往日内滚动扩展也不迟。3. 优化调度模型的核心建模目标、变量与约束的完整框架3.1 决策变量与调度周期模型的第一步是把决策变量定义清楚。以24时段日前调度为例常规决策变量包括火电机组各时段出力、机组启停状态、水电出力、储能充放电功率与SOC、系统联络线功率条件允许的话还可以加入弃风弃光变量让模型在“不得不弃”时有一个带惩罚代价的通道。这里有个容易走偏的地方很多初学者会把风电光伏出力直接当作决策变量扔进优化模型这是不严谨的。风光的“可发功率”来自预测场景是模型输入参数调度能做的是决定“实际使用多少、弃掉多少”而不是去优化大自然产出的功率。把输入和决策分开模型语义才正确结果解释起来也不容易出逻辑问题。3.2 目标函数不只是成本最小纯经济调度目标并不是所有场景的最优选择尤其在计及调峰主动性的模型中目标函数建议设计成多组分加权形式。一种比较通用的写法是min F Σ_t ( C_fuel(t) C_start(t) C_env(t) C_ess(t) C_curtail(t) C_penalty(t) )其中C_fuel是煤耗成本用机组出力的二次函数近似C_start是启停成本只在机组状态发生切换时产生C_env是碳排放或污染物排放成本C_ess是储能充放电循环损耗折算成本C_curtail是弃风弃光惩罚成本C_penalty是调峰主动性惩罚项用于对持续深度调峰、爬坡过急的行为施加压力。有点需要注意各成本项量纲虽然都是元但数量级可能差好几个数量级。煤气耗成本动辄数万储能损耗可能只有几十如果权重不调小量纲项基本不发挥作用。这时就需要做归一化或者设计权重系数让模型真正“看见”每一项。3.3 约束体系把“物理极限”和“主动性”同时写进模型约束条件的设计是整个模型的地基少了哪一块都会让解失去工程意义。我按几大类递进着说。第一是功率平衡约束。每个时段的电源总出力加上储能放电、减去储能充电要等于负荷需求。这条约束一旦不平结果肯定是错的。执行时用等式约束建议在赋值前检查各时段负荷曲线维度与电源数据维度是否一致这是代码里最常见的低级错误来源。第二是火电机组运行约束包括出力上下限、爬坡速率限制、最小启停时间和最大启停次数。要想让结果在实际电网里站得住脚最小启停时间一定不能省略否则模型会让机组每小时启停一次来“投机取巧”地降低成本这在物理上行不通。第三是水电约束。水电站出力受最大最小出力和日电量约束限制有些场景还要考虑上下游水力联系和水头变化。简化处理时只保留出力上下限和日总电量约束即可但必须在文档里写清楚这是简化假设否则审稿人容易挑毛病。第四是储能约束。包括充放电功率上下限、SOC上下限、充放电状态互斥约束、以及调度周期首末端SOC连接约束。其中首末SOC连接很关键如果不设置模型极可能把储能SOC架构优化成一个“只放不充”或“只充不放”的非常规轨迹结果虽然满足功率平衡却没有任何实际复用价值。第五是调峰主动性相关约束。比如火电爬坡约束比物理极限留出一定裕度或者对深度调峰状态设置持续时间下限再或者对爬坡事件设置平滑性约束。这些约束没有统一标准要根据算例需求和模型行为反复调整。3.4 调峰主动性如何进入数学模型为了让主动性真正“嵌入”模型我常在目标函数里加这样一个惩罚项当火电某时段出力低于某个深度调峰阈值时进入深度调峰状态此时单位出力的计算成本自动上升同时设置最小持续时间要求机组一旦进入该状态必须至少保持若干时段。还有一个常用的做法是给爬坡项加“斜坡率惩罚”爬坡越急、惩罚越大这样模型就会主动把机组的负荷转移分散到多个时段呈现出“提前爬坡”的主动姿态。这两招组合使用不需要引入特别复杂的非线性项就能让模型产生主动调峰的行为特征。如果想让“主动性”建模更有学术感也可以采用主从递阶结构主问题是系统层优化子问题是各电源基于自身状态和成本函数的自主响应通过KKT条件将下层问题等效转换到上层形成单层数学规划。这种双层建模在论文里比较“好看”但实现和调试难度明显升高新手建议先从惩罚系数法入手。4. Matlab代码实现从模型到可运行框架的完整路径4.1 建模工具选型Yalmip还是手写矩阵Matlab里实现优化调度路线基本分两条。一条是用Yalmip工具箱建模用Cplex或Gurobi求解另一条是手写约束矩阵直接调用linprog或intlinprog。我强烈推荐Yalmip没有之一。原因很直接Yalmip的符号化建模方式可以把人从“手动组装矩阵”的繁琐工作中解放出来直接写约束表达式可读性高而且结构化调试效率也高。比如定义一个二维变量直接写“x sdpvar(ngen, T)”就能用了换作手写矩阵需要把决策变量展成一维、再手动构造系数矩阵一个24时段含5类电源的模型误差风险会成倍增加。4.2 数据准备与参数初始化代码的第一步永远是“把数据准备好”。以典型的24时段日前调度为例我习惯把所有基础数据都放进一个结构体里管理包括负荷曲线、风光出力预测曲线、火电机组参数、水电参数、储能参数和各类成本系数。这样做的好处是后续写约束时引用清晰算例换数据也方便。随便列几条核心参数定义思路方便直接套用负荷曲线从典型日负荷数据读入单位MW数组长度为24风电预测出力归一化的单位容量出力乘以风电场装机容量生成一条带波动特征的曲线光伏预测出力根据时段设置一个“白天有出力、夜晚为零”的钟形曲线火电机组每台机组的额定出力、最小技术出力、爬坡速率、煤耗系数、启停成本储能额定容量、最大充放电功率、SOC上下限、初始SOC值得提醒的是很多初版模型跑出的结果出现“系统发电量远大于负荷”这种荒谬结论问题往往出在数据构造时单位不统一。建议一开始就在注释里规定全局单位我自己的习惯是功率用MW、电量用MWh、成本用元、时间用小时。4.3 核心代码骨架变量、目标、约束、求解下面给出一个能说明整体逻辑的代码骨架不追求完整工厂代码但结构上可以直接扩展。%% 参数定义 T 24; % 调度时段数 ngen 2; % 火电机组台数 Pw_max 300; % 风电场装机MW Ppv_max 200; % 光伏电站装机MW load_profile data.load; % 1xT 负荷曲线 Pw_forecast data.wind; % 1xT 风电预测(0~1归一化)*装机 Ppv_forecast data.pv; % 1xT 光伏预测(0~1归一化)*装机 %% 决策变量 Pg sdpvar(ngen, T); % 火电出力 u binvar(ngen, T); % 火电启停状态 Ph sdpvar(1, T); % 水电出力 Pc sdpvar(1, T); % 储能充电功率 Pd sdpvar(1, T); % 储能放电功率 soc sdpvar(1, T1); % 储能SOC含初始时刻 Pcur_w sdpvar(1, T); % 弃风功率 Pcur_pv sdpvar(1, T); % 弃光功率 %% 目标函数各项 fuel_cost 0; for t 1:T for g 1:ngen fuel_cost fuel_cost a(g) * Pg(g,t)^2 b(g) * Pg(g,t) c(g); end end start_cost ... ; % 由u的0-1切换产生 env_cost ... ; % 排放惩罚 ess_cost ... ; % 储能损耗 curtail_cost ...; % 弃风弃光惩罚 penalty_cost ...; % 调峰主动性惩罚 objective fuel_cost start_cost env_cost ess_cost curtail_cost penalty_cost; %% 约束条件 constraints []; % 功率平衡 for t 1:T constraints [constraints, sum(Pg(:,t)) Ph(t) Pd(t) - Pc(t) ... Pw_forecast(t) - Pcur_w(t) Ppv_forecast(t) - Pcur_pv(t) load_profile(t)]; end % 火电出力上下限与爬坡 ... % 水电出力上下限 ... % 储能功率与SOC递推 ... % 弃风弃光非负 ... %% 求解设置 ops sdpsettings(solver, cplex, verbose, 2, showprogress, 1); sol optimize(constraints, objective, ops);代码里有两处需要在正式版本里认真处理一是火电爬坡约束不能只看相邻时段出力差还得乘上机组运行状态u停机机组的爬坡约束要解锁二是储能SOC递推公式里Pc和Pd带效率系数充电电量要减去损耗再充进电池。4.4 结果提取与常见报错处理求解结束后用value()函数取出各决策变量然后就可以画图了。画图建议至少出三张坐标图电源出力堆叠图、负荷匹配图、储能SOC变化曲线图。第一眼先看功率平衡是否成立再看火电出力曲线是否出现“锯齿”状的不合理频繁调节这两点能快速判断模型写没写对。Yalmip求解报错主要集中在这几类情况。第一个是“No suitable solver installed”意思是没装对应的商用求解器或者没配好路径先检查Cplex或Gurobi是否已经addpath。第二个是警告“infeasible problem”说穿了就是约束太紧优先检查功率平衡约束对应的单时段总出力上限是否大于最大负荷。第三个是二次项报错煤耗成本二次式如果带有耦合项对求解器的支持范围有要求必要时把二次项线性化拆分。5. 典型算例设计与结果分析5.1 系统算例参数设计我拿一套典型的“2火1水风光储”算例来说明建模和结果分析的流程这套配置结构简单但五脏俱全。系统构成火电两台一台300MW作为基荷机组一台200MW作为调峰机组后者调节的主动性更强水电一座装机150MW风电场装机300MW光伏电站装机200MW储能系统容量100MWh最大充放电功率50MW。负荷曲线采用典型夏峰型早晚两个高峰午夜低谷。风光出力曲线不能拍脑袋随机生成否则结果没有说服力。我的习惯是风电用“夜间出力大、白天相对小”的反调峰曲线加随机波动光伏按季节日照时长生成钟形曲线。这样构造出来的净负荷曲线能在低谷段叠加出一个小“凹陷”让调峰矛盾真实暴露出来。5.2 有主动性 vs 无主动性的对比结果同样的系统参数分别跑“不含调峰主动性模型”和“含调峰主动性模型”对比会非常有意思。下表是我在模拟项目验证中拿到的代表性结果数值经过整理但趋势一致。对比项常规调度模型计及调峰主动性模型系统总运行成本万元182.4174.6火电深度调峰时段数94最大爬坡速率MW/h8552弃风弃光电量MWh5621储能SOC平均位置%3855联络线越限次数30看到这个结果我的第一感受是在主动性的罚项约束下火电机组虽然少了一些“激进压出力”的行为但总成本反而下降了。原因是深调带来的煤耗、磨损和启停损耗被分摊到更平滑的出力轨迹上储能和水电的调节作用也更充分地发挥了出来。弃风弃光量下降也符合预期因为主动性模型会提前安排储能充电和水电预留空间而不是让新能源在低谷期直接撞上硬约束。5.3 从调度结果反过来验证模型拿到结果不能马上结束得反过来“拷问”几轮。第一问功率平衡各时段是否严格满足误差是否在数值容差范围内如果不满足检查是不是加错了等式约束或漏了某个电源项。第二问火电爬坡约束是否在所有时段满足特别注意停机时段的约束有没有被错误置0导致重启瞬间出现不现实的巨幅出力。第三问储能SOC初值和末值是否相等如果不相等说明首末连接约束没写进去这样的SOC轨迹拿去和储能实际运行管理对比没有参考意义。第四问弃风弃光量和预测曲线的相关性如果弃光集中在夜间那显然说明模型把光伏曲线当成了24小时都有出力的曲线来分析数据预处理错误。这几轮检查做完模型才算是真的被验证过而不是只看了浮在表面的目标函数值在下降。6. 实操中真正值得注意的经验6.1 约束别一次写满从松弛开始递进开发模型时最忌讳一上来就把所有约束写得严丝合缝。我的习惯是先跑“只含功率平衡和出力上下限”的版本先确认基本框架能出解再逐步加入爬坡、最小启停、储能SOC、主动性惩罚。每加一组约束就观察目标函数变化和求解时间变化。这不仅是调试技巧更是一种模型理解方式——你能直观感受到每条约束对结果的“拉扯力”。6.2 求解器选择的隐性成本Cplex和Gurobi对混合整数二次规划的支持都不错但License不是人人都有尤其学生和刚参加工作的工程师。一个务实的替代方案是使用HiGHS求解器Yalmip原生支持它处理中小规模的线性混合整数规划完全够用。对于非线性项比如煤耗二次成本若无二次规划求解器可用可以分段线性化后用线性混合整数模型求解效率往往更高。6.3 储能SOC初值是结果差异的主要来源同一个模型SOC初值设为0.2和0.8最优解可以完全不同。这说明储能初值本质上相当于一种“期初资源禀赋”。在做多日滚动调度或评估储能价值时不能只盯一天的优化结果至少要以若干天的周期看储能循环能不能周转起来。如果不打算做多日联算那就把首末SOC相等作为约束写进去至少保证当天调度策略不依赖“初始馈赠”。6.4 参数敏感性权重系数别拍脑袋目标函数里各项的权重直接影响解的走向。弃风惩罚调太高模型会不惜让火电深调和储能强充来消纳调峰主动性惩罚调太低模型又退回被动调峰的老路。建议专门跑一组“权重-指标”敏感性分析比如将弃风惩罚从100元/MWh逐步升到600元/MWh同时记录弃风量、总成本和火电爬坡压力的变化做到心中有数再挑参数。结尾一点个人体会这套“计及调峰主动性的风光水火储多能系统互补协调优化调度”工作做到最后我的核心体会是代码只是模型的搬运工真正有价值的部分在于你愿不愿意把物理过程和管理逻辑逼着自己想清楚。调峰主动性不是一个写在论文摘要里的光鲜词汇它意味着你要在目标函数里尊重机组的寿命和状态、在约束条件里预留调节空间、在结果分析里同时照顾经济性和可执行性。很多稿子把模型写得极其华丽可一问到“为什么这个约束不能去掉”就语塞了。如果你能在Matlab里把每个约束的作用亲手摸一遍——去掉它、保留它、调整它看它对结果造成什么影响——这比一百个公式堆砌更能帮你建立工程直觉。再往深走这套框架还可以扩展到日内滚动调度、考虑风光预测误差的随机优化、甚至引入市场机制下的多主体博弈但那个阶段的前提依然是先把日前确定性模型吃透。

读完文章,也想定制专属网站?

尧图设计师 24 小时内与您沟通定制方案

免费获取报价 →
↑