☰
碳中和下电气互联系统有功-无功协同优化模型及Matlab实现
2026/9/30 15:30:33 网站建设 项目流程

做无功优化的同行应该都有体会,传统教材里讲“无功优化”,基本等价于调电压、降网损,目标函数写来写去就那么几项,算例也基本都在纯电网环境里折腾。但这两年做实际项目,风向完全变了:拿过来的系统往往是电网、天然气网甚至热网拧在一起的综合能源系统,目标也从“网损最小”变成了“碳排放、购电购气成本、新能源弃电”揉在一起的多目标问题。我这个项目标题看起来不短——“‘碳中和’目标下电气互联系统有功-无功协同优化模型”,但本质上要解决的问题非常聚焦:把电气互联系统中原本分开做的有功调度和无功电压控制放到同一个优化框架里,让电网和气网的耦合设备(燃气轮机、P2G)真正参与调节,最终给出一个能直接在Matlab里跑起来的求解方案。这篇博文会把模型怎么建、决策变量怎么编排、约束条件怎么处理、求解器怎么配,以及我实际跑代码时踩过的坑,完整过一遍。适合准备做电气互联系统优化研究的同学,也适合工程上需要把协同优化落到代码里的工程师。

1. 项目整体思路与核心问题拆解

1.1 碳中和目标到底给无功优化加了什么新约束

过去做无功优化的核心假设是:电网里有一堆火电机组,既能发有功,也能发无功,电压稳定性和频率稳定性基本靠它们撑着。但碳中和目标下的电源结构完全变了:风机、光伏大规模并网,这类新能源机组的可调无功能力很弱,而且出力是间歇性的;与此同时,煤电被压缩,碳排放约束又让火电要么降出力、要么上碳捕集,导致传统“靠同步电源扛电压”的体系越来越吃力。

更关键的是,碳排放本身成了一种有价格的资源。当碳价进入调度模型后,一台机组发多少有功不再只取决于煤价和气价,还要看它每发一度电产生多少碳、要付多少碳税。这个变化直接影响了发电组合,而发电组合变了,系统的无功分布和电压水平又会跟着变。也就是说,在碳中和背景下,有功优化和无功优化已经不能被拆开看了——你调有功改变了机组出力组合,无功支撑能力随之改变;你调无功改变了电压分布,网损和有功需求也跟着变。

1.2 电气互联系统:一张电网和一张气网互相牵制

电气互联系统说白了就是电力系统和天然气系统通过耦合元件绑在一起。两个最典型的耦合设备是燃气轮机和P2G(电转气):燃气轮机烧天然气发电,是“气转电”;P2G用富余的电电解水制氢或合成天然气,是“电转气”。

打个比方,天然气网像一条地下的能源管道网,电网像一条悬在空中的电力网,燃气轮机和P2G就是两个网之间的“换乘站”。换乘站的存在让两边不再是独立系统:气网供气的压力、流量会限制燃气轮机的发电出力;电网低谷时段的富余电力又可以通过P2G转成天然气,反过来影响气网的流量分布。这种强耦合关系意味着,任何一边的边界条件变了,另一边都会受到传导影响。所以我在这套模型里没有把气网简化为一个无限供气的“理想气源”,而是把它建成了带节点压力、管道流量、气源出力上限的完整网络模型。

1.3 有功-无功为什么要协同优化,而不是解耦分步算

行业内以前有一种简化做法:先做有功经济调度,确定机组出力,再做无功优化,确定电压和变压器分接头。这个流程在电源结构单一、系统裕度大的时候勉强能用,但在电气互联系统里有两个硬伤。

第一个硬伤是电流的物理特性决定的。交流潮流方程里,有功功率不仅跟电压相角有关,也跟电压幅值有关;无功功率同样同时受相角和幅值影响。把两个变量硬拆成两个顺序问题,本质上等于忽略了它们之间的耦合项。

第二个硬伤是耦合设备的行为没法归到单一类别。燃气轮机的发电有功受气网供气约束,但它本身又是同步电机,它的无功容量极限会随有功出力变化(P-Q容量曲线)。P2G运行时消耗有功,本身也需要无功支撑,等于在电网里平白多了一个无功负荷。这些设备如果不在同一个优化模型里同时看到“有功侧”和“无功侧”,就没法合理调度它们。

所以这个项目的核心思路是把两个网络、两个优化维度、两类决策变量一次性塞进一个优化问题里,求解器同时给出有功出力、无功出力、节点电压、气源供气量和P2G运行功率,而不是分阶段迭代。协同优化的本质不是“分步走”加一个反馈修正,而是“一起算”。

2. 协同优化模型:目标函数与约束条件

2.1 目标函数怎么设计:经济、碳排、网损一次收敛

大多数碳中和背景下的优化模型都不会做真正意义上的多目标加权模糊处理,而是把碳排放折算成成本,放进一个单目标函数里。我也采用这个思路,目标函数形式如下:

min F = ΣC_G,i(P_G,i) + ΣC_gas,j(f_g,j) + τ_carbon × E_total + λ_loss × P_loss

第一项是常规发电机的燃料成本,采用二次函数C_G,i = a_i·P² + b_i·P + c_i,其中a、b、c是燃料成本系数。第二项是天然气网络中气源节点的购气成本,一般用线性或分段线性函数,单位和电网侧一样要折算成元/小时。第三项是碳排放成本,τ_carbon是碳价(元/吨),E_total是系统总碳排放量(吨/小时),包括煤电排放、气电排放。第四项是网损惩罚项,P_loss是全网的支路有功损耗,λ_loss取一个电价折算系数,代表“少损耗一兆瓦时电量相当于多卖一兆瓦时电”的边际收益。

实际编程时有一点要注意:目标函数里各项的数量级差异可能极大。机组二次成本动辄几千上万元每小时,碳排放成本在小碳价下可能只有几百元每小时,网损惩罚项乘出来可能只有几十元。如果不做任何处理,求解器会把注意力放在量级最大的项上,小幅改善大头成本,而完全忽略网损和碳排的优化。我的处理办法是给每一项做归一化,用各自初始点的值做基准,把四项都压到同一量级,再放进目标函数。

2.2 电网侧的等式与不等式约束

电网部分的约束主要来自交流潮流方程。对每个节点i,有功和无功注入必须满足:

P_inj,i = V_i · ΣV_j · (G_ij·cosθ_ij + B_ij·sinθ_ij) Q_inj,i = V_i · ΣV_j · (G_ij·sinθ_ij − B_ij·cosθ_ij)

其中P_inj,i是该节点的发电机有功注入减去负荷有功需求,Q_inj,i同理。G和B是节点导纳矩阵的实部和虚部,θ_ij是节点i和节点j的相角差。这套方程是典型的非线性等式约束,必须在优化问题里作为ceq返回给求解器。

不等式约束则包括:

  • 节点电压幅值上下限:常规取0.95pu到1.05pu,新能源接入比例高的节点建议把上限稍微放低,比如1.02pu,防止电压偏高触发逆变器脱网。
  • 发电机有功和无功出力上下限:有功上限来自机组额定容量,无功上限来自P-Q容量曲线,我为了方便把无功上限做成了随有功出力变化的函数,而不是固定常数。
  • 支路潮流传输极限:如果跑稳态潮流后发现有支路过载,可以在不等式约束里加入支路电流或视在功率限制。不过我实测下来,这个约束会让雅可比矩阵的计算量明显变大,如果算例场景不涉及严重过载,可以暂时不启用。

电网侧还有一个容易忽略的细节:基准功率。我在模型里所有功率量都转换到标幺值(pu)下计算,基准功率取100MVA,但天然气网络里的功率和流量用的是实际单位(MW、kg/s),天然气热值、转换效率这些参数全都涉及单位换算。编程时我在数据文件里把“换算因子”集中定义,避免每个函数里各写一套。

2.3 天然气网络侧的约束建模

天然气网络的建模是很多人第一次写这类模型时最头疼的部分。我用的方法是节点流量平衡加管道流量方程。每个气网节点的净流入流量必须为零:

Σf_mn + W_supply,i − L_load,i − F_gt,i + F_p2g,i = 0

其中f_mn是通过管道mn的流量,W_supply是气源供气量,L_load是纯气负荷,F_gt是燃气轮机耗气,F_p2g是P2G产气。这个等式中F_gt和F_p2g就是电气互联的耦合项。

管道流量采用经典的Weymouth稳态方程:

f_mn = sign(p_m² − p_n²) · C_mn · sqrt(|p_m² − p_n²|)

C_mn是管道常数,与管径、长度、摩阻系数有关;p_m和p_n是管道两端节点压力。这个方程有两个特点:非线性很强,且有方向性——天然气的流向取决于压力差的正负。直接写进约束时,要注意在Matlab里用sign乘以sqrt绝对值,避免出现负数开根号的复数问题。

气源节点还有一个压力上下限约束。气源不是“要多少给多少”,压力上限限制最大供气能力,压力下限保证管网末端用户的用气压力。我把气源压力、节点压力全部加了下限0.7pu,上限1.2pu,以初始稳态解为基准做的标幺化。

2.4 燃气轮机和P2G耦合元件的建模细节

耦合元件怎么建,直接决定了模型能不能真实反映电气互联效果。燃气轮机这里,我用线性近似把有功出力映射为耗气量:

F_gt = α_gt + β_gt · P_gt

其中α_gt是空载气耗,β_gt是增量气耗系数。这个线性近似对中小型燃气轮机够用,如果要精确可以考虑二次函数,但会增加不少非线性求解负担。P2G则反过来:

F_p2g = η_p2g · P_p2g / H_N

H_N是天然气高位热值,η_p2g是电转气的综合转换效率。我在算例里用的效率是0.6,即1MWh电转成天然气的热值约为0.6MWh当量。P2G的运行功率有上下限,下限一般取额定功率的10%到20%,因为电解槽设备很少允许零负荷运行。

这两个耦合设备建在哪个节点上也有讲究。燃气轮机通常建在电网负荷中心节点,同时连着气网的某个中间节点;P2G则更适合建在新能源富集节点附近,这样才能把本来要弃掉的电转成气存储。我在IEEE30节点算例里把P2G放在了风电接入节点,燃气轮机放在最大负荷节点,这样能最直观地看到电气互联带来的时空互补效果。

3. Matlab实现:代码架构与求解配置

3.1 代码文件的组织方式

这个项目我按“数据、模型、求解、可视化”四层来组织文件,避免把所有逻辑堆在一个脚本里。整个目录结构如下:

|-- main.m % 主程序,读取数据、编排变量、调用求解器、输出结果 |-- dataIEEE30Gas.m % IEEE30节点电网数据 + 6节点天然气网数据 |-- objFun.m % 目标函数,输入x,输出F |-- nonlcon.m % 约束函数,输入x,输出c和ceq |-- extractX.m % 把决策向量x拆解成Pg、Qg、V、theta等子向量 |-- plotResult.m % 电压剖面、机组出力、气源流量绘图

main.m里第一步调用dataIEEE30Gas.m加载数据,第二步构建决策变量的上下界lb和ub,第三步设置初始点x0,第四步调用fmincon。这里强烈建议把“决策变量顺序”写成一个注释表放在main.m顶部,比如“x(1:6)是6台发电机的有功,x(7:12)是无功,x(13:42)是30个节点的电压幅值……”,不然调试时你会无数次忘记第37个变量到底代表什么。

3.2 决策变量编排与索引封装

决策变量向量的编排顺序看起来简单,实际是这类代码最容易翻车的地方。我的编排如下:

% x = [Pg(1:NG); Qg(1:NG); V(1:Nbus); theta(1:Nbus); ... % P_p2g; F_supply(1:NGasSource); p_node(1:NGasNode)]

电力系统部分:6台发电机的有功出力、6台发电机的无功出力,30个节点的电压幅值(标幺值)、30个节点的相角(弧度)。电气互联系统部分:1个P2G的运行功率,2个气源节点的供气量,6个气网节点的压力。总共是6+6+30+30+1+2+6=81个决策变量。

为了在目标函数和约束函数里不每次重复写索引,我封装了一个extractX函数:

function [Pg, Qg, V, theta, P_p2g, F_sup, pNode] = extractX(x) % 电力部分 Pg = x(1:6); Qg = x(7:12); V = x(13:42); theta = x(43:72); % 互联与气网部分 P_p2g = x(73); F_sup = x(74:75); pNode = x(76:81); end

这样做的好处是:如果后续你想加储能、加需求响应、加氢能设备,只需要扩展一个子向量和对应的索引注释,目标函数和约束函数里不用大改。

3.3 目标函数与约束函数的关键代码段

目标函数里最核心的是碳排放计算和网损计算。碳排放我这里只算供给侧的直接排放:煤电排放系数乘以煤电有功出力,加上燃气轮机耗气量对应的排放系数。风电和光伏是零碳排。

function F = objFun(x) % 提取决策变量 [Pg, Qg, V, theta, P_p2g, F_sup, pNode] = extractX(x); % 机组燃料成本(元/h):a*P^2 + b*P + c genCost = sum(a .* Pg.^2 + b .* Pg + c); % 气源购气成本(元/h) gasCost = sum(gasPrice .* F_sup); % 碳排放成本(元/h) E_coal = EF_coal .* Pg(1:coalGen); % 煤电排放,t/MWh E_gas = EF_gas .* F_gt_cons; % 燃气耗气排放,t/MWh当量 E_total = sum(E_coal) + sum(E_gas); carbonCost = carbonPrice * E_total; % 网损惩罚项(先算各支路损耗) lossMW = calcLoss(V, theta, Ybus); lossPenalty = lambda_loss * lossMW; % 汇总 F = genCost + gasCost + carbonCost + lossPenalty; end

约束函数里,电网功率平衡用2×Nbus个等式约束,气网节点流量平衡用NGasNode个等式约束,电压和压力上下限用不等式约束。核心代码结构如下:

function [c, ceq] = nonlcon(x) [Pg, Qg, V, theta, P_p2g, F_sup, pNode] = extractX(x); % 电网潮流等式:节点注入功率等于潮流方程计算值 [P_calc, Q_calc] = calcPowerFlow(V, theta, Ybus); ceq(1:Nbus) = P_inj(x) - P_calc; ceq(Nbus+1:2*Nbus) = Q_inj(x) - Q_calc; % 气网流量平衡 ceq(2*Nbus+1:2*Nbus+NGasNode) = gasFlowBalance(x); % 不等式约束:电压上下限、压力上下限、支路限流等 c = [V - Vmax; Vmin - V; pNode - pMax; pMin - pNode; ...]; end

这里我专门提一句:ceq和c的顺序不能乱,fmincon靠索引判断哪个约束不满足,所以约束函数里每一行写清楚对应哪个节点哪个方程非常重要。调试时可以临时在nonlcon里设置断点,打印max(abs(ceq)),快速定位是哪一类方程不满足。

3.4 求解器选型与参数配置

对这类带非线性等式约束和不等式约束的优化问题,Matlab内置的fmincon是最省事的选择。我用的求解配置如下:

options = optimoptions('fmincon', ... 'Algorithm', 'interior-point', ... 'Display', 'iter', ... 'MaxIterations', 3000, ... 'MaxFunctionEvaluations', 50000, ... 'OptimalityTolerance', 1e-6, ... 'StepTolerance', 1e-8, ... 'ConstraintTolerance', 1e-6);

选内点法而不是SQP,是因为这类模型约束规模不小(我这里有60个潮流等式约束加6个气网等式约束),内点法在处理大规模稀疏非线性规划时收敛性更稳定。SQP的优点是迭代步长比较直接,但碰到潮流方程这种强非线性约束,容易在迭代途中跑到无解区域,反而不如内点法的“障碍项”来得平滑。

求解器选型也可以做对比实验:

求解方案适用场景优缺点
fmincon内点法中小规模、约束复杂收敛稳,但易陷入局部最优
fmincon SQP变量少、约束简单迭代快,但对初值敏感
YALMIP+外部求解器需要形式化建模可读性好,但安装配置复杂
遗传/粒子群+内点法大规模多局部极值全局搜索强,但耗时高

对于81个变量的模型,内点法通常在几十秒内能收敛。我建议先用内点法跑通,如果后续扩展成动态多时段模型、变量上千,再考虑混合求解策略:先用粒子群粗搜一组好初值,再交给内点法精修。

4. 算例设计与结果分析

4.1 测试系统选择与数据修改

算例系统我用了修改版IEEE30节点电网加一个6节点天然气网。IEEE30节点系统是电力系统优化的标准测试系统,支路参数、机组参数都有公开数据,方便复现。气网部分我是按参考文献里的6节点天然气系统改的,两个气源分别放在气网节点1和节点6,燃气轮机接在电网最大负荷节点对应的气网节点上,P2G接在电网风电接入节点附近。

修改的地方主要有三处:一是加大了新能源渗透率,在节点12和节点22各加了一个风电场,装机容量分别是50MW和80MW;二是把原有6台火电机组中的一台替换为燃气轮机,让它通过气网供气;三是把常规负荷调高到和新能源装机匹配的程度,制造“低谷期风机出力接近负荷”的场景,这样P2G才能发挥作用。

所有计算都在标幺值下进行,基准容量100MVA。天然气网络里的压力基准是5MPa,流量基准按能量流换算成MW。这一步换算要特别小心,我在代码里写了十几个“单位换算常量”,比如1kg天然气约等于13.9kWh热值,管道常数C_mn是直接抄文献还是自己算,对结果影响很大。我建议文献里的管道参数能直接用的尽量用,别自己推导,否则调一个晚上都调不平。

4.2 三种场景对比:从解耦到协同的梯度验证

为了说明协同优化的价值,我设计了三个场景做递进式对比:

  • 场景A:独立无功优化。只优化无功,固定有功调度结果为初始值,目标只有网损和电压偏差,不接气网、不算碳排。
  • 场景B:有功经济调度+碳税,但气网固定。有功调度考虑煤电、气电和碳价,但天然气网络只是简单一个固定供气成本的理想源,不做压力约束。
  • 场景C:本文完整模型。电气互联+有功无功协同+碳税+P2G可调。

三种场景的负荷曲线、风电出力完全一致,碳价统一取100元/吨。

跑完后的结果对比如下:

指标场景A(独立无功)场景B(有碳税但气网理想化)场景C(完整协同模型)
系统总运行成本(元/h)入口条件固定,约3.12万2.86万2.71万
碳排放总量(t/h)约42.536.832.1
全网有功损耗(MW)8.99.67.3
最低节点电压(pu)0.980.940.97
求解时间(s)82147

这个结果很有代表性。场景A虽然网损控制得不错,但因为固定了有功出力,碳排放成本完全没被优化,总成本是最高的。场景B引入了碳税,发电组合向气电转移,碳排明显下降,但因为气网被理想化,没有约束燃气轮机的实际供气能力,同时也没靠P2G调整新能源出力,导致最低电压差点越限。场景C把电气互联、P2G、天然气约束全部纳入后,低谷时段富余风电被P2G消纳转化成气,峰荷时段燃气轮机再把这部分气发成电,碳排进一步下降,网损反而降到最低。

4.3 从结果倒推:协同优化为什么能同时省钱又省碳

看结果不能只看表,还得解释机理。场景C的最优解里,P2G的出力曲线和风电曲线高度一致:夜间风电功率高、负荷低,P2G启动吸收多余电力,把电能变成天然气存储;白天负荷上升,燃气轮机用气发电补足缺口。等效于气网成了电网的“储能池”。

无功侧的价值体现在电压水平上。场景C的电压最低点0.97pu,明显高于场景B的0.94pu。原因有两方面:一是P2G接入点比纯风电接入点多了无功支撑手段,二是协同优化让燃气轮机在有功出力选择时兼顾了其无功能力,没有单纯为了降煤耗把某台机组压到过低出力,导致无功供给不足。

另外我还做了一个敏感性实验,把碳价从0元/吨摸到200元/吨,观察碳排放总量的变化。结果是碳价越高,P2G出力越大,燃气轮机占比越高,碳排放下降,但气源购气成本上升。这个结果说明模型的行为符合预期:碳价是驱动电气互联系统“电气转气再转电”空间套利的关键信号。

5. 常见问题与调试实录

5.1 潮流方程怎么调都收敛不了

这是这类项目里最常遇到的坑,我自己的经验是,大概率不是模型错了,而是初始点距离可行域太远。fmincon内点法虽然鲁棒,但它在一个完全不可行的初始点附近,经常陷入“约束矛盾导致步长缩小到接近零”的僵局。

解决办法是“热启动”:先用一个简化的牛顿法潮流计算程序,算出常规电网的电压和相角解,然后把潮流解作为优化问题的初始点。这个做法能减少95%以上的初值问题。具体来说,先用mpower这类工具或自己写一个极坐标牛顿法,求解一次纯潮流,得到V0和theta0,再把它塞进x0的对应位置。气网部分同理,先把气网稳态流量算一遍,得到压力初值。

如果真的碰到“可行解不存在”,先检查约束之间是否矛盾。常见原因是变压器变比上下限卡得太死,或者气源最大供气量不够燃气轮机发电需求。调试时我用过一个土办法:把全部不等式约束的上限放大10倍,看等式约束能不能满足。如果放大后等式还是不平,说明等式约束本身写错了;如果等式平了但不等式调不回来,说明可行域真的不存在。

5.2 目标函数各项量级差太多导致优化方向被绑架

前面说过,成本项、碳排项、网损项量级差异大。如果你发现优化结果里网损没变小、碳排放也没变低,只有发电燃料成本在降,大概率就是量级问题。这一步没有捷径,就是把每一项在初始点的值打印出来看看,确认它们都在同一量级。我习惯把四项成本在初始点的值除以总成本,换算成百分比权重,然后手动调节归一化系数,让四项占比大致在40%、30%、20%、10%这个区间,再交给优化器。

5.3 matlab安装与版本兼容性:optimoptions参数报错也是坑

这个项目依赖Matlab优化工具箱,我建议用R2023b以上版本,新版本的内点法实现更稳定,而且optimoptions函数对各算法的参数校验更严格。严格是好事,但也会带来一个常见问题:你在老版本写的options参数名,到新版本会直接报错,比如“MaxFunEvals已更改为MaxFunctionEvaluations”。这种报错网上搜索一下就能解决,但别以为是代码逻辑问题。

还要注意一个正版环境的问题:Matlab的许可证激活偶发报错,尤其在学校或单位把实验室的旧license文件混用的情况。MathWorks官方下载安装和激活的工具链其实很成熟,直接从官网或学校正版授权渠道走流程就好。我自己遇到过装完启动后闪退的情况,最后定位是电脑上旧版本MATLAB的路径环境变量残留,把注册表里老版本路径清理干净就正常了。正版授权机制虽然偶尔折腾,但比用来路不明的所谓绿色版稳定得多,排查起来也更有据可循。

5.4 求解时间过长:分阶段初值与变量松弛

81个变量其实不大,但如果你把天然气压力、所有节点电压、相角全部同时作为优化变量,某些matlab版本的内点法会比较慢,尤其是约束函数里潮流方程要重新组装一次的时候。实测来看,61秒到2分钟是正常的,但如果超过5分钟,大概率是约束函数写得不高效。

排查技巧:约束函数里不要每次都重新算节点导纳矩阵Ybus,把它设为全局变量或嵌套函数共享变量,只算一次。还有就是如果发现某次求解耗时爆炸式增长,可以尝试把部分等式约束转化成不等式约束的“松弛”形式,比如把“节点注入功率等于潮流计算值”放宽为“注入等于计算值的误差小于1e-4”。这样性能快很多,代价是结果精度略降,但用于方案预研完全够。

一点个人经验

我实际做完这个项目的体会是:协同优化模型的代码并没有比传统无功优化复杂多少,真正的成本在建模细节和调试。数据单位、决策变量索引、初始点这三点控制好,你就能从一个“看起来很高大上”的数学模型,得到一个能稳定收敛的实用程序。如果准备自己复现,我强烈建议先用一个小系统(比如5节点或14节点电网加3节点气网)把框架跑通,再上IEEE30这个规模。这个模型后续还可以继续扩展:把单时段变成24小时滚动优化,加入储能和氢能设备,碳价改成阶梯式碳税,都是现成可以往下做的方向。电气互联系统的调度问题,跟着碳中和的节奏走,后面需要解决的场景会越来越多。

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询