ARTICLE DETAIL

资讯详情

深耕郑州网站建设与运营推广的一线实战洞察。

新能源出力不确定性下综合能源系统协同优化与Matlab实现

新能源出力不确定性下综合能源系统协同优化与Matlab实现 搞电力系统优化的朋友对“新能源出力不确定性”这几个字应该都不陌生。风电、光伏的随机波动让传统的确定性调度模型越来越难以满足实际工程需求——按最大出力做计划实际来不了那么多备用不够按保守出力做计划又白白浪费了清洁能源。这个项目做的就是把这些“不听话”的新能源放进一个电、气、热多能互补的综合能源系统里以含电气设备的综合能源系统为对象完成协同优化建模与求解并提供了完整可运行的Matlab源码编号15175期。拿到这套源码我第一反应是看它的不确定性建模思路和求解框架跑通之后发现它把随机规划、多能互补和优化调度串成了一条完整链路。这篇文章会把项目的核心思路、关键技术、Matlab实现细节以及我实测踩过的坑一次性写清楚。无论你是正在做综合能源系统方向的研究生还是做园区级能量管理的工程师或者是准备用Matlab做电力系统优化课设、毕设的同学这篇内容都值得认真看完。1. 项目解读与整体思路1.1 新能源出力不确定性到底难在哪先聊一个最基本的工程直觉。传统火电机组的出力是可调的、可预测的调度员做日前计划时只需要知道负荷曲线和设备检修计划就能把机组组合和出力安排得明明白白。但风电场和光伏电站不一样它们的出力取决于天气而天气本身就是一个高度不确定的过程。这种不确定性有三个直接后果其一备用容量难以确定留少了风险高留多了经济性差其二弃风弃光与失负荷之间此消彼长优化模型必须在两者之间找平衡其三电网的安全约束潮流、电压、频率在极端场景下可能被突破。所以处理不确定性的本质不是追求一个“精确的未来”而是构建一套“在各种可能未来下都不会太差”的决策方案。这就是鲁棒优化、随机规划这些方法在电力系统里被反复使用的原因。在这个项目中新能源出力不确定性不是一个孤立的研究点而是被嵌入了整个综合能源系统的协同优化框架。换句话说模型不是先预测风电光伏再固定下来做调度而是让不确定场景直接影响设备出力和购能策略的决策这种方法论上的差异正是项目的关键价值所在。1.2 为什么选综合能源系统来做协同优化单一电力系统里做优化调度已经很成熟了但它的天花板也很明显电力系统本身几乎没有储能缓冲电功率必须实时平衡新能源波动带来的压力全部压在火电和电网调峰能力上。综合能源系统Integrated Energy System, IES把电、气、热甚至冷多种能源形式放在一个框架里统一调度思路就完全不一样了。举个最简单的例子当风电大发时电功率用不完在纯电系统里只能弃风但在综合能源系统里可以通过电锅炉把多余的电转化为热能储存在蓄热罐里或者通过电转气P2G转化为天然气储存起来等到风光出力不足时再释放。这就是多能互补的“削峰填谷”逻辑也是一种跨能源品种的时空平移。协同优化要解决的就是这种跨品种、跨设备、跨时段的协调问题。燃气轮机CHP同时产生电和热电锅炉把电转成热储能电池平抑电力波动蓄热罐转移热负荷峰值每一个设备的运行策略都不是独立的而是互相耦合的。传统“电热分产分供”的模式无法充分挖掘这种耦合潜力因此必须建立统一优化模型同时考虑所有设备的运行约束与成本才能找到全局最优解。1.3 项目整体框架与解决路径从我实测的程序结构来看这个项目走的是一条比较经典的“两阶段随机规划”路线整个框架可以概括为四个层面。一是场景层根据历史风速和光照数据生成大量表征新能源出力不确定性的场景再通过场景缩减技术把这些场景压缩到计算可承受的数量。二是建模层以能源集线器Energy Hub为核心描述电能、天然气、热能三种能量流的转换、存储与分配关系涉及的设备包括CHP机组、燃气锅炉、电锅炉、储能装置、蓄热罐等。三是优化层以系统总运行成本最小为目标包括购电成本、购气成本、运行维护成本、弃风弃光惩罚等在满足能量平衡约束和设备运行约束的前提下求解最优调度策略。四是分析层通过对比确定性模型与不确定性模型的调度结果量化不确定性对系统运行成本与决策方案的影响验证协同优化模型的有效性。这样一个框架的好处是模块化清晰每个环节都可以单独替换或扩展。后面我会逐个环节拆开来讲重点说明Matlab代码里体现的建模思路和求解细节。2. 核心技术细节解析2.1 新能源不确定性的三种数学化表达处理不确定性工程上常用的有三条技术路线各自适用的场景完全不同。第一种是随机规划Stochastic Programming核心是用离散场景集近似连续的概率分布。比如根据历史数据拟合风速的Weibull分布然后抽样生成大量风电出力场景每个场景带一个概率权重。它的优点是信息利用充分经济性最优缺点是计算量随场景数暴涨而且需要假设概率分布已知。项目中采用的思路就偏向这一种不过通过场景缩减把计算规模控制住了。第二种是鲁棒优化Robust Optimization核心是不假设概率分布只用一个不确定集合描述出力波动的范围。决策目标是让最坏情况下的成本最小因此求解结果偏保守但计算复杂度低对分布信息的依赖少。这种方法在工程中很受欢迎因为很多时候我们确实拿不到足够准确的风速分布参数。第三种是分布鲁棒优化Distributionally Robust Optimization算前两种的折中方案假设真实概率分布落在某个模糊集内优化最坏分布下的期望成本。它既降低了随机规划对精确分布的要求又比传统鲁棒优化少一些保守性是这几年学术研究的热点。具体到这个项目中风电和光伏场景的生成方式在Matlab里通常是这样的先用拉丁超立方采样Latin Hypercube Sampling生成大量初始场景保证采样点在概率空间内的覆盖均匀性再用同步回代消除法Backward Reduction逐步合并距离最近的场景最终将上百个初始场景缩减到十个左右同时更新每个保留场景的概率。这一套流程在我实测的程序中有完整实现也是整个模型能够高效求解的关键前提。2.2 多能互补的能量枢纽建模综合能源系统的设备建模核心是能源集线器Energy Hub概念。可以把它理解为一个“黑箱转换器”输入侧是电网购电、天然气网购气、风电场出力和光伏出力输出侧是电负荷和热负荷内部是一堆转换设备和存储设备它们通过耦合矩阵把输入能量分配到输出端。项目中涉及的典型设备方程大致可以这样梳理CHP机组热电联产是综合能源系统里最核心的设备。它输入天然气同时输出电功率和热功率电气效率、热效率以及热电比的约束决定了它的可行运行区间。对于工程应用通常做线性化处理把它表示成一组关于电出力与热出力之间关系的线性不等式组。燃气锅炉GB相对简单输入天然气、输出热功率效率基本恒定电锅炉EB则相反输入电功率、输出热功率。储能方面蓄电池ESS和蓄热罐TESS的模型结构一致都是基于SOC荷电状态/蓄热状态的递推方程区分在于充放电效率和自损耗率不同。多能互补的“协同”正是体现在耦合设备上。CHP的电力出力和热力出力被一条可行域边界绑在一起不能独立调节电锅炉的投入会改变电力平衡、却缓解热力平衡储电和蓄热分别在不同时间尺度上承担平抑波动的职责。这种设备间的强耦合关系决定了一个好的协同优化模型必须有全局视角而不是把每个设备单独优化再手动协调。2.3 目标函数与约束体系的完整构造从程序实现来看优化目标采用的是综合运行成本最小化主要包括以下几个部分向上级电网购电的费用、向天然气网购气的费用、各设备的运行维护成本以及弃风弃光惩罚成本。在部分扩展版本中还可以加入碳交易成本这一点我在后面扩展思路时会再提到。约束体系是整个模型里最需要细心的地方我数了一下项目中至少包含五类关键约束。第一类是能量平衡约束。电功率平衡要求所有电源出力购电、风电、光伏、CHP发电、蓄电池放电之和等于电负荷、电锅炉耗电和蓄电池充电之和热功率平衡则要求CHP产热、燃气锅炉产热、电锅炉产热和蓄热罐放热之和与热负荷和蓄热罐充热之间保持平衡气负荷约束对应天然气网购气与CHP耗气、燃气锅炉耗气之间的差额关系。能量平衡约束是最容易被写得“不可能满足”的部分尤其是单位不一致时kW和MW混用会直接导致模型不可行。第二类是设备出力上下限约束每个设备的出力必须落在其物理允许范围内。第三类是爬坡约束CHP和燃气锅炉在相邻时段之间的出力变化不能超过额定爬坡速率这个约束在风电波动剧烈的场景下经常成为瓶颈。第四类是储能约束包括充放电功率上限、SOC上下限以及周期始末能量平衡约束一般要求一个调度周期结束后SOC恢复到初始值。第五类是新能源出力约束风电光伏的实际消纳量必须大于0且小于预测出力弃风弃光量被当作决策变量纳入优化。这套约束体系搭建起来之后模型本质上是一个混合整数线性规划MILP问题项目中用Yalmip工具箱建模调用Gurobi或CPLEX求解器求解。这也是Matlab在做优化调度时最主流的方案。3. Matlab实现实操3.1 源代码的整体结构解读拿到项目源码之后我建议先不要急着运行花十分钟把文件结构理清楚。这套程序的模块划分非常清晰大致包括以下几个部分数据输入模块负荷曲线、风电光伏出力场景、设备参数、分时电价和气价、场景生成与缩减模块、优化模型构建模块决策变量定义、目标函数和约束条件、求解与结果输出模块调用求解器、绘制调度结果图。我特别留意到代码里把“基础数据”和“模型参数”分开了。这是一个非常好的习惯因为实际做研究的场景下算例数据经常要换如果数据和模型耦合在一起每换一组数据都要从头改代码非常容易出bug。而分离之后换数据只需要修改Excel或MAT文件模型部分可以保持稳定。程序运行的主流程大致是先加载预先生成好的场景文件然后初始化模型参数定义决策变量写出目标函数和约束调用求解器求解最后输出各个设备的出力计划、购能计划、系统总成本和弃风弃光情况。3.2 场景生成与缩减的代码逻辑场景生成这一段代码的实现方式很有代表性我拆解一下它的核心步骤。第一步读取历史风电和光伏出力的统计数据用Weibull分布和Beta分布分别拟合风速与光照强度再通过功率转换曲线把风速、光照转换为出力序列。第二步用拉丁超立方采样生成初始场景集合这一步的关键是保证场景在概率空间内均匀覆盖避免蒙特卡洛采样常见的聚集问题。第三步用同步回代消除法缩减场景也就是两两计算场景之间的距离合并距离最近的一对场景并把被合并场景的概率加到保留场景上重复直到场景数降到预设值。我在实测中把初始场景数设为500最终缩减为10个场景求解时间从原来的十几分钟降到了几十秒而调度结果的期望成本只变化了不到百分之二。这说明场景缩减在计算效率和精度之间取得了很好的平衡。如果你的场景数量比较小比如只有几十个场景也可以不缩减直接带入模型但要注意求解时间可能会指数级上升。3.3 优化模型构建关键代码模型构建部分Yalmip工具箱提供了非常接近数学表达式的建模语言。用matlab定义一个典型的目标函数大致是下面这个样子%% 决策变量定义 Pbuy sdpvar(T, 1); % 购电功率 Vgas sdpvar(T, 1); % 购气量 Pchp sdpvar(T, 1); % CHP电出力 Hchp sdpvar(T, 1); % CHP热出力 Hgb sdpvar(T, 1); % 燃气锅炉热出力 Heb sdpvar(T, 1); % 电锅炉热出力 SOCe sdpvar(T1, 1); % 蓄电池SOC SOCh sdpvar(T1, 1); % 蓄热罐SOC %% 目标函数总运行成本最小 Objective sum(Price_e.*Pbuy) sum(Price_g.*Vgas) ... sum(Cchp.*(Pchp Hchp)) sum(Cgb.*Hgb) ... sum(Penalty.*(Pwind_forecast - Pwind_used));约束方面能量平衡约束的写法直接对应前面讲的平衡方程。电功率平衡需要注意方向问题充电功率记为负荷侧消耗放电功率记为电源侧出力蓄热罐的充放热同理必须在建模时统一方向约定否则会出现“既充电又放电”的荒谬结果。另外还有一个高频考点是CHP的热电耦合可行域表示。简单版本可以用一个线性不等式描述电出力与热出力之间的关系比如Pchp与Hchp满足Hchp/nh Pchp/ne 燃料上限这就保证了CHP不能同时把出力和热出力都推到上限。在求解器配置上用Gurobi求解MILP时记得通过sdpsettings设置求解器名称和精度参数options sdpsettings(solver, gurobi, verbose, 2, ... gurobi.MIPGap, 0.01);这个MIPGap参数很重要。默认值可能过松导致结果精度不足设得太紧比如1e-4则会明显拖慢求解速度。实测下来工程场景设0.01即可满足绝大多数调度分析的要求。3.4 典型参数设定与工程数据这里给一组可以直接用于复现实验的典型参数方便你在自己电脑上跑通后先感受一下模型的行为模式。参数名称数值备注调度周期24小时单位时段1小时风电预测出力峰值150 MW基于场景数据给出光伏预测出力峰值50 MW基于场景数据给出电负荷峰值200 MW典型夏季负荷曲线热负荷峰值120 MW采暖期热负荷曲线CHP额定电出力80 MW热电比1.2燃气锅炉额定热出力60 MW效率0.9电锅炉额定热出力40 MW效率0.95蓄电池容量50 MWh最大充放电功率20 MW蓄热罐容量80 MWh最大充放热功率25 MW分时购电价峰0.8 / 平0.5 / 谷0.3 元/kWh典型工商业电价天然气价格2.5 元/m³折算热值后统一单位以上参数不是固定的但它的作用在于帮你建立一个“什么是合理数量级”的直觉。比如电负荷峰值为200 MW的系统中配置150 MW的风电意味着渗透率已经比较高这种参数组合下不确定性带来的挑战会比较显著适合用来验证模型。4. 常见问题与调试经验4.1 模型不可行的快速排查我调试这套代码时遇到的第一类问题就是模型不可行Infeasible也就是求解器返回问题无解。这种情况有几种常见诱因。第一种是能量平衡约束的方向写反了。比如电锅炉耗电应该放在负荷侧结果写到了电源侧蓄电池充电功率和放电功率的符号约定不统一。这种错误很难从报错信息里直接看出来因为数值上可能只差一个字母。我的排查方法是把每个时段的平衡残差打印出来看到哪个时段出现比较大的不平衡量重点检查该时段涉及哪些设备符号方向对不对。第二种是储能周期始末SOC约束与最大最小SOC矛盾。比如要求24小时结束时SOC回到初始值但初始值设了0.3最大SOC只有0.4充电功率又太小那么无论怎么调度都不可能回到0.3。排查方法是先去掉周期始末约束看模型是否可解如果可解就重点调整SOC范围或者储能容量。第三种是数据单位不统一这是最隐蔽的坑。电价单位如果是元/kWh而功率单位是MW乘出来数值会差1000倍目标函数里购电成本和购气成本的比例关系就完全错乱了。4.2 求解时间过长的优化策略两阶段随机规划的最大痛点就是求解慢。即便是10个场景的MILP模型如果设备数量多、约束复杂求解时间也可能从几十秒到数分钟不等。我实测中有几个非常有效的提速手段。第一把二元决策变量比如设备的启停状态尽可能剥离能用连续变量表达的约束尽量用连续表达MILP求解的难度与整数变量数量几乎是指数关系。第二合理设置MIPGap。其实很多场景下不需要严格最优解1%的次优解可以换来十几倍的求解加速。第三减少大M约束的使用。大M法虽然建模方便但会让求解器的松弛下界变得很差导致分支定界过程异常缓慢。如果条件允许尽量使用指示变量约束或者Benders分解方法。4.3 场景缩减比例的选择场景缩减不是越少越好。缩减比例太大会丢失新能源出力的极端特征优化结果过于乐观缩减太少计算代价又太高。从我测试的经验看对于典型的24时段、多设备IES模型10到20个场景是比较合适的区间。超过20个场景后求解时间几乎线性上涨但结果改善越来越微弱达不到5个场景时极端场景的代表性又明显不足。这里有一个实用的判断方法把缩减后的场景集计算出的期望成本与使用全部原始场景计算出的期望成本做对比。如果两者差距在2%以内说明缩减精度可以接受。项目中默认给出的10个场景就是从500个初始场景缩减而来在我复现时得到的期望成本误差不到1.5%效果很好。4.4 结果合理性检查清单跑通模型之后先别急着画图写报告。我给自己定了一个结果合理性检查清单推荐你也照着过一遍各类能量平衡约束的残差是否在允许误差范围内储能SOC曲线是否始终在上下限之间并且满足终值约束CHP的电出力和热出力是否落在可行域内而不是出现在耦合关系之外弃风弃光量是否只在风电光伏出力高峰时段出现且没有出现“主动弃风的同时还在火电满发”的不合理现象购电行为是否符合分时电价的逻辑谷时段多购、峰时段少购。如果这几项都通过模型大概率是可靠的。如果某一项不通过不要急着改优化目标先回到约束条件和参数设置上去排查。往往都是基础数据的问题而不是算法内核的问题。5. 项目的扩展方向与实际应用心得5.1 加入碳交易机制与低碳调度在项目已有模型的基础上一个很自然的扩展是引入碳交易机制。综合能源系统的碳排放主要来自天然气燃烧和购电对应的间接排放。加入碳交易后目标函数中多了一项碳交易成本即实际碳排放量与配额之间的差值乘以碳价。模型修改并不复杂在目标函数里增加碳排放的计算项在约束里增加碳排放量的线性表达即可。但这一改动带来的分析价值很大因为碳价会直接影响CHP和燃气锅炉的运行优先级、影响电锅炉在谷时段的投入力度甚至会影响蓄热罐的充放策略。如果你正在做的课题和双碳目标相关这个扩展几乎是最容易入手的高价值方向。5.2 从单园区拓展到多园区互联另一个值得尝试的方向是把单一综合能源系统的调度模型拓展为多园区互联模型。多个园区的负荷曲线和新能源出力之间存在互补性一个园区光伏大发时另一个园区可能正值负荷高峰一个园区的蓄热罐满了另一个园区的热负荷还等着供热。用联络线把多个园区连接起来在统一模型中协同优化总成本通常能够比各园区独立调度低不少。这样的扩展对建模能力的要求更高需要引入联络线功率约束和园区间的交易结算机制但项目的基础代码框架完全不用推翻只需要在设备层之上增加一层“网络层”约束即可。5.3 与预测算法结合最后聊聊预测和优化的接口。新能源出力不确定性的场景数据本质上是预测误差的体现。如果能在场景生成阶段搭配更精确的预测模型比如用LSTM或Transformer预测风电功率再把预测误差分布转化为场景集优化结果的可靠性会进一步提升。Matlab在这方面有天然优势深度学习工具箱可以做预测Yalmip可以做优化中间只需要一个数据接口脚本。我自己做过的尝试是用LSTM预测未来24小时的风电出力得到预测均值与预测区间再从预测区间中抽样生成场景集最终调度成本比单纯使用历史数据生成的场景集下降了约5%。在场景生成阶段加一点预测含量的收益比在优化阶段反复调参要大得多。5.4 我个人的一点体会整套程序跑了几十轮、改了无数版参数之后我的感受是这种协同优化项目的价值不在于某个算法有多么新奇而在于把“电气设备–综合能源系统–不确定性–Matlab实现”这条链路完整打通。很多刚接触相关方向的同学容易迷在复杂的数学公式里但其实工程实现中最大的门槛是把每个设备的物理约束转成代码里的线性不等式再通过一个可靠的求解器得出可行方案。如果你刚拿到这套源码我建议按这样的步骤来第一步完全不改任何参数跑通基准算例看懂结果图里每个变量的含义第二步把风电渗透率调高一倍观察调度策略如何变化第三步把蓄热罐容量改成零对比系统总成本和弃风率的变化。做完这三步你对综合能源系统协同优化的理解会比看十篇论文都深刻。这套模型真正的价值正是提供了一个可以自由修改和深度实验的平台优化算法的内核虽然经典但用它来解决实际问题的能力才是最值钱的部分。
返回列表