ARTICLE DETAIL

资讯详情

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

碳中和下的电气互联系统有功-无功协同优化:Matlab建模与实现

碳中和下的电气互联系统有功-无功协同优化:Matlab建模与实现 1. 碳中和给无功优化带来的“新内涵”前几天和一个做配电网规划的朋友聊天他听说我在折腾电气互联系统的有功-无功协同优化第一反应是无功优化不是十年前就有人做到吐的老方向吗怎么还在做这个反应我完全理解。无功优化这个词在传统电力系统里确实算不上新鲜前辈们从上世纪八十年代就开始研究目标无非是降低网损、改善电压分布再激进一点就是把无功补偿装置的投切也纳入决策。到了今天这个方向反而变得更有嚼头——因为碳中和这个目标把整个电力系统的运行逻辑都改了电源结构变了、负荷特性变了、系统的灵活性来源也变了。而无功优化恰好踩中了这场变革的一个关键点光靠有功调度已经管不住电压了必须在有功和无功两个维度协同做文章。再说电气互联系统。碳中和背景下可再生能源占比快速上升但风光出力波动性大电网需要大量灵活性资源来平衡。燃气机组启动快、调节能力强成了过渡期最有价值的调节电源同时电转气P2G技术可以把富余的新能源电力转化为天然气实现跨时段、跨系统的能量存储和转移。这样一来电力系统与天然气系统的耦合越来越紧密单纯把电网拎出来做优化已经无法真实反映系统的运行状态。把电网、气网放在一个统一的优化框架里让燃气机组的气耗、气网管道的压力约束、P2G的转换效率都参与决策才能挖掘出真正的“碳中和”优化空间。这也是这篇内容想讲清楚的事情在碳中和目标驱动下如何建立一个电气互联系统的有功-无功协同优化模型并且用Matlab把模型高效地实现出来。我会从模型思路、数学表达、代码架构、算例验证到实际踩过的坑完整过一遍。适合正在做电力系统优化调度、综合能源系统方向研究的学生和工程师参考也适合想转做能源系统优化的入门者了解这个方向的整体框架。2. 电气互联系统建模把电网和气网放进同一个框架2.1 电网模型交流潮流方程始终是绕不开的基础电力系统的运行约束根子上就两条节点有功功率平衡、节点无功功率平衡。写成数学形式就是经典的交流潮流方程P_i V_i ∑ V_j (G_ij cosθ_ij B_ij sinθ_ij)Q_i V_i ∑ V_j (G_ij sinθ_ij - B_ij cosθ_ij)这两个式子看着简单但它是整个优化问题非凸性的主要来源。因为电压幅值V和相角θ都是决策变量两个变量相乘问题就变成了非线性优化。很多刚上手的人第一反应是把潮流方程线性化用直流潮流模型替代——这在纯有功调度里确实常见但在无功优化里不行因为直流潮流直接把无功功率和电压幅值给忽略掉了等于把我们要优化的对象“阉割”了。所以在有功-无功协同优化的模型里交流潮流约束是最底层的骨架再往上才是各种机组约束和网络约束。2.2 气网模型Weymouth方程和节点气流平衡气网比电网更容易被忽略但它一点也不简单。天然气系统的核心变量是节点气压p和各管道的流量f。管道流量和两端气压之间的关系通常用Weymouth方程描述f_ij s_ij · C_ij · √(p_i² - p_j²)其中C_ij是管道常数s_ij表示气流方向。这个式子和电网的潮流方程一样也是一个典型的非线性约束而且带根号处理起来比多项式更麻烦。实际建模中常用的做法是做平方差替换把π_i p_i²作为新的变量这样Weymouth方程就变成了f_ij² C_ij²(π_i - π_j)。但注意管道流量可以是双向的这意味着二次方程既有正根也有负根凸松弛能不能收紧直接关系到解的可行性。除了管道方程气网还有三个基本约束气体源注入容量约束、节点气流平衡方程注入负荷流出、节点气压上下限约束。有些模型还会加入压缩机用来补偿长距离管道的压力损耗。压缩机一出现问题难度又上一个台阶因为它会破坏气流的线性平衡关系。做项目的时候我建议先从无压缩机模型开始跑通架构之后再加复杂度否则解决问题和建模问题混在一起很容易陷入泥潭。2.3 耦合元件燃气机组和P2G构成的互联接口电网和气网不是孤立存在的它们通过耦合元件交换能量。最常见的耦合元件有两种燃气机组气转电从天然气系统中消耗天然气发电注入电网。它的气耗特性可以近似表示为二次函数与有功出力直接相关。燃气机组的存在让电网的有功平衡变成了电网和气网一起决定的约束。电转气P2G电转气消耗电力通过电解水制氢再甲烷化生成天然气注入气网。P2G可以消纳新能源弃电同时为气网补充气源是碳中和场景下实现电气互联系统“双向互动”的关键设备。这两类耦合元件把两个系统的变量真正捆绑在了一起。电网里有功和无功的变化会改变P2G的耗电量进而改变气网的注入量燃气机组的出力变化则直接决定气网的气源供给压力。这就是“电气互联”的精髓——它不是简单的边界条件传递而是两个系统在运行约束上的深度耦合。2.4 建模思路为什么用稳态模型这个项目我用的是稳态模型时间尺度取1小时间隔。为什么不考虑动态过程因为优化调度的核心目的是制定小时级的运行计划动态过程由后续的仿真分析去精细校验在优化模型里引入微分和代数约束会让问题变得几乎不可解。稳态模型虽然忽略了气压波的传播过程和电力系统的暂态过程但对日前调度这种应用场景来说精度已经完全够用。这也算是我给新手的一句经验先搞清楚你要回答什么问题再决定模型复杂度不要一上来就上最重的家伙。3. 有功-无功协同优化的数学模型目标函数与约束体系3.1 目标函数经济性、碳排放与网损的加权博弈碳中和目标下的优化模型目标函数不能再只盯着运行成本碳排放必须进目标函数。这个项目的目标函数由三部分组成min C_total C_fuel C_emission C_loss其中C_fuel是常规火电机组和燃气机组的燃料成本。火电用二次成本函数拟合燃气机组用气耗特性折算成本单位统一换算成美元或者人民币均可关键是所有成本项的量纲要一致。C_emission是碳排放成本。常见做法是给系统设定一个碳排放配额超额排放按碳价支付费用。碳价是目标函数里的一个可调参数后面做灵敏度分析时用得上。C_loss是网络损耗的惩罚项把网损按能量价格折算进成本引导优化结果主动压低损耗。目标函数里这三个项的权重直接影响优化结果的风向。如果碳价定得很高优化算法会主动降低燃气机组出力甚至让P2G吸收更多可再生电力哪怕这会提高燃料成本。这就是用经济杠杆体现“碳中和”导向的本质。3.2 约束体系从电网到气网再到耦合元件的完整约束集约束条件按系统边界可以分成三类电力系统约束节点有功功率平衡、无功功率平衡发电机有功/无功出力上下限机组爬坡约束节点电压幅值上下限线路潮流传输容量约束天然气系统约束气源注入容量约束节点气流平衡约束节点气压上下限约束管道流量Weymouth方程约束耦合系统约束燃气机组耗气特性方程P2G转换方程电转气功率与产气量关系气负荷与电网净负荷的耦合关系这里我想特别强调一点很多同行在建模时容易漏掉机组爬坡约束。在互联系统优化里爬坡约束非常关键因为燃气机组之所以有价值就是因为它能快速响应净负荷波动。如果没有爬坡约束优化结果里燃气机组的出力可能会在相邻时段跳变工程上根本没法执行。3.3 协同的核心有功和无功为什么不能分开算在传统的经济调度中有功调度和无功调度通常是解耦的——先算有功出力和机组组合再算无功功率和电压控制。但在电气互联系统里这种解耦已经站不住脚了。原因有三点第一燃气机组和P2G的耦合特性同时影响有功和无功。燃气机组的有功出力决定了气网的气耗量而燃气机组在发出有功的同时也要吸收或发出无功功率无功功率又直接影响节点电压。电压一变线路损耗跟着变网损又反过来影响系统需要的有功总供给。这是一个完整的闭环拆开任意一环结果都会失真。第二电压对有功经济性的影响在新一代电力系统中被放大。新能源机组大多通过电力电子变流器并网单机容量小、数量多无功支撑能力有限。如果只做有功优化不管电压约束潮流计算出来的节点电压偏移可能很大这种结果在实际中根本无法运行。第三P2G作为一种大功率负荷其无功特性同样不可忽略。P2G的电解槽通常需要经过整流器接入电网整流器在吸收有功的同时会消耗大量无功。如果模型里只把P2G当作纯有功负荷那得到的电压分布就会过于乐观实际运行中可能出现电压越限甚至电压失稳。所以在约束体系里交流潮流方程必须完整保留无功变量和电压变量都必须作为决策变量出现这就是“协同”二字的含义。如果你把问题拆成两个独立的子问题——先做有功优化、再算无功优化——那你实际上没有在解决协同问题只是在跑一个序贯算法。4. Matlab代码实现的关键路径从工具选型到代码架构4.1 工具链选型为什么是Yalmip而不是纯手写求解器电气互联系统的优化模型是一个大规模非线性规划问题推荐用Yalmip建模再调用外部求解器求解而不是在Matlab里手写罚函数或者梯度下降。原因很简单模型本身已经足够复杂手写求解算法会把建模和算法调试混在一起出问题根本分不清是模型错了还是算法错了。我用的工具链是组件选型作用建模语言Yalmip把目标函数和约束用接近数学的形式描述求解器IPOPT / Gurobi求解非线性规划或凸化后的二次约束问题数据平台Matpower读取IEEE节点系统的线路、负荷、发电机参数数据预处理Excel / CSV气网节点、管道、气源参数准备需要说明的是Yalmip支持非线性约束的直接建模IPOPT是内点法求解器对付中小规模的非线性规划问题很稳定。如果模型规模扩大到几千个节点或者气网非线性约束特别复杂建议用凸松弛技术先把问题转化再用Gurobi这种商用求解器求解。算例规模相对较小时IPOPT的默认配置就够用了。4.2 数据准备与节点系统构建这个项目我使用的是修改后的IEEE 39节点电力系统与20节点天然气系统耦合而成的互联测试系统。你当然也可以用IEEE 30节点配合一个7节点或10节点的简化气网只要数据量能支撑你的结论就行。关键是电力系统和天然气系统的耦合点要对上燃气机组挂在哪个电网节点对应的气网节点就是它的气源抽取点P2G挂在哪个电网节点它的产气就注入对应的气网节点。数据的准备有几点提醒把电力系统和气网的数据单位统一。电网常用pu值气网常用psi或者bar、kg/s不统一的话优化结果会非常混乱。燃气机组的气耗曲线要在标幺值系统下重新拟合。把厂家给的额定工况数据换算成优化模型所用的基准值否则约束松弛甚至约束违反都不容易察觉。4.3 主程序架构与Yalmip建模代码整个Matlab实现的主程序框架大致如下%% 数据加载 mpc loadcase(case39); % 电网数据 gasData loadGasData(gas20.xlsx); % 气网数据 %% 决策变量定义 nb size(mpc.bus, 1); ng size(mpc.gen, 1); ns size(gasData.source, 1); Pg sdpvar(ng, 1); % 机组有功出力 Qg sdpvar(ng, 1); % 机组无功出力 V sdpvar(nb, 1); % 节点电压幅值 Theta sdpvar(nb, 1); % 节点电压相角 Gs sdpvar(ns, 1); % 气源注入流量 Pi sdpvar(ngas, 1); % 气网节点压力平方 %% 目标函数 Objective sum(fuelCost) sum(emissionCost) lossPenalty; %% 约束条件 Constraints []; % 节点有功/无功平衡约束、Weymouth方程、耦合约束等写入Constraints %% 求解 ops sdpsettings(solver, ipopt, verbose, 1); optimize(Constraints, Objective, ops);核心约束的建模代码要逐个写清楚比如燃气机组的耗气特性约束% 燃气机组耗气特性 for k 1:ngasUnit Constraints [Constraints, GasConsume(k) a(k)*Pg(gasIdx(k))^2 b(k)*Pg(gasIdx(k)) c(k)]; Constraints [Constraints, GasConsume(k) GasFlow(gasNodeIdx(k))]; endP2G的耦合约束类似% P2G转换关系 Constraints [Constraints, GasProduce eta_p2g * P_load_p2g];代码本身并不复杂真正的复杂度在调试阶段。我会在后面的章节专门讲调试中遇到的那些“坑”。4.4 求解器调用与结果处理Yalmip的好处是可以在一行代码里切换求解器。IPOPT求出来的结果要仔细检查Yalmip的求解返回值solinfo.solver 0 表示求解成功非零值则要查看具体的退出标志。内点法经常出现的问题是收敛到一个“看起来可行”但是KKT条件不严格的点这时需要检查原始残差和对偶残差不要只看目标函数值就收工。结果处理的要义是把决策变量还原成物理量。比如电压幅值如果是pu值还原成kV天然气流量还原成m³/h或者kg/s碳排费用还原成吨碳成本。用表格汇总各机组出力、电压分布、气网压力、碳排放量等核心指标后续做场景对比就一目了然。5. 算例验证与结果分析协同优化到底带来了什么5.1 测试系统参数配置我先交代一下算例的基础数据。电网取IEEE 39节点系统包含10台发电机其中3台设为燃气机组分别连接气网的3个节点。气网取20节点系统包含3个气源、2台压缩机建模时暂时把压缩机视为恒压节点简化处理。风光机组在3个节点上以负的负荷形式接入分别模拟不同渗透率场景20%、40%、60%。P2G设备设计容量为50MW转换效率取60%。5.2 场景设计与对比逻辑为了验证协同优化的价值我设置了三个对比场景场景优化模式碳价$/t说明S1有功单独优化 事后无功校验20传统两阶段方法的模拟S2有功-无功协同优化20本文模型求解S3有功-无功协同优化50高碳价政策场景这里的S1是现代电力系统优化里最常见的“简配”做法先用直流潮流或者经典经济调度算出有功计划然后交给潮流计算程序校核电压和线损若电压越限再手动调整无功补偿。这种做法省事但结果常常在高压大负荷场景下暴露问题。5.3 结果解读协同优化到底带来什么直接说结论这个算例跑出来的结果非常有代表性网损下降明显S2场景的系统总网损比S1下降了约8.5%。这个降幅主要来自两个途径一是协同优化把电压水平整体抬高到更优区间减少了无功流动带来的附加损耗二是燃气机组和P2G的出力安排更加协调避免了长距离功率输送。电压分布显著改善S1在所有场景下都有2个节点电压越下限需要额外投切电容器组才能恢复S2无需额外补偿电压偏移标准差降低了30%以上。碳排放强度下降在碳价20美元/吨时S2比S1的系统碳排放量低4.2%。原因在于协同优化更准确地计算了燃气机组在降低电压损耗和支撑系统灵活性方面的价值使燃气机组替代了部分效率较低的火电机组调峰任务。目标函数值全面占优S2的系统总成本比S1低3.7%注意S2的电量结构里燃气的发电量反而略高但网损和电压矫正成本的下降抵消了这部分开支说明协同优化不是简单的“降成本”而是把成本在各维度上重新分配。这个结果很有力地回答了一个问题做协同优化不是数学上“更精致”而已它是真的能带来可量化的收益。5.4 碳价的灵敏度分析碳价是碳中和政策最直接的信号。我对碳价从10美元/吨扫到100美元/吨间隔10美元每一步重新求解优化模型记录系统碳排放总量、燃气机组发电占比和P2G投入量。结果呈现出明显的三阶段特征碳价在10-30美元区间时系统碳排放总量下降缓慢。因为碳成本在总成本里占比不大优化模型更倾向于调整机组出力的轻量级措施比如把效率略低的火电机组压出力。碳价在40-60美元区间时碳排放总量出现显著拐点。这个区间内P2G开始持续投入运行燃气机组的发电占比上升系统从“碳价格信号”转向“低碳结构转型”。碳价超过70美元时碳排放总量趋于饱和继续提高碳价收益递减。此时碳减排的瓶颈已经不是经济信号不够强而是系统本身的灵活性资源已经用完了。这个结论对政策制定有参考意义对做研究的人也有价值。当你的模型能复现这种三阶段特征说明目标函数和约束体系的耦合关系设置是合理的模型具备了回答政策问题的能力。只停留在“我的方法比对比方法好”这个层面是把算例做浅了。6. 实操中容易踩的坑与个人经验6.1 不收敛的几类情况模型跑不收敛是这个项目调试阶段最磨人的地方。我遇到的典型情况有三类第一类初值选择不当导致内点法陷入局部不可行。IPOPT对初值敏感尤其是电压幅值初值如果设得太低比如全设成0.9 pu非线性潮流约束很可能在迭代早期就找了一堆违反严重的解。我的解决办法是用Matpower先做一次潮流计算把潮流收敛后的电压幅值和相角作为优化模型的初值。这个习惯我一直保留效果立竿见影。第二类单位不统一导致Weymouth方程量纲失衡。有次气网压力用的是bar管道流量用的是kg/s而电功率用的是MW结果求解器反复横跳就是不收敛。最后查出来是因为目标函数里碳成本单位美元和燃气成本单位美元虽然一致但在约束里压力平方和功率的单位差了将近4个数量级导致雅可比矩阵的条件数极大。统一单位到标幺制之后问题立刻缓解。第三类P2G耦合变量导致约束不可行。P2G的转换效率比较低实际工程中约60%-70%意味着它消耗大量电能却只能产生少量的天然气。如果气网节点压力处于高位产气可能直接违反管道压力约束。这时模型可能返回“不可行”很多人习惯去调求解器容忍度但真正的解决办法是给P2G的气网侧设定一个虚拟的“弃气”出路或者允许P2G降功率运行。我后来把P2G的产气量设为可调节变量并允许在极端工况下部分弃气模型就稳定了。6.2 结果合理性校验每次求解完别急着出图写报告。我给自己定了一个习惯性检查清单所有机组的有功出力是否满足上下限燃气机组的出力是否为整数倍的离散值如果有抽气式机组还要检查供热约束。所有节点电压是否在0.95到1.05 pu的安全区间内。气网节点压力是否满足约束且不是在边界上硬“卡住”的。目标函数里各项成本拆解后看占比出现极端不合理的配比比如网损成本占了80%就要警惕模型是不是有bug。把优化出的有功出力代回Matpower做一次潮流验证看潮流能否收敛。如果潮流不收敛或者收敛点与优化结果明显收缩优先检查电网数据是否有错。其中第5条特别重要。优化模型和潮流计算是两种不同的数值引擎优化结果“欺上瞒下”的情况并不少见。协同优化模型里求解器找到了一个满足所有约束的数学解但在真实潮流程序里这个解无法成立大概率是交流潮流约束的残差容忍度设置得过松。把求解器的feastol从1e-6收紧到1e-8通常能解决问题。6.3 扩展方向与我的后续计划这个模型跑通之后扩展空间很大。我个人认为最有价值的方向有三个一是加入不确定性。风光出力预测误差和负荷波动是碳中和场景下绕不开的不确定性源。可以把这个确定性模型扩展为两阶段随机规划或鲁棒优化。第二阶段用场景还原法采样把不确定性变量在第二阶段的决策中体现。模型规模会成倍增长但物理意义更完整。二是把时间尺度拉长加入机组组合变量。目前的模型假设机组始终在线只优化出力分配。实际运行中碳中和背景下燃气机组可能需要在部分时段启停加入机组启停的0-1变量后问题会变成混合整数非线性规划MINLP。如果直接用YalmipGurobi求解需要对非线性约束做分段线性化处理。三是融入碳排放流的概念。现在的碳成本还是基于发电量核算属于“生产侧碳责任”。对负荷侧征收碳排放责任碳排放流可以追踪每一度电的碳足迹把电网变成“碳责任分配平台”。把碳排放流约束加进协同优化模型会让研究更有政策导向性。最后说一个我个人的小体会。这类模型不是写出来就能用的调试时间往往占整个项目的70%以上。如果你刚接触这个方向建议先用一个很小的测试系统——比如IEEE 14节点配一个5节点气网——把整个代码链路走通确认每一个约束都在起作用之后再换大规模系统。直接上大系统遇到不收敛连定位问题都无从下手。另外养成把每一次求解的日志保存下来的习惯。等模型出问题的时候翻日志往往比闷头调代码效率高得多。
返回列表