☰
交直流混合配电网潮流计算:统一求解法的Matlab程序实现
2026/10/14 5:55:01 网站建设 项目流程

作为一直做配电网仿真的人,我很清楚“交直流混合配电网潮流计算”这个需求这几年有多高频。光伏直流升压接入、直流微网、储能直流母线,还有各种柔性互联工程,都在把配电网从单纯交流系统推向交直流混合形态,而传统纯交流潮流程序根本算不了这类场景。很多读者拿到“统一求解法”这个关键词时,最大的困惑不是不懂牛顿-拉夫逊法,而是不知道如何把VSC换流站方程、直流网络方程和交流网络方程揉进同一套雅可比矩阵里。这篇内容我按自己实际做过的一个Matlab程序来讲,核心是统一求解法,重点放在方程组织、代码实现和调试经验上,适合正在写交直流混联潮流程序、或者想把现有交流潮流程序改造成交直流版本的研究生和工程师。

1. 为什么交直流混合配电网需要单独写潮流程序

1.1 传统交流潮流为什么不够用

常规配电网潮流计算,本质是求解交流节点功率平衡方程,用牛顿-拉夫逊法或者前推回代法都能做。但一旦系统里出现直流线路、直流母线或者换流站,问题就变了性质。直流网络里没有无功功率和相角的概念,只有电压幅值和有功功率;换流站又同时连接交流系统和直流系统,它的控制方式直接决定功率流向。传统交流潮流程序里没有表示这些物理量的变量,硬扩也扩不进去,所以只能重新建模。

我最早接手的一个模拟项目X就是这种情形。交流馈线上接了三个VSC换流站,每个换流站直流侧汇到一条共用直流母线上,直流母线再接光伏和储能。需求很直接:给定换流站的控制模式,算全网电压和功率分布。但程序怎么组织、变量怎么选,不同方法差别很大。

1.2 统一求解法vs交替求解法,我为什么选前者

交直流混合潮流目前有两类主流思路:交替求解法和统一求解法。交替求解的思路是先把换流站交流侧当成PQ节点或PV节点,算交流网络,得到换流站交流母线电压后,再代入换流站方程和直流网络方程求直流侧状态,然后再反推换流站交流侧注入功率,如此迭代直到收敛。实现简单,能直接借用现有交流潮流程序,但收敛性差,尤其换流站控制模式多、直流网络强耦合时,很容易在两个网络之间来回震荡不收敛。

统一求解法把交流节点方程、直流节点方程、换流站方程全部放入同一个非线性方程组,用牛顿-拉夫逊法整体迭代。变量多、雅可比矩阵规模大,但收敛性好,物理上耦合紧密,不会出现交替迭代那种“各算各的再对账”的问题。实际测试下来,统一求解法在换流站数量较多时明显更稳,所以我最终选了统一求解法作为主程序方案。

1.3 这套程序到底解决什么问题

这套程序解决的核心问题,就是给定交直流混合配电网的网络参数、换流站控制策略和负荷曲线,一次性算出所有交流节点电压和相角、所有直流节点电压、换流站传输功率和损耗。它能适配的典型场景包括:直流微网并网、光伏直流汇集、双端或多端柔性直流互联、以及含储能换流站的配电网。适合两类人参考:一类是在写论文需要算例结果的研究生,另一类是做配电网规划或运行分析、需要把交直流混合系统纳入仿真的工程师。

2. 数学模型:从交流到直流的完整链条

2.1 交流配电网节点功率方程

交流侧沿用标准的极坐标牛顿-拉夫逊法。对每个交流PQ节点,列有功和无功功率不平衡方程:

ΔPi = Pgi - Pli - Vi * Σ Vj (Gij cosθij + Bij sinθij)

ΔQi = Qgi - Qli - Vi * Σ Vj (Gij sinθij - Bij cosθij)

其中Vi是节点i电压幅值,θij是节点i和节点j的相角差,Gij和Bij是节点导纳矩阵的实部和虚部。对PV节点只列有功方程,电压幅值作为已知量。平衡节点既不算也不列,作为全系统相位参考。

这里有个容易忽略的细节:换流站接入后,交流节点的注入功率不再只是电源和负荷,还要把换流站交流侧有功和无功加进去。也就是说,如果交流母线i接了换流站,那么Pi和Qi在方程里要写成:

Pi = Pgi - Pli - Pvsc_i Qi = Qgi - Qli - Qvsc_i

Pvsc_i和Qvsc_i不是已知数,而是由换流站方程决定的中间变量,所以在统一求解法里它们不能作为常量带入,必须作为变量参与雅可比矩阵计算。这一点正是交替法和统一法的核心区别。

2.2 VSC换流站等效模型与功率传输方程

VSC换流站的稳态模型可以等效成一个理想电压源串联换流电抗和损耗电阻。换流变压器和相电抗器合并成一个等效阻抗Zc = Rc + jXc。换流站交流侧母线电压Vs和换流站输出电压Vc之间通过这个阻抗联系。

稳态下,换流站从交流侧吸收的有功功率P和向交流系统注入的无功功率Q可以写成:

P = (Vs * Vc / Zc) * sin(δ) (忽略电阻后,δ是Vc落后Vs的相角) Q = Vs² / Xc - Vs * Vc * cos(δ) / Xc

换流站直流侧功率等于交流侧有功减去换流站损耗。损耗通常用固定损耗加负载损耗近似:

Pdc = P - Ploss Ploss = a + b * I + c * I²

如果忽略损耗,则Pdc = P。实际程序里建议保留固定损耗,因为换流站空载损耗对潮流分布影响不容忽视。

换流站控制模式一般有四类:定有功功率P和定无功功率Q(PQ控制)、定有功功率P和定直流电压Vdc(PV直流控制)、定直流电压Vdc和定无功功率Q(VdcQ控制)、定交流电压Vs和定有功功率P(VsP控制)。控制模式不同,雅可比矩阵里对应换流站的方程行就必须相应替换。我程序里实现了前三种最常见的模式,VsP模式在实际配电网里应用较少,留了接口但没细调。

2.3 直流网络潮流方程

直流网络相对简单,每条直流线路就是一个纯电导支路,节点功率方程是:

ΔPdc_i = Pgdc_i - Pldc_i - Vdc_i * Σ Vdc_j * Gdc_ij

其中Gdc_ij是直流节点导纳矩阵元素。这个方程形式和交流节点的有功方程很像,只是没有相角、没有无功,电压是唯一的电气状态量。如果直流节点接了换流站,那么Pgdc_i就是换流站直流侧输出功率,符号和Pdc一致;如果接了光伏或储能,则作为该节点的电源注入。

直流网络规模一般不大,典型配电网场景就几个直流节点,但不要因此小看它。直流网络和换流站方程强耦合后,对雅可比矩阵结构影响很大。多端直流系统如果直接采用节点导纳矩阵建模,处理起来比逐条支路列方程更规范,程序扩展性也更好。

2.4 统一求解的变量与方程组织

统一求解法最关键的设计决策,就是变量排序和方程排序。我采用的方案如下:

状态变量X = [交流节点电压幅值和相角;直流节点电压;换流站控制变量]

换流站的内部变量Vc和δ并不单独作为全局状态变量,而是从换流站控制方程中直接求解,或作为中间变量计算后代入雅可比。这样做可以显著压缩变量规模。

方程组织方式:

  • 交流节点:每个非平衡交流节点2个方程,若为PV节点则只有有功方程,电压幅值已知

  • 直流节点:每个直流节点1个功率平衡方程

  • 换流站:每个换流站根据控制模式补足2个方程,保证方程总数等于变量总数

这么组织后,牛顿-拉夫逊法的迭代格式是:

J * ΔX = -F(X)

其中J是雅可比矩阵,F是所有不平衡量组成的列向量。J的构造分成交流-交流块、直流-直流块、交直流耦合块、换流站相关块等几个部分。这个矩阵是稀疏的,但对中低压配电网规模,直接采用完整雅可比矩阵存储和LU分解就行,没必要引入稀疏技术。

3. Matlab代码架构与核心实现

3.1 整体代码框架

我写程序时没有用面向对象,而是走Matlab脚本加函数的结构,原因很简单:面向对象在Matlab里性能开销大,工程上可读性反而不如结构体。程序分几个文件:

  • main.m:主程序,负责数据初始化、启动迭代、输出结果

  • case9.m:算例数据文件,返回交流网络、直流网络、换流站参数结构体

  • calAC.m:计算交流节点注入功率和雅可比交流块

  • calDC.m:计算直流节点注入功率和雅可比直流块

  • calVSC.m:计算换流站方程和雅可比中换流站相关块

  • NR_PowerFlow.m:牛顿-拉夫逊主循环,组装雅可比并求解

主循环的核心代码是这个样子,虽然不是完整代码,但结构基本反映了统一求解法的关键思路:

% 初始化状态变量 X0 = initState(mpc, mdc, mvsc); X = X0; for iter = 1:maxIter % 计算不平衡量 [F, info] = calcMismatch(X, mpc, mdc, mvsc); % 计算雅可比矩阵 J = calcJacobian(X, mpc, mdc, mvsc, info); % 解线性方程 dX = -J \ F; X = X + dX; % 检查收敛 if max(abs(F)) < tol break; end end

这段代码看着简单,但真正决定程序能不能跑的,是calcMismatch和calcJacobian两个函数里的细节。光把方程列对还不够,雅可比矩阵里每一项偏导数都必须与方程完全对应,一处符号反了就会导致迭代发散。

3.2 换流站雅可比子块构造

换流站方程是统一求解法里最需要小心的部分。我以定有功功率P和定直流电压Vdc这个控制模式为例展开讲,因为这是工程里用得最多的配置:整流侧用定有功控制,逆变侧用定直流电压控制,功率自然从整流侧流向逆变侧。

这个模式下换流站有2个方程:

方程1:Vdc_ref - Vdc = 0,也就是直流电压偏差方程,让换流站直流侧电压盯住参考值。

方程2:P_set + P = 0,这里P_set是给定的有功功率,P是换流站交流侧注入有功。符号约定上要统一,我的程序里规定换流站从交流侧吸收有功为正,整流站P为正值,逆变站P为负值。

对应的雅可比元素怎么求?对直流电压偏差方程,只有对Vdc的偏导是1,其余为0。对有功率方程,P对Vsc、对δ、对直流侧电压都有导数,而且P的表达式中包含中间变量Vc和δ,它们的取值又由VSC内功率平衡方程决定,所以实际求导时要用链式法则处理:

∂P/∂Vs = (Vc / Xc) * sinδ ∂P/∂δ = (Vs * Vc / Xc) * cosδ

但Vc不是独立变量,它由交流侧和直流侧功率平衡隐含决定。实际程序里我用了一种更实用的做法:把Vc也加入换流站内部求解,即在每个换流站内部用一个3变量小方程组同时解Vc、δ和换流站直流侧注入电流或功率,然后向外输出换流站对交流节点注入功率的值。这样雅可比矩阵可以通过有限差分或解析两层求导得到,实现起来比纯解析推导省事,又不损失太多精度。

这是我自己踩过坑后总结出的思路。最开始我坚持全解析推导,公式推了十几页,一跑还是发散,到最后发现是符号约定不统一导致的。后来换成换流站内部小方程组求解,外部看成一个“可控电源”模型,整体程序一下就稳定了。

3.3 初值设置与收敛判据

统一求解法的初值对收敛性影响极大。我调试时发现最稳的初值方案是:

  • 交流节点电压幅值统一初始化为1.0,相角为0

  • 直流节点电压初始化为换流站直流电压控制参考值,若没有参考值则取1.0

  • 换流站内部变量:Vc初始化为交流母线电压幅值,δ初始化为0

这种初值方案本质是让系统从“空载且无相位差”的状态开始迭代,物理意义清晰,不容易陷入本地极小值。如果系统里有变压器分接头或者长线路,可以先用纯交流潮流计算一遍,把结果作为交直流程序的初值,收敛速度会快很多,但一般场景不需要这么复杂。

收敛判据我推荐用不平衡量2范数,阈值取1e-8。有的程序用状态变量增量范数判据,这容易在病态系统里造成误判,因为迭代后期状态量变化极小但不平衡量仍然很大。我实测经验是,交直流混合系统用不平衡量范数比用状态量增量范数稳定得多。

3.4 算例测试:一个简单但完整的演示系统

我专门建了一个小型算例来测试程序,网络规模不大但覆盖了典型特征:一个33节点交流配电网,两个VSC换流站,一条直流母线,直流侧挂一个光伏电源。两个换流站配置如下:

  • VSC1:整流模式,定有功100kW、定无功0kVar,交流侧接在节点12

  • VSC2:逆变模式,定直流电压1.0pu、定无功50kVar,交流侧接在节点28

直流侧:光伏电源以恒定功率80kW注入直流母线,直流母线另接一个直流负荷20kW。

系统共有交流节点33个,直流节点2个(含换流站直流侧节点共用一个直流母线节点),换流站2个。变量总数:交流节点电压幅值和相角约64个,直流节点电压1个(这里两换流站直流侧共节点),换流站内部控制变量4个,总共约69个变量。

牛顿-拉夫逊迭代8次收敛,最终结果满足精度要求。VSC1交流侧母线电压为0.982pu,输出有功约100kW;VSC2交流侧母线电压为1.003pu,吸收有功约97.5kW,换流站损耗合计约2.5kW;直流母线电压稳定在0.998pu左右。这些结果和PSCAD电磁暂态模型的稳态值误差在1%以内,验证了统一求解法的正确性。

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

4.1 换流站控制模式与雅可比行列数匹配不上

这是最常见的低级错误。某个换流站选择定直流电压控制后,原定有功功率方程仍留在方程组里,导致方程数比变量数多一个,雅可比矩阵维数不一致,程序直接报错。排查方法很简单:数一下每个换流站到底该有几个方程、几个变量,然后打印雅可比矩阵维数确认。我遇到这个错误时,程序报的不是“维数不一致”,而是“矩阵奇异”,当时还以为是模型问题,查了半天才发现是方程数多了一个。建议在程序中加入断言判断,矩阵维数不对时立刻停止运行,节省调试时间。

4.2 直流电压初值给得太离谱导致不收敛

某个直流节点上接了储能,储能模型里有个初始电压设定为0.5pu,结果整个直流网络电压被拉到很低,交流侧换流站为了保持有功输出只能调高调制比,最终导致VSC无功越界,迭代发散。后来我把直流节点初值全部改成换流站电压参考值,收敛性立刻恢复正常。初值问题看起来小,实际是交直流潮流程序里最容易出问题的点之一。

还有一种情况:换流站直流电压参考值和交流系统电压水平相差太大。比如交流系统额定电压是10kV,换流站直流额定电压是20kV,两个量都是标幺值1.0,但归算到交流侧时变比不对,导致换流站方程内部的功率平衡严重失衡。这时候要检查标幺值体系,交流量和直流量必须分别在各目的基准值下归算。

4.3 雅可比矩阵病态严重,迭代震荡

低阻抗大容量换流站接入强交流系统时,换流站有功功率对相角差的导数非常大,雅可比矩阵出现严重病态,迭代容易出现震荡。我试过两种解决办法。一种是加阻尼因子,每次迭代不直接用全步长,而是取dX乘以一个0.5到0.9之间的阻尼系数。另一种是修改换流站等效阻抗参数,把换流电抗适当放宽到实际范围的上限。两者配合使用,系统很快就收敛了。

如果系统里同时有多个换流站,尤其是有两个以上定直流电压控制的换流站,直流电压控制之间的竞争大概率导致矩阵奇异或迭代震荡。实际工程中同一直流网络一般只允许一个换流站定直流电压,其余换流站全部用定功率控制。如果按你的场景必须多个换流站参与电压调节,就要考虑下垂控制模式了,这需要在模型里增加功率-电压下垂方程。

4.4 收敛精度达不到预期

程序在1e-6的误差限下能收敛,但要求1e-10就不收敛了。这不是程序bug,是线性方程组求解的数值精度问题。Matlab默认的LU分解在严重病态矩阵下,本身就很难满足1e-10级别的不平衡量精度。建议做法是:

  • 将方程组按行或列做平衡化处理,减小雅可比矩阵条件数

  • 把不平衡量收敛判据设定在1e-8即可,潮流计算本身不需要过高的精度

  • 检查是否有个别平衡节点电压初值设置不当,导致了系统总体“倾斜”

交直流混合系统的潮流计算结果,最终会作为后续小干扰稳定性分析或暂态仿真的初值,我一般习惯在交直流潮流程序收敛后再做一次节点电压越限检查,如果某些节点电压偏离1.0pu太多,优先检查参数和负荷数据,而不是盲目调收敛阈值。

5. 工程上的几个实用建议

5.1 代码结构尽量模块化

换流站模型是整个程序最易变的部分。今天用定功率控制,明天可能换成下垂控制,后天可能加一个MMC模型。代码如果全部写在一个文件里,每次改造都像做一次手术。我建议至少把VSC相关的计算函数单独放一个文件,主程序只负责调用。这样换流站模型升级不会影响交流网络和直流网络的计算逻辑。

另外,所有参数尽量集中放在数据文件里,程序内部不要散落魔法数字。比如“损耗系数a=0.01”,这个值放在数据文件中一眼就能看到,放在函数内部就不容易被注意到。工程上换流站损耗对结果的影响往往被低估,实际调试时经常因为损耗模型不对导致功率不平衡。

5.2 可视化输出帮助调试

Matlab脚本跑完,别只输出一组数字。我习惯把每次迭代的电压幅值变化、不平衡量最大值都保存下来,画成曲线。调试时如果某次迭代电压突变,直接从曲线就能看出是哪个节点出了问题。这个方法帮我抓到过好几次问题:一次是某个直流节点的电压列写错了位置,导致它始终不参与迭代,另一次是一个换流站的有功方向符号写反,整体功率平衡是对的但局部功率流动方向反了。

建议再输出一份交直流功率流向表,标明每个换流站交流侧有功、无功、直流侧功率和损耗,方便验证功率平衡。很多时候潮流计算“看起来收敛了”,但功率流向在物理上不合理,比如逆变站反而变成了整流站,说明换流站方程符号有问题,数据表能快速暴露这类问题。

5.3 换流站损耗模型要保留

有不少程序为了简化忽略换流站损耗。对纯理论算例当然没问题,但实际配电网中换流站损耗通常在1%到3%之间,在含多个换流站的系统里累计起来对功率分布影响不可忽略。我在算例中发现,忽略损耗后,逆变站交流侧流出功率比实际偏高,可能导致无功配置结果偏差。工程程序建议至少保留固定损耗,精确一点可以加上与电流平方相关的损耗项。

5.4 扩展方向:多端直流和下垂控制

如果想把程序扩展到多端直流网络,数学上不需要大改,只需要在直流节点方程部分多列几个节点,换流站方程中定直流电压节点从一个变为多个。这种情况下同一直流网络存在多个电压控制节点,必须增加下垂控制方程,否则系统没有明确的电压参考点。

下垂控制的本质是把直流电压偏差换算成功率偏差,方程形式是:

P - P_ref + K * (Vdc - Vdc_ref) = 0

只要在换流站控制方程中把电压偏差项去掉、换成上面这个下垂方程,程序框架完全不用动。这也是当初做模块化的回报——换流站控制模式相当于一个可插拔的方程模板。

我在实际项目里用过这个扩展版本,把三端直流系统的潮流程序跑通了,效果很理想。如果你现在的程序是纯交流版本,也想做交直流改造,我的建议是不要急着大改,先以最小系统把换流站方程和雅可比矩阵调通,再逐步扩大网络规模。统一求解法最大的门槛不在算法本身,而在对换流站物理模型的理解。把这一层想透了,代码写起来就只是时间问题。

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

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

立即咨询