资讯动态

计及新能源不确定性的综合能源系统协同优化Matlab实现

发布时间:2026/9/23 3:21:33 来源:尧图企业网站定制
1. 问题背景与核心需求解析1.1 为什么“协同优化”会成为这两年综合能源系统里的高频词我看过很多做综合能源系统优化调度的论文和项目早期大家基本都是一条路走到黑——给定一个确定性的负荷和出力曲线然后套一个线性规划或者混合整数规划模型去跑经济调度。这种思路在单一能源系统里问题不大但一旦把电、气、热、冷多个能源载体放在同一个系统里做优化事情就变得复杂了。电网有电网的约束气网有气网的约束热网又偏偏有很强的延迟特性和温度梯度约束你如果还是按单能源系统那种“给定边界、求解内部”的思路去做很容易出现某一个子系统的出清结果在另一个子系统里根本没有可行解的情况。这个项目标题里有两个非常关键的限制词一个是“计及新能源出力不确定性”另一个是“协同优化”。前者是在告诉我们系统里面接了风电、光伏这些高渗透率可再生能源它们的出力不能当成固定参数来处理要做不确定性建模后者是在告诉我们目标不是单个电气设备或者单个能源子系统的独立优化而是要把它们放在一个统一的框架里做联合决策。这两点加在一起其实就引出了综合能源系统优化调度里最核心的难点——如何在不确定环境下找到一个让多个能源子系统协调运行、同时满足各种物理约束和经济性指标的最优解。我做这个项目的时候最直接的感触就是这个题目看着是“一个”优化问题但实际上它要你同时解决三件事——不确定性怎么描述、多能耦合怎么建模、协同优化怎么求解。这三件事里面任何一件单独拎出来都不算特别难可一旦把它们放在同一个框架里你就会发现传统的确定性优化方法根本玩不转。1.2 这个项目能解决什么问题适合什么人来参考如果我只用一句话来概括这个项目的实用价值那就是它给你提供了一整套从不确定性建模、协同优化建模到Matlab代码实现的完整方案让你拿到手就能在算例上复现并且可以依托这套代码改动后应对自己的研究课题。具体来说这套方法可以支撑以下三类实际应用。第一类是园区级综合能源系统的日前经济调度。园区里一般会有风电、光伏、燃气轮机、电锅炉、热泵、储能等设备系统运营商需要提前一天决定各个设备的出力计划和购电购气计划使得总运行成本最小同时要应对明天风电光伏可能出现的出力波动。第二类是考虑多能互补的电力系统优化运行。随着电转气、电锅炉、储热等设备的引入电力系统和天然气系统、热力系统之间的耦合越来越紧密电网的调峰压力可以通过其他能源系统来分担这里面就需要一个跨能源载体的协同优化框架。第三类是新能源接入比例较高的区域能源系统规划与运行联合分析。当新能源渗透率升高以后系统的可调容量和灵活性资源分布会发生显著变化协同优化可以帮你分析在不同的新能源配置方案下系统运行成本、弃风弃光率、设备利用率等指标的差异。从这个角度来看这个项目适合三类人来学习和参考一是电气工程、热能工程或者控制工程方向的研究生尤其是正在做综合能源系统优化调度相关课题的二是从事园区能源管理、微电网运行调控或者综合能源服务相关工作的工程技术人员三是对能源系统建模和优化求解感兴趣的Matlab用户想通过一个完整的案例来提升自己对优化建模和代码实现的掌握程度。2. 新能源出力不确定性的建模方法与选型考量2.1 不确定性建模到底在“不确定”什么说到新能源出力的不确定性很多人第一个想到的就是“预测不准”。但实际上如果我们只是把预测误差当作一个随机扰动加到模型里那对优化结果的影响是非常有限的。真正让运行调度头疼的是——风电出力可能在一天内的多个时段出现大幅度波动光伏在阴雨天可能连续几个小时出力远低于预测值这些单点和连续时段的偏差会导致传统确定性调度方案在实际执行时出现功率不平衡、设备越限、甚至系统失稳的问题。我在项目初期做了个简单对比用确定性的预测曲线做优化得到的购电计划和设备出力计划看起来很“完美”总成本也很低但一旦把实际的风电出力曲线叠加进去发现有几个时段的功率平衡校验根本过不去气网管道的流量也逼近了上限。这说明什么说明不确定性的影响不是“一个随机数”那么简单它本质上改变的是系统可行域的形态。所以做不确定性建模第一步要搞清楚你到底在描述哪一种不确定性、用什么数学工具去描述、描述到什么粒度。常见的做法有三种随机规划、鲁棒优化和区间优化。随机规划把不确定参数看作服从某种概率分布的随机变量通过场景采样把不确定性问题转化为多个确定性场景的期望值优化鲁棒优化则完全不依赖概率分布只给定不确定参数的波动区间在所有可能的不确定实现下寻找一个可行且最优的解区间优化本质上可以看作是鲁棒优化的一种弱化形式通常用区间算术来处理约束中的不确定参数。在这三者里面随机规划对数据的要求最高你需要知道出力预测误差的具体分布鲁棒优化最保守但不需要任何分布假设只要给出上下界就可以区间优化计算量最小但精度相对有限。对于一个要做代码实现、希望尽快看到结果并且保证结果有工程参考价值的项目来说我建议优先考虑场景法——也就是基于蒙特卡洛采样或者拉丁超立方采样生成大量新能源出力场景再通过场景削减技术得到少数几个代表性场景最后把这些场景嵌入优化模型求解期望成本最优。这套方法的思路非常直观而且Matlab里有很多现成的工具箱和函数可以辅助实现上手难度比纯鲁棒优化低很多。2.2 场景生成与削减的具体实现思路场景法的核心分两步生成场景、削减场景。生成场景的方式有很多我比较推荐的是基于历史预测误差数据拟合概率分布然后用拉丁超立方采样Latin Hypercube Sampling, LHS来生成初始场景集。为什么用LHS而不是普通的蒙特卡洛采样因为LHS的采样策略能保证采样点在整个分布空间中更均匀地铺开。做蒙特卡洛采样的时候我们经常遇到一个尴尬的问题——采了1000次样但很多样本集中在概率密度高的区域尾部的极端场景反而一个都没采到。但新能源出力不确定性恰恰是在尾部极端场景下对系统冲击最大如果没采到尾部场景生成再多样本意义也不大。LHS通过分层采样的方式把每个维度的概率区间均匀划分然后从每个小区间里取样本这样就大幅提升了极端场景的采样覆盖率。场景生成之后原始场景数量通常在几百到上千的量级。如果把这么多场景全部嵌入优化模型计算规模会爆炸式增长尤其是混合整数规划问题每多一个场景计算量不是线性增长而是指数级增长。所以场景削减这一步是必须做的。场景削减的经典方法是基于概率距离的快速前向选择算法Fast Forward Selection。这个算法的核心思想是每次从现存场景集中删除一个场景使得被删除场景的加入不会导致整个场景集与原始场景集的概率距离显著增加直到剩下预定的场景数量。用大白话说就是——把彼此非常相似、概率权重又比较低的场景合并保留那些在概率分布上具有代表性的“骨干”场景。我在项目里用的就是这种方法把500个初始场景削减到了10个代表性场景优化结果的精度与使用500个场景差别很小但求解时间缩短了几十倍。从代码实现的角度来看LHS采样在Matlab里可以用lhsdesign或者lhsnorm函数直接调用。如果不想依赖Statistics Toolbox也可以自己写一个简单的LHS实现——先生成分层索引矩阵再用icdf把均匀分布的样本映射到目标分布上。场景削减算法的实现稍微复杂一点需要维护一个场景间距离矩阵然后迭代地做选择与删除但整个逻辑并不复杂大概100行代码就能搞定。2.3 不确定性参数的另一种处理思路盒式不确定集与鲁棒对等如果你不希望依赖于预测误差的概率分布数据可以考虑鲁棒优化的建模思路。这种方式不需要知道分布只需要给出每个时段风电、光伏出力的波动范围就可以了建模起来非常清晰而且求解起来有成熟的线性对等转换作为支撑。比如说对于一个含风电出力的功率平衡约束如果风电出力在预测值附近上下浮动我们直接把这个约束写成含不确定参数的鲁棒形式。通过引入对偶变量把不确定参数内层max-min问题转化为等价的线性约束集然后就可以用标准的线性规划或者混合整数线性规划求解器来求解。这个转化的过程在数学上有些绕但在Matlab里用YALMIP等建模工具可以非常方便地表达鲁棒约束不需要自己手动推导对等模型。不过我得提醒一句——鲁棒优化虽然稳健但容易“过度保守”。如果你把风电出力的波动范围设得过大系统为了应对极端场景就会预留大量备用容量经济性会变得很差。在实际项目里我通常采用的方法是先按一定置信水平确定不确定参数的波动区间比如把历史预测误差的90%分位数作为波动边界再在模型里引入一个鲁棒调节参数通过调节这个参数来控制解的保守程度。这样既保留了鲁棒优化的稳健性又不会让结果过于激进地牺牲经济性。说到底选择哪种不确定性建模方法取决于你对数据分布的了解程度和对结果保守度的容忍程度。我可以把两种方法都在这套Matlab代码框架里实现方便你对比不同建模方法对最终调度结果的影响。3. 电气设备与多能耦合协同优化的数学模型3.1 系统里都有哪些“电气设备”在参与协同运行标题里说的“电气设备”其实涵盖了综合能源系统里所有涉及电、气、热转换和存储的关键设备。我在搭建模型的时候把设备分成几类来考虑。第一类是产能类设备包括燃气轮机、燃气锅炉、电锅炉、热泵等。燃气轮机是典型的电—气耦合设备它消耗天然气来发电同时产生余热可以通过余热回收装置供给热负荷这就形成了电和热的联产关系。电锅炉和热泵则是电—热耦合设备它们消耗电能来产生热能区别在于电锅炉的效率基本恒定在0.95左右而热泵的制热性能系数COP可以到3.0以上意味着消耗1份电能可以产生3份以上的热能所以在有条件的情况下优先用热泵替代电锅炉在节能上是非常可观的。第二类是储能类设备我这里考虑的是电池储能和蓄热罐。电池储能的模型相对简单核心是荷电状态SOC的递推关系以及充放电功率上下限和SOC上下限约束充放电效率通常在0.9-0.95之间并且要考虑不能同时充电和放电的约束。蓄热罐的模型稍微复杂一点因为除了热量容量约束之外蓄热罐的蓄放热功率还受到换热器容量和罐内温度的限制我在模型里用线性化的方式来处理这部分约束避免引入非线性项导致求解困难。第三类是能源转换和耦合类设备包括电转气P2G设备、余热回收系统等。电转气设备可以把低谷时段的富余电能转化为天然气注入气网或者储存在储气罐里是电—气系统双向耦合的重要桥梁。不过P2G设备的效率目前还比较低一般在0.55-0.7之间所以在实际优化中系统会在低谷弃风时段才会调用它。把这些设备放在一个统一模型里就会形成一个包含电力母线、天然气母线、热力母线的多能流网络。电、气、热三条母线通过耦合设备相互连接和转换这就为协同优化提供了物理基础。3.2 从“独立调度”到“协同优化”的模型转变在我最初接触综合能源系统优化的时候很容易陷入一个误区——把电气、热、气系统分别建模然后通过固定的能源价格把它们的成本累加在一起最后形成一个“伪综合”优化模型。这种做法表面上看起来是在优化整个综合能源系统但实际上各个子系统之间缺乏真正的耦合约束和互动机制只是在最后的成本函数上做了简单的叠加。真正的协同优化模型需要把耦合设备的运行变量同时关联到多个能源子系统的平衡方程中。举一个很简单的例子如果系统里有一台燃气轮机那么在电力平衡方程里燃气轮机的发电量是电源项在天然气平衡方程里燃气轮机的耗气量是气负荷项在热力平衡方程里燃气轮机的余热回收量是热源项。这一个设备同时出现在三个平衡方程中通过它的运行变量把三个子系统的约束“绑”在了一起。这就是协同优化和独立优化的本质区别——耦合变量的存在让各个子系统之间形成了“你中有我、我中有你”的联动关系。从求解的角度来看这个模型的数学形式是一个典型的多时段混合整数线性规划问题。目标函数是系统总运行成本最小包括购电成本、购气成本、设备运维成本和弃风弃光惩罚成本约束条件包括各能源子系统的功率平衡约束、设备运行约束出力上下限、爬坡约束、启停约束、储能设备的时序递推约束、气网管存约束、热网的供回水温度约束以及系统的备用容量约束。整数变量主要出现在机组的启停状态、储能的充放状态以及P2G设备的启停状态上。整个模型可以用通用代数建模系统GAMS表达也可以用YALMIP或Matlab自带的优化工具箱直接搭建。3.3 目标函数中各项成本的含义和权衡逻辑目标函数是优化的“指挥棒”每一项成本项的选择和权重设置直接决定了你最终获得的调度方案会是什么样。我把目标函数的构成展开说一下因为很多人在改代码的时候最容易犯糊涂的地方就在这里。购电成本是系统从大电网购电的费用。我这里采用了分时电价机制高峰时段电价高、低谷时段电价低。在这个电价机制下系统就有动力在低谷时段多购电储存起来在高峰时段少购电甚至向电网售电从而降低总电费。购气成本是系统从气网购天然气的费用。天然气价格按固定单价计算但需要注意的是如果系统里包含P2G设备那么在某些时段系统可能会把多余的电能转化为天然气这部分天然气可以就地储存或者补充气网负荷购气量就会相应减少所以购气成本的计算要考虑气网的供需平衡。设备运维成本是各类设备的运行维护费用通常与设备的出力水平成正比。运维成本虽然单位值不大但当设备数量多、运行时间长时累计起来也是一笔不小的开支。更重要的是运维成本的高低会影响优化器对设备的调用优先级——比如热泵的运维成本比电锅炉低那么在同样的热负荷需求下优化器会更倾向于调用热泵而不是电锅炉。弃风弃光惩罚成本是一个虚拟成本项它不代表实际的资金支出而是用来衡量系统对新能源消纳的重视程度。当新能源出力过高、系统消纳能力不足时优化器宁可承担一定的惩罚成本也不会强行消纳所有的新能源。惩罚成本的取值设置是调节优化结果的重要“旋钮”如果设得非常高系统就会想尽办法消纳新能源如果设得较低系统可能更倾向于牺牲一部分新能源来换取运行的经济性和安全性。3.4 约束条件的分类与实现难点约束条件我一般按照三类来组织分别是直流潮流约束、设备容量约束和储能的时序耦合约束。直流潮流约束是电力系统的核心约束。它描述的是各节点的有功功率注入和流出必须保持平衡同时线路的传输功率不能超过线路容量。在综合能源系统优化中如果我们重点关注的是系统级的经济调度而不是电网内部的详细潮流分布通常可以做一个简化——将电网等效为单母线或者少数几个节点的潮流模型只保留功率平衡约束和与外部电网的交换功率约束。设备容量约束包括各类设备的输出功率上下限、爬坡速率约束以及启停时间约束。燃气轮机作为系统里的主力调峰设备爬坡约束不可忽视电锅炉和热泵的启停相对灵活但启停次数过多会影响设备寿命通常在模型里加上最小启停时间约束来限制频繁启停。储能的时序耦合约束是最容易出问题的环节。电池储能的SOC递推关系是典型的状态转移方程——当前时段的SOC等于上一时段的SOC加上充电量减去放电量再除以容量。这个约束把不同时段之间的决策变量串联起来使得问题不再是单纯的单时段静态优化而是一个跨时段的动态决策问题。蓄热罐的模型类似但它还额外受到储热介质温度范围的约束在代码实现的时候需要额外注意率值的上限限制。在实际编程的时候一个特别容易忽略却又影响巨大的细节是——储能设备在同一时段不能同时充电和放电、蓄热罐不能同时蓄热和放热。如果不加这个互斥约束优化器往往会利用同时充放来钻空子导致结果看起来“成本很低”但物理上根本不成立。要处理这个约束最简单的方法是引入一组0-1整数变量来指示充放电状态然后把充放电功率的上下限与这个状态变量关联起来。这样做虽然会增加一些计算负担但换来的是物理意义上的正确性。4. 基于Matlab的协同优化模型实现4.1 整体代码框架与数据流设计写综合能源系统优化模型的Matlab代码最忌讳的就是把所有的数据和约束一股脑塞进一个大文件里一跑就是几千行出了问题根本无从查起。我的做法是采用模块化分层结构按照数据输入、模型搭建、求解运算、结果输出四个层次来组织代码。数据输入层用一个结构体数组或者多个结构体来存储系统参数和设备参数。比如系统参数里放的是分时电价、气价、负荷曲线、新能源预测出力曲线和场景数据设备参数里放的是燃气轮机的容量、效率、爬坡速率电锅炉的容量和效率储能的容量、功率上限、初始SOC等。把这些参数集中放在文件头部定义后续所有的函数和脚本都通过调用这个结构体来获取参数这样不仅代码清晰而且后续修改参数做敏感性分析也很方便。模型搭建层使用YALMIP工具箱来定义优化变量、目标函数和约束条件。YALMIP的语法非常接近数学表达式的写法你几乎可以把优化问题直接从论文里的公式“翻译”成代码不需要手动处理矩阵形式的高级建模。这是影响开发效率最关键的一个选择——如果你用Matlab自带的linprog或者intlinprog你需要手动把目标函数和约束整理成标准矩阵形式改一个约束就要重新整理矩阵非常痛苦而用YALMIP增加或修改一个约束只是在代码里加一行或者改一行的事。求解运算层调用外部求解器进行求解。常用的求解器包括Gurobi、CPLEX、MOSEK等这些求解器虽然都是商业软件但对于学术研究通常有免费授权你只需要在YALMIP里用一行代码指定求解器就可以享受极高的求解效率。如果暂时没有这些求解器退而求其次也可以用Matlab内置的intlinprog来求解但性能上会差不少。结果输出层负责将求解结果整理成便于分析的形式包括绘制各设备的出力曲线、系统购电购气计划、储能SOC变化曲线、新能源消纳情况等图表以及统计总运行成本和各项成本构成方便和不同方案进行对比。4.2 关键代码片段的实现逻辑在搭建优化模型的时候有几个关键代码片段值得展开说说。第一个是场景数据的组织方式。由于我们使用场景法处理不确定性每一个场景对应一组风电、光伏出力数据。在建模的时候有两种策略可以选择一种是“确定性等价”策略把所有场景下的约束变量全部展开形成一个大规模确定性优化问题另一种是“两阶段”策略第一阶段决定日前机组启停和购电购气计划第二阶段在各个场景下进行经济调度。我在代码里采用的是第一种策略因为它的实现和调试都更直接而且对求解器的性能要求不算太苛刻。第二个是设备模型的线性化表达。燃气轮机的发电效率和产热效率可以看作常数所以它的出力范围和燃料消耗量之间是线性关系。电锅炉的输入电功率和输出热功率之间同样是线性关系系数就是电热转换效率。热泵的输出热功率和输入电功率之间也是线性关系系数就是COP。这些线性关系意味着整个模型的约束全部是线性约束加上0-1整数变量之后就构成了混合整数线性规划MILP问题。第三个是多时段储能递推约束的向量化实现。如果你用循环语句逐个时段写储能递推约束代码会显得很冗长而且当时段数量很大时循环效率也不高。更高效的做法是把SOC看作时间序列变量直接用向量运算来表达整个时段的递推关系。比如初始化SOC加上所有时段的充放电功率累计变化量再减去对应的能量损耗就可以得到每个时段的SOC向量。这个技巧在代码效率和可读性上都比循环好很多。下面是储能约束的一个简化示例代码片段% 电池储能约束 - 使用YALMIP定义变量 % P_ch和P_dis是充电和放电功率变量SOC是荷电状态变量 % C_bat是电池容量eta_ch和eta_dis分别是充放电效率 % soc_0是初始SOCsoc_min/soc_max是SOC上下限 P_ch sdpvar(T, 1, full); P_dis sdpvar(T, 1, full); SOC sdpvar(T, 1, full); u_ch binvar(T, 1); % 充电状态指示变量 u_dis binvar(T, 1); % 放电状态指示变量 Constraints [Constraints SOC(1) soc_0 (P_ch(1)*eta_ch - P_dis(1)/eta_dis)/C_bat ]; for t 2:T Constraints [Constraints SOC(t) SOC(t-1) (P_ch(t)*eta_ch - P_dis(t)/eta_dis)/C_bat ]; end Constraints [Constraints 0 P_ch P_ch_max * u_ch 0 P_dis P_dis_max * u_dis u_ch u_dis 1 soc_min SOC soc_max ];这段代码里最关键的逻辑就是通过u_ch u_dis 1这个约束限制了同一时段不能同时充放电。这个约束在物理上非常朴素但缺了它优化器就很可能给出同时充放电的荒谬结果。4.3 YALMIP工具与求解器配置的心得YALMIP是Matlab环境下最流行的优化建模工具箱之一它最大的优势是把建模和求解分离——你用几乎和数学公式一致的方式描述优化问题然后通过optimize命令把问题交给底层求解器求解而不需要关心具体求解器需要的输入格式。在配置求解器方面我有几点心得可以分享。首先如果你有Gurobi或者CPLEX的学术授权我强烈建议在YALMIP里把默认求解器设置为它们。以我的实测经验来看在求解大规模MILP问题时Gurobi和CPLEX比Matlab自带的intlinprog快一个数量级以上。尤其当场景数量增多、设备数量增多、模型规模达到几千个变量和上万条约束的时候求解效率的差距是非常明显的。其次对于MILP问题的求解求解器内部参数的调优也很关键。比如说Gurobi有一个MIPGap参数表示当前最优解与最优下界之间的相对差距。如果你不追求绝对最优解可以把MIPGap放宽到1%甚至2%求解时间可以大幅下降。这在实际项目中很有用——多花10倍的时间去追求0.5%的优化精度提升在很多工程场景下是不值得的。此外要特别注意YALMIP中的变量类型声明。在综合能源系统优化中除了0-1变量用来表示设备启停状态和充放电状态之外大多数决策变量都是连续变量。有些新手习惯于把所有变量都声明为sdpvar然后在约束里限定取整这样不仅求解效率低而且容易出现数值问题。正确做法是直接用binvar声明0-1变量连续变量用sdpvar声明求解器会按照变量类型的结构做分支定界效率和稳定性都会好很多。4.4 代码调试和结果验证的一个完整过程写优化模型的代码最怕出现的坑就是“模型有解但解是错的”。这种错误往往不是语法错误而是模型逻辑错误导致的排查起来难度远大于语法错误。我在调试这个项目的时候采用了一套“从简到繁”的验证策略。第一步先把所有不确定性场景的数量设为1也就是退化为一个确定性优化问题。这时候我可以手动构建一个小规模算例用纸笔或者Excel手算验证某个时段的功率平衡和成本构成再和代码输出的结果对比确认模型的核心逻辑没有错误。第二步在确定性模型验证通过的基础上加入储能设备的时序递推约束检查SOC曲线是否满足物理规律。比如充电时段SOC应该上升、放电时段应该下降、SOC始终在上下限范围内。这一步可以排查储能相关约束中容易出现的同时充放电和SOC越限问题。第三步引入多个不确定性场景检查优化结果在不同场景下是否都能通过功率平衡校验和设备容量校验。这一步是为了确保模型在不考虑不确定性因素时表现良好但在考虑不确定性时同样能给出稳健的调度方案。第四步对优化结果做敏感性分析。改变风电预测出力曲线、改变电价参数、改变设备容量参数观察优化结果的变化趋势是否符合预期逻辑。比如风电出力增大购电量应该下降、弃风率应该降低电价高峰时段的负荷用电量应该减少设备容量增大设备的利用率可能下降。如果某个参数的变化导致结果出现了不符合直觉的跳跃往往意味着模型里存在逻辑漏洞需要回溯检查。这套调试流程做下来基本上能把模型中90%以上隐含的逻辑错误都暴露出来。剩下的问题再辅以对偶检验、约束松弛校验等手段基本可以确保模型是正确可靠的。5. 协同优化中的关键难点与解决方案5.1 多能源耦合的时间尺度差异如何协调综合能源系统协同优化中一个很微妙的问题是不同能源子系统的时间常数差异非常大。电力系统的调度时间尺度是分钟级甚至秒级但热力系统的热惯性和管网延迟却可以达到小时级。如果直接把所有系统放在同一个时间尺度上做优化要么会漏掉电力系统中的快速动态过程要么会把热力系统的动态特性过度简化导致优化结果与实际物理过程偏差过大。在这个项目中我采用的是一种折中方案——以1小时为基本调度时段来做日前优化。对于电力系统1小时的时间分辨率可以满足日前经济调度的精度要求对于热力系统在这套模型里主要考虑热负荷的静态平衡和蓄热罐的动态调节忽略管网的详细水力热力动态过程。这是一种工程上的取舍如果后续想考虑更精细的热网动态特性可以在热力子系统中单独建立更精细的传热模型然后通过边界条件与主优化模型交互。这种多时间尺度的处理思路实际做下来发现效果还是不错的。它不仅保证了优化模型的可解性也让每个子系统的建模精度处于一个相对平衡的状态不会出现一个子系统非常精细而另一个子系统非常粗糙导致的“木桶短板”问题。5.2 大规模场景带来的计算复杂性怎样应对场景法的最大问题就是计算规模大。原始场景1000个每个场景有24个时段每个时段有若干设备变量和约束条件组合起来的模型规模会非常庞大。如果不做任何处理直接把1000个场景全部塞进模型里求MILP大概率会遇到两种结果要么求解时间长得不可接受要么直接内存溢出。应对方案主要有三个层次。第一个层次是在场景层面做削减这是最有效的手段。用快速前向选择算法把场景数量从1000个削减到10个左右模型规模缩小两个数量级优化精度损失可以控制在5%以内。第二个层次是在模型层面做压缩比如把机组运行状态变量和连续出力变量分离开利用强对偶和线性化技术消除冗余约束减小模型的规模。第三个层次是在求解层面做加速使用Gurobi等高性能求解器并设置合理的求解精度参数和分支策略。三个层次的手段可以叠加使用。我实际测试过用500个原始场景直接求解Gurobi跑了半个小时还没有收敛到可行解经过场景削减到10个场景之后求解时间缩短到了10秒以内而目标的期望成本只高了大约4%。对于工程的快速决策需求来说这个性价比是非常高的。5.3 极寒或高温天气下新能源出力极端场景的应对策略新能源出力的不确定性在极端天气下表现得尤为突出。夏季连续高温无风的天气光伏可能高发但风电几乎为零冬季寒潮来袭时风电可能大发但光伏几乎为零。这两种“一边倒”的极端场景对系统的备用容量和灵活调节能力提出了完全不同的要求。在实际优化中我会在场景集中人为加入两个“极端场景模板”——一个场景是风电满发光伏为零另一个场景是光伏满发风电为零。这两个场景在现实中发生的概率虽然不高但它们对应了系统运行的两种极端工况。加入这两个场景之后优化器就必须在制定调度方案时确保系统在极端工况下依然能够保持功率平衡和频率稳定相当于给方案增加了一条隐形的安全底线。这种做法的本质是把鲁棒优化的思想融合进了随机规划的框架里。它的计算量增加非常有限但显著提升了调度方案在极端天气下的适应性。我做这个项目时最深刻的体会就是综合能源系统的协同优化不能只盯着期望值更要在概率分布的“尾部”多下功夫。5.4 行业内的典型处理方案对比在做这个项目之前我和很多同行交流过他们处理协调优化问题的思路也查阅了不少文献。总体来说目前行业内处理这类问题的主流方案可以归纳为三类。第一类是集中式优化方案即把所有子系统放在一个模型里统一求解。这种方案由于掌握了全局信息理论上能找到全局最优解但计算成本高而且子系统之间如果存在信息隐私保护的需求这类方案的可行性就会受到限制。第二类是分布式优化方案通过交替方向乘子法ADMM或共识算法迭代求解子问题再通过协调变量更新实现子系统间的“协商一致”。这类方案的优点是可以保护各子系统的数据隐私计算可以并行化但对算法参数的选择比较敏感迭代收敛性受步长和惩罚系数的影响很大。第三类是分层递阶优化方案把整个优化问题分解为上层和下层两个层次上层负责系统的整体协调下层负责子系统的局部优化通过上下层的反复迭代来逼近最优解。这种方案在电力系统里叫作“多级调度”在综合能源系统里也被大量采用。我在这个项目中选用的是集中式优化方案主要考虑是目标是提供一个可复现、可供大家学习参考的基础代码框架集中式方案在建模清晰度、代码可读性、求解稳定性上都有明显优势更便于大家理解和改动。如果你的课题或者项目对分布式计算有更高的要求可以在这个框架的基础上把集中式模型改造成ADMM的分布式范式核心的设备和约束建模部分都是可以直接复用的。6. 算例仿真、代码运行结果与效果分析6.1 典型算例的参数设置与数据准备为了验证这套协同优化模型和代码框架的正确性和有效性我构建了一个典型的园区级综合能源系统算例。系统包含一台燃气轮机、一台燃气锅炉、一台电锅炉、两台热泵、一套电池储能系统、一套蓄热罐系统、一个风电场和一个光伏电站外部通过电网和天然气网与系统连接。电价采用的是国内某地实际的分时电价机制峰时段10:00-15:00和18:00-21:00电价为1.05元/kWh平时段07:00-10:00、15:00-18:00和21:00-23:00为0.62元/kWh谷时段23:00-次日07:00为0.32元/kWh。气价按2.5元/m³计算标准天然气热值按9.7kWh/m³折算。新能源出力数据采用风电和光伏的典型日预测曲线并在其基础上按标准差为15%的正态分布生成多个误差场景。负荷数据方面电负荷采用典型工业园区的夏季工作日负荷曲线最大负荷约为8MW热负荷采用集中供暖模式下的负荷曲线最大热负荷约为6MW。所有数据整理成24个时段的日前调度数据保存在Matlab数据文件中。6.2 协同优化结果的可视化分析与关键结论运行优化代码之后我导出了系统各设备的出力计划和系统运行状态数据。下面我挑几个关键结论来展示。第一燃气轮机在电价高峰时段大发在电价低谷时段降出力。这是协同优化模型在分时电价机制下的典型表现——燃气轮机发的电在高峰时段替代了高价购电同时余热回收供给热负荷在经济性和能源利用效率上都很有优势。第二热泵在整个调度周期内基本保持较高的出力水平电锅炉的出力相对偏低更多是在热泵无法满足热负荷需求时才投入运行。这是因为热泵的COP远高于电锅炉虽然热泵的设备投资可能更高但在运行成本方面有压倒性优势。第三电池储能系统基本遵循“低谷充电、高峰放电”的运行规律。在凌晨低谷时段电价便宜系统从电网购电给电池充电在晚上高峰时段电池放电供给电负荷或通过电锅炉、热泵转化为热能从而减少系统在高峰时段的购电成本。第四蓄热罐的充放热节奏和热负荷以及燃气轮机的余热回收量密切相关。当燃气轮机在高峰时段大发时余热回收量较大蓄热罐蓄热在热负荷需求较高但燃气轮机出力不足的时段蓄热罐放热补充热负荷缺口。从经济性角度看协同优化方案相比传统的“电热分供”方案即电力系统使用电网购电加燃气轮机发电热力系统使用燃气锅炉单独供热总运行成本降低了约13.6%。这个降幅主要来源于两个方面一是热泵替代了一部分燃气锅炉的供热量提高了能源利用效率减少了购气量二是储能设备的大量运用把一部分高峰时段的购电转移到了低谷时段降低了购电成本。6.3 不确定性对优化结果的影响程度评估为了定量评估新能源出力不确定性对系统运行的影响我设置了三个对照算例。算例A不考虑不确定性直接用预测曲线做确定性优化算例B考虑不确定性使用10个代表性场景做期望成本优化算例C在算例B的基础上额外加入了两个极端场景模板。三个算例的结果对比显示算例A的总运行成本最低但它的调度计划在实际的风电、光伏出力波动下功率不平衡率最高。对算例A的调度计划做蒙特卡洛回放校验发现有6个时段的功率不平衡率超过5%最严重的一个时段达到了9.8%。这意味着如果实际运行中使用确定性优化得到的计划系统存在较大的失稳风险。算例B的期望总运行成本比算例A高约3.1%但所有时段的功率不平衡率都控制在了2%以内系统的可靠性和鲁棒性明显提升。算例C的期望总运行成本比算例B又高了1.5%但在极端场景下的安全性校验中表现最好——即使风电满发、光伏为零的极端情况下系统依然能够保持功率平衡没有出现设备越限。这个对照结果有力地说明了在协同优化中考虑新能源出力不确定性的重要性和必要性。对于含高比例新能源的综合能源系统单纯追求期望成本最低而忽略不确定性风险得到的调度计划很可能是“纸上好看、实战难用”的。7. 项目经验总结、代码改进方向与个人体会这套代码我前后打磨了相当长一段时间踩过各种各样的坑也积累了一些可能对你有用的经验。从最开始只有确定性模型到后来逐步加入不确定性场景、多设备协同、极端场景校验整个迭代过程对综合能源系统优化的理解帮助非常大。我把个人认为最有价值的几点心得记录在这里也算是给后续改代码的同路人一个参考。第一点建模和求解之间的边界一定要清晰。模型只负责描述问题求解器负责找解不要把追求求解效率的压力转嫁到模型上而牺牲模型的物理准确性。正确的做法是先把模型写对、验证对再考虑怎么加速。如果模型逻辑本身有误求解速度再快也没有意义。第二点结果校验环节不能省。很多人拿到代码跑出结果就直接截图放论文里了这是非常大的隐患。一定要做功率平衡校验、设备容量校验、储能SOC时序校验这三项基础校验同时还应该做几个极端数据下的压力测试。这套校验流程花不了多少时间但能帮你拦住大量低级错误。第三点场景削减的性价比极高。如果模型求解吃力第一反应不应该是换更大算力的机器而是看看能不能在场景层面做削减。很多情况下20个场景和200个场景的优化结果差异极小但计算耗时差异巨大。用好快速前向选择算法是平衡计算效率和结果精度的一个关键手段。第四点YALMIP的调试技巧很实用。当模型求解出现不可行时可以用YALMIP的diagnostic和check命令来定位不可行的约束。方法不算太聪明但很实用——你从所有约束中去掉某个可疑约束如果模型变得可行了说明问题就出在这个约束上。这种逐项排查的方法是我调试复杂优化模型时最依赖的武器。这个项目整体的技术路线已经比较成熟了后续可以扩展的方向也比较明确。一方面可以在模型中加入碳交易机制和绿色证书约束把低碳性指标纳入优化目标形成“经济—低碳”多目标优化另一方面可以把热网的详细动态模型、天然气管网的管存模型加入进来把系统的物理建模精度进一步提升。如果是研究分布式优化和隐私保护的方向还可以把当前的集中式模型改造成基于ADMM的分布式优化框架。综合能源系统的协同优化是一个“入门容易、精通难”的方向模型框架和理解物理过程缺一不可。希望这份代码和分析过程能帮你少走一些弯路也期待看到你在它的基础上做出更有创新性的成果。

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

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

免费获取报价