☰
交直流混合配电网潮流计算:统一求解法的Matlab实现与关键技巧
2026/9/30 8:27:32 网站建设 项目流程

做交直流混合配电网潮流计算时,我最开始用的也是教科书里常见的交替迭代法,AC网和DC网各算各的,换流器功率在两个网络之间来回传递。但碰到直流母线多、交流侧分布式电源出力波动大的场景,迭代经常会走到死胡同:要么震荡,要么直接发散。后来换成统一求解法,再把牛顿-拉夫逊的全流程用Matlab实现,才算把这套系统稳稳跑起来。这篇文章就记录这次实现的完整过程,包括数学模型、编码细节和几个我花了不少时间才填平的坑。

交直流混合配电网不是把交流潮流和直流潮流两套程序拼起来就完事。交流部分的节点电压相角、直流节点的电压幅值、换流器的控制变量,彼此之间存在强耦合。这篇文章适合正在做配电网潮流、分布式光伏/储能并网、柔性直流配网研究的同学,尤其是想自己写代码而不是只调工具箱的人。看完之后你能理解统一求解法的方程组织方式,也能照着把Matlab主程序、雅可比矩阵组装、算例验证这条链路搭起来。

1. 交直流混合配电网潮流计算的难点与统一求解法的切入点

1.1 交流系统和直流系统的耦合关系到底耦合在哪

配电网里的直流部分通常通过电压源型换流器(VSC)接入交流母线,直流母线上再挂光伏、储能和直流负荷。交流侧和直流侧在换流器这个位置并不是简单地“功率相加”,而是有一套完整的状态约束:交流侧注入换流器的有功功率,决定了直流侧母线功率的输入;直流侧的电压水平,又反过来影响换流器交流侧的无功支撑能力。换句话说,交流节点的电压相角、直流节点的电压幅值、换流器内部控制量这三个层面的变量,必须放在同一个方程体系里才能互相制约。

我举个例子:直流母线电压因为光伏出力突然上升而升高,VSC为了维持直流电压,会调整有功输出方向,这个调整会立刻改变交流节点注入功率,交流节点电压和相角重新分布;而交流侧电压的变化,又会让换流器内部电流、损耗以及无功上限全部跟着变。这种双向反馈如果拆开迭代,A网络算完得到边界条件传给B网络,B网络算完再传回A网络,每一步都只能“凭上一次的结果猜下一次”,强耦合时很容易来回震荡。这也是我后来坚持用统一求解法的根本原因。

1.2 为什么我最终选了统一求解法而不是交替求解法

交替求解法的程序结构确实诱人:交流潮流用现成的Matpower或牛顿法算完,把换流器有功、无功当作直流侧的电源注入,直流网络用线性方程G_dc*U_dc=I解一遍,然后把直流功率反馈到交流侧,循环直到偏差小于阈值。问题在于,这个方法只适合“直流部分简单、耦合弱”的情况。一旦直流侧有多个VSC、多个控制模式,或者交流侧重载、R/X比较高,交替迭代的步长很容易绕着一个极限环打转,怎么调松弛因子都压不下来。

统一求解法的思路是放弃“两个网络分开算”的幻觉,直接把交流节点功率平衡方程、直流节点功率平衡方程、换流器控制方程全部写成一组非线性方程组F(x)=0,然后用牛顿-拉夫逊法同步更新所有状态变量。这个方法代码量确实大一些,但收敛性和解的一致性都明显更好。下面是两套方案在我实际测试中的对比:

对比维度交替求解法统一求解法
数学模型AC、DC各自成组,边界交换全部联立成一组非线性方程
收敛特性弱耦合时稳定,强耦合时易震荡牛顿法局部二阶收敛,整体稳健
编程复杂度较低,模块可复用需要组装AC-DC耦合雅可比矩阵
适用场景单端直流、连接点少、负荷轻多端直流、VSC控制复杂、DG高渗透
对初值敏感度每轮子迭代相对宽容对状态初值更敏感,但可用平启动缓解

我并不是说交替求解法一无是处。直流系统规模很小、只想快速看一个趋势的时候,交替法半小时就能写完。但如果你要为“交直流混合配电网”这个题目做一套能反复使用的分析工具,统一求解法能省掉后面无穷无尽的调参时间。

2. 统一求解法的数学模型构建

2.1 交流节点功率平衡方程

交流部分仍然沿用经典极坐标形式的功率平衡方程。对交流节点i:

[ P_i^{sp} - V_i\sum_{j\in i}V_j(G_{ij}\cos\theta_{ij}+B_{ij}\sin\theta_{ij})=0 ]

[ Q_i^{sp} - V_i\sum_{j\in i}V_j(G_{ij}\sin\theta_{ij}-B_{ij}\cos\theta_{ij})=0 ]

其中 (P_i^{sp}=P_{G,i}-P_{L,i}),(Q_i^{sp}=Q_{G,i}-Q_{L,i})。配电网里负荷如果直接用恒功率模型,低压场景下容易让雅可比矩阵对角项偏弱,所以我一般会在算例里预留ZIP负荷的转化接口:把一部分恒功率负荷按当前电压转换成恒阻抗和恒电流,再叠加到(P_i^{sp})上。这样做的好处是收敛半径更大,也更贴近实际台区负荷特征。

交流节点类型有三种:松弛节点(平衡节点)、PV节点和PQ节点。交直流混合潮流里,松弛节点一般选在变电站二次侧母线,PV节点对应分布式光伏逆变器或其他可控无功源。换流器的交流侧母线的类型不完全取决于换流器本身,还要看换流器采用什么控制模式。比如定交流电压控制的VSC,它所在的交流节点的无功注入就不是“给定值”,而是方程解出来的,这一点在分组方程时必须想清楚。

2.2 直流网络方程与换流器模型

直流网络在稳态下本质上是一个线性电阻网络:

[ I_{dc,k} = \sum_{m\in k} G_{dc,km}U_{dc,m} ]

对于直流节点k,注入功率平衡可以写成:

[ P_{dc,k}^{sp} - U_{dc,k}\sum_{m\in k}G_{dc,km}U_{dc,m}=0 ]

(P_{dc,k}^{sp})是直流侧电源注入减去直流负荷后的净功率。光伏和储能如果通过DC/DC变换器接入直流母线,在潮流计算里可以当成直流节点上的注入功率源;如果接在交流侧,那就按交流节点上的PQ或PV节点处理。

换流器模型是统一求解法的灵魂。我使用的是经过简化的VSC稳态模型:只关心基波正序,忽略谐波和换流站内部电磁暂态,把损耗统一归算成有功电流的函数:

[ P_{loss}=a + bI_{conv} + cI_{conv}^2 ]

其中(I_{conv})是流过VSC的直流侧电流,(a)为空载损耗,(b)为线性损耗系数,(c)为二次损耗系数。交流侧有功、直流侧有功和损耗之间满足:

[ P_{ac,conv}=P_{dc,conv}+P_{loss} ]

无功方面,VSC可以向交流母线提供或吸收无功,具体数值由控制目标决定。常见的控制模式有定有功功率、定无功功率、定直流电压、定交流电压四种。在数学上,每种控制模式对应一条额外方程,比如定直流电压模式对应(U_{dc,conv}-U_{dc}^{ref}=0),定无功模式对应(Q_{conv}-Q^{ref}=0)。

2.3 联立方程组的牛顿-拉夫逊求解框架

统一求解法的关键是把所有方程放在同一个失配量向量F里。我习惯把状态向量排列为:

[ x = [\theta_{ac};\ V_{ac};\ U_{dc};\ I_{conv}] ]

其中(\theta_{ac})是交流节点相角,(V_{ac})是交流节点电压幅值,(U_{dc})是直流节点电压,(I_{conv})是换流器内部电流(也可以根据需要换成调制比或触发角)。失配量向量对应:

[ F = [\Delta P_{ac};\ \Delta Q_{ac};\ \Delta P_{dc};\ \Delta F_{conv}] ]

交流节点和直流节点的失配量就是上面讲的功率平衡方程的右边减左边;换流器失配量包括有功平衡方程、无功控制方程、直流电压控制方程等。牛顿法的迭代格式是:

[ F(x^k)+J(x^k)\Delta x^k=0 ]

[ x^{k+1}=x^k-\Delta x^k ]

其中雅可比矩阵(J=\partial F/\partial x)。这个矩阵天然是分块结构:

[ J = \begin{bmatrix} J_{ac,ac} & J_{ac,dc} \ J_{dc,ac} & J_{dc,dc} \end{bmatrix} ]

交流系统和直流系统的交叉耦合全部体现在(J_{ac,dc})和(J_{dc,ac})这两个非对角块里。交替法之所以在强耦合时拉胯,就是因为它没有这两个交叉块;统一法把交叉偏导显式写出来,等于把“两个系统如何互相影响”这件事一次算清。

3. Matlab实现关键细节

3.1 数据结构设计:节点、支路、换流器

我最初想写一套“面向对象”风格的程序,后来发现配电网节点规模通常只有几十到几百个,用Matlab的struct数组反而更直观、调试更方便。我建议至少建立三张表:交流节点表、直流节点表、换流器表。

交流节点表每个元素包含节点编号、节点类型、负荷有功无功、电源有功无功、电压初值、相角初值。交流支路表每个元素包含首末端节点、电阻、电抗、对地导纳和变压器变比。直流节点表包含节点编号、直流负荷/电源注入功率、直流电压初值。换流器表最重要的字段是控制模式,我用两个状态枚举量表示“有功/直流电压控制模式”和“无功/交流电压控制模式”,再存对应的参考值。

另外,必须建立起三个索引映射:交流节点编号到交流雅可比行列位置的映射、直流节点编号到直流雅可比行列位置的映射、换流器变量到全局状态向量位置的映射。这个映射关系如果建不好,后面组装雅可比矩阵时全是坑。我的经验是提前画一张“变量排布图”:先排交流相角,再排交流电压幅值,再排直流电压,最后排换流器内变量,写代码时照着表格填就行。

3.2 雅可比矩阵的组装与修正

组装雅可比矩阵是最容易出错的一步,但也是最值得花时间做的一件事。交流潮流部分可以直接参照传统牛顿法的写法:对(P_i)关于(\theta_j)、(V_j)求偏导,对(Q_i)关于(\theta_j)、(V_j)求偏导。直流部分对直流节点功率方程求偏导,结果直接就是直流电导矩阵(G_{dc})的某个元素。真正需要手推的是换流器相关的交叉偏导。

比如换流器有功平衡方程(P_{ac,conv}=P_{dc,conv}+P_{loss}),失配量对交流相角(\theta_i)的偏导,实际上就是交流潮流方程中换流器注入有功对(\theta_i)的偏导;失配量对直流电压(U_{dc,k})的偏导,会涉及(U_{dc}I_{conv})项以及损耗(P_{loss})对(I_{conv})的导数。这些交叉偏导必须一项一项写清楚,不能偷懒用差分近似代替。解析雅可比在收敛速度和稳定性上的优势非常明显,尤其矩阵维数几百的时候,差分法既慢又容易引入数值噪声。

我常用的一个技巧是:把雅可比矩阵按“分块矩阵”方式维护,先算AC块,再算DC块,再算换流器块,最后把交叉偏导数填充进去。所有矩阵都用(sparse)存储,求解线性方程时直接写“dx = J \ F”,千万不要写成“inv(J)*F”,因为Matlab对稀疏矩阵的除法运算在数值稳定性和计算速度上都远好于显式求逆。下表是我整理的常见偏导关系,方便对照:

失配量类型对交流相角的偏导对交流电压的偏导对直流电压的偏导对换流器电流的偏导
(\Delta P_{ac})来自交流潮流方程来自交流潮流方程换流器有功注入项换流器方程电流项
(\Delta Q_{ac})来自交流潮流方程来自交流潮流方程通常为0取决于换流器无功方程
(\Delta P_{dc})换流器直流侧功率耦合项通常为0来自直流潮流方程(U_{dc})项
(\Delta F_{conv})换流器交流功率方程项换流器交流功率方程项直流电压控制/功率方程项损耗及电压方程项

3.3 收敛判据与初值选取

统一求解法的收敛判据我建议同时看两个指标:失配量范数和状态修正量范数。只盯着失配量有可能出现“F很小但dx还很大”的临界情况,只盯dx又可能在迭代初期误判收敛。我实际使用的判据是:

[ \max(|F|) < 1e^{-6} \quad \text{且} \quad \max(|\Delta x|) < 1e^{-8} ]

初值方面,交流PQ节点电压平启动通常设为(1.0\angle 0^\circ),直流节点电压设为1.0标幺值,换流器电流初值根据参考功率和直流电压估算为(I_{conv,0}=P^{ref}/U_{dc,0})。这个初值策略对大多数配电网算例都够用,但如果系统重载或者控制方向比较激进,我会在牛顿迭代前多做一次“纯交流潮流”预迭代:先把换流器当作PQ节点,交流网单独收敛一次,再把直流电压初值设为换流器交流侧功率对应的直流电压,这样整个统一迭代的初值质量会好很多。

4. 代码实现步骤与核心函数

4.1 主程序流程

我把整个主程序拆成六个步骤,每一步都对应一个独立函数,方便单独调试:

  1. 定义算例数据:交流节点、交流支路、直流节点、换流器参数;
  2. 构建交流导纳矩阵(Y_{ac})和直流电导矩阵(G_{dc});
  3. 初始化全局状态向量(x);
  4. 进入牛顿迭代循环:计算失配量F,组装雅可比J,求解线性方程,更新状态,检查收敛;
  5. 收敛后计算支路功率、换流器损耗、直流网络损耗;
  6. 输出并可视化节点电压和功率分布。

这里特别强调第4步的循环上限要设置合理,我一般设50次。如果50次还不收敛,与其继续迭代不如停下来分析问题,硬跑300次只会浪费时间。

4.2 关键代码片段示例

构建交流导纳矩阵的代码比较基础,我直接给出一个不带变压器抽头的简化版:

function Y = buildYac(branch) % branch: [from, to, r, x, b],单位标幺值 % 输出:稀疏交流导纳矩阵 n = max(max(branch(:,1:2))); Y = sparse(n, n); for k = 1:size(branch,1) f = branch(k,1); t = branch(k,2); z = branch(k,3) + 1j*branch(k,4); y = 1 / z; b_shunt = branch(k,5); Y(f,f) = Y(f,f) + y + 1j*b_shunt/2; Y(t,t) = Y(t,t) + y + 1j*b_shunt/2; Y(f,t) = Y(f,t) - y; Y(t,f) = Y(t,f) - y; end end

失配量计算函数的骨架如下,这里只展示最关键的结构:

function F = calcF(x, idx, data) % 状态向量x依次包含:交流相角、交流电压、直流电压、换流器电流 % 先把x拆开 theta = x(idx.theta); V_ac = x(idx.V_ac); V_dc = x(idx.V_dc); I_conv = x(idx.I_conv); F = zeros(idx.F_total, 1); % 计算交流节点失配量 [Pcal, Qcal] = power_ac(V_ac, theta, data.Y_ac); F(idx.F_P) = data.P_inj - Pcal; F(idx.F_Q) = data.Q_inj - Qcal; % 计算直流节点失配量 F(idx.F_DC) = data.P_dc_inj - V_dc .* (data.G_dc * V_dc); % 计算换流器失配量 % 换流器有功平衡:P_ac_conv = P_dc_conv + P_loss F(idx.F_conv) = data.P_conv_ref - (V_dc(data.vsc_dc) .* I_conv + ... data.loss_a + data.loss_b .* I_conv + data.loss_c .* I_conv.^2); end

主循环代码我习惯写成:

for iter = 1:max_iter F = calcF(x, idx, data); J = buildJac(x, idx, data); dx = -J \ F; x = x + dx; if max(abs(F)) < tol_F && max(abs(dx)) < tol_dx break; end end

每轮迭代我还会把(max(abs(F)))打印出来,这样能实时判断到底是交流方程卡住、直流方程卡住,还是换流器方程卡住。这个习惯让我后面排查问题节省了大量时间。

4.3 结果输出与算例验证

验证程序我用的算例是改造后的IEEE 33节点系统:在节点18处接了一个三端直流网络,两个VSC分别连接交流节点18和25,其中一个定直流电压,另一个定有功功率,直流网络里接两台光伏逆变器当作直流电源。整体算例规模不大,但交流重载和直流多源并存,足够暴露问题。

我对比了三种结果:纯交流潮流结果、统一求解法带直流系统后的结果、以及把换流器有功功率设为0后的统一求解法结果。后两者在换流器有功设为0时应该完全一致,这是最快的自检方法。实际算例中,接入直流系统后,交流节点18的电压从0.9738下降到0.9652,节点25的电压从0.9811下降到0.9776,这说明直流系统从交流侧吸收了有功功率,压降方向符合物理直觉。直流网络内部,定直流电压节点电压维持在1.002,定功率节点电压略低,换流器损耗占传输功率的2.3%左右,这个量级对VSC是合理的。

如果你要复用我的验证思路,我建议先跑一个最小算例:3个交流节点加2个直流节点,手工用计算器算一组近似解,再和Matlab程序对比。这样能确保不是“阴差阳错跑出了合理结果”,而是每个方程、每个偏导都确实写对了。

5. 常见问题与排查技巧实录

5.1 换流器控制模式组合导致雅可比矩阵奇异性

这是我在项目里踩得最狠的一个坑。直流网络必须有一个“直流电压锚点”,就像交流系统必须有平衡节点一样。如果两个换流器同时定直流电压,直流电压变量被重复约束,雅可比矩阵会出现冗余行;如果一个换流器都没有定直流电压,直流网络电压就会整体漂移,雅可比矩阵又会出现零特征值。两种情况的结果都是(J)奇异,线性方程解出一堆奇怪的大数。

排查方法很简单:迭代之前先统计各换流器的有功/直流电压控制模式,确保有且仅有一个定直流电压控制,其余换流器要么定有功,要么定下垂控制。交直流混合配电网实际工程中,也基本会留一个主换流器维持直流母线电压。如果确实需要多端支撑,可以把其中一个定电压模式改成下垂控制,方程里加入一条下垂系数约束,这样既能维持电压,又不会造成冗余。

5.2 交直流两侧标幺值不统一带来的“隐形错误”

我刚写完代码时,怎么检查结果都不对:交流侧节点电压正常,直流电压也正常,但换流器两侧的有功功率差了20%。后来发现是直流侧的电压基准选错了。交流侧我用线电压标幺值,直流侧却直接用额定直流电压的有名值代入换流器公式,导致功率在交直流转换时悄悄出现了一个比例系数误差。

解决这个问题的原则是:全系统统一采用同一个功率基准(S_{base});交流电压基准(V_{ac,base})取线电压或相电压都可以,但导纳折算必须用对应的(Z_{base}=V_{base}^2/S_{base});直流电压基准(V_{dc,base})取额定直流电压。所有有名值在进入方程组之前一次性转换成标幺值,不要每行方程里零零散散地转换。我甚至专门写了一个“baseValue”结构体,里面有S_base、V_ac_base、V_dc_base、Z_ac_base、Z_dc_base,换流器方程中所有功率和电压都从标幺值再回到有名值检查一遍,确保一致。

5.3 迭代发散时的三阶段定位法

统一求解法发散时,不要急着改初值或调阻尼。我自己的排查顺序分三步:

第一步,把换流器有功功率全部设成0,直流负荷也设成0,这时换流器只剩下无功方程。如果程序能收敛到纯交流潮流解,说明交流部分的雅可比矩阵没有问题。第二步,把直流网络单独拿出来,用线性直流潮流解一次,检查直流电压是否正确,这一步可以定位直流电导矩阵是否填错。第三步,再把换流器有功功率逐渐加上去,每加一步都判断迭代是否收敛。哪一步开始发散,问题就在哪一步涉及的方程和雅可比块里。

除了这个方法,我还会在每轮迭代里打印下面这类信息:最大失配量属于哪个方程、对应哪个变量、最近两轮的修正方向是否来回跳。如果发现某个失配量始终降不下去,十有八九是雅可比矩阵里对应的偏导公式写错了一个正负号。

6. 一点扩展思考与个人经验

6.1 统一求解法向三相不平衡、动态仿真的扩展

配电网三相不平衡是常态,统一求解法完全可以在三相模型上继续用。状态变量从单相电压相角变成三相电压相角,交流支路要用三相阻抗矩阵,换流器模型也要换成abc坐标或正负零序分量形式。雅可比矩阵规模会明显变大、非零元更多,但统一求解法“联立全部方程”的框架不用变,只是J矩阵里的交叉项更丰富了。

关于动态仿真,统一求解法的思想也很有用。把储能变换器、同步机转子运动方程这些微分方程用隐式梯形积分离散后,和潮流代数方程一起组成差分代数方程组,再统一做牛顿迭代。本质上就是把“代数潮流”和“微分动态”当成一个更大的方程系统来联立求解。我在实际工程中体会最深的一点是:只要把F(x)和J(x)写成不依赖全局变量的纯函数,后面从静态潮流扩展到动态仿真是水到渠成的事,根本不用重写核心迭代器。

6.2 与智能算法结合的松紧耦合策略

交直流混合配电网里换流器控制参数、储能出力曲线通常有大量可调自由度,很多人喜欢用粒子群、遗传算法这类智能算法去寻优。我建议把统一求解法包成一个“潮流计算内核”,负责快速计算每一组控制参数下的运行状态,把节点电压和换流器损耗作为适应度值返回。这个内层求解器必须足够快、足够稳定,否则外层智能算法跑几百次全卡在潮流发散上。

我个人的体会是,统一求解法配合Matlab的稀疏矩阵,对一个几十节点的交直流配电网单次潮流计算通常在毫秒级以内,完全能作为智能算法的内层适应度函数。后续如果你要我给一条最实在的建议,那就是:所有雅可比矩阵偏导都写成解析式,对所有状态变量都做一次中心差分校验;一旦偏导正确,整个程序的稳定性会骤然提升。如果你打算自己复现,我建议先把3节点交流加2节点直流的最小模型手算跑通,再扩展到33节点系统。那时候你才能真正体会到,统一求解法的坑和乐趣全都在雅可比矩阵的交叉项里。

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

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

立即咨询