☰
交直流混合配电网潮流计算:统一求解法Matlab实现全解析
2026/10/14 22:53:14 网站建设 项目流程

交直流混合配电网潮流计算,这几年凡是做配电网分析、微电网规划和新能源接入评估的,基本都绕不开这个话题。我这次要拆解的是一套基于统一求解法的Matlab代码实现,不是那种“交流算完再算直流”的两步走,而是把交流子网、直流子网、换流器方程揉进同一个牛顿法框架里一起迭代。这篇文章会把数学模型、代码结构、变量配平、雅可比矩阵组装、算例调试从头到尾讲透,适合已经学过传统交流潮流、想往交直流方向深入的研究生和工程师参考。

1. 项目要做什么,为什么选统一求解法

1.1 交直流混合配电网的潮流计算场景

先说说这项目到底解决什么问题。传统配电网纯交流,线路阻抗模型清楚,节点类型也简单,一套牛顿法或者前推回代就搞定了。但现在的配电网已经不是那个样子了:光伏直流汇集、储能直流接入、直流充电桩集群,甚至有些数据中心直接采用直流母线供电,这些都需要在配网层面引入直流子网。直流子网和交流子网之间靠电压源换流器(VSC)连接,两侧会互相影响——换流器从交流侧取多少有功、补多少无功,会改变交流节点的电压分布;反过来,交流节点电压的幅值变化,又会通过换流器反射到直流侧电压和功率分配上。

这种“你中有我、我中有你”的耦合关系,正是交直流混合配电网潮流计算和纯交流潮流最大的不同。我的项目目标很明确:给定一个包含交流负荷、直流负荷、多个VSC换流站和直流线路的混合系统,算出交流节点的电压幅值与相角、直流节点的直流电压、各换流器的注入功率,以及各支路的功率分布。这一套结果拿到手,后续做电压分析、网损优化、换流器容量校验都有基础了。

1.2 统一求解法与交替求解法的选型对比

一开始我也想过要不要图省事用交替求解法,逻辑上是这样:先算交流潮流,把换流器等效成PQ或PV节点,得到换流器交流侧功率;再把功率送到直流侧,解一个直流网络方程,算出直流电压;然后根据新的直流电压修正换流器的交流侧功率,再回去迭代,直到两侧收敛。这个思路实现起来确实快,因为你手头可能已经有现成的交流潮流程序和直流潮流程序,拼装一下就完事了。

但实际用下来问题很大。最典型的就是弱交流系统下振荡不收敛,换流器功率在两次迭代之间反复横跳,交替几十次都安定不下来;而且如果换流器采用定直流电压控制,直流侧的电压控制效果要等下一轮交流计算才能反馈回去,相当于引入一个迭代延迟,多端直流系统里这个问题尤其致命。另外,如果换流器控制方式要加下垂控制这种耦合功率和电压的方程,交替法处理起来非常别扭。

最终我选了统一求解法。核心思想就是一句话:所有未知量放在同一个变量向量里,所有方程放在同一个方程组里,一次牛顿迭代同时修正全部变量。这样做的好处一是收敛性好,牛顿法对这类算例基本保持二次收敛速度;二是建模表达能力强,换流器控制方程想怎么加就怎么加,不必在交流程序里搞特殊节点类型接口。代价也很直观:雅可比矩阵维度变大,编程复杂度明显上升,对初值也更敏感。但从实际项目投入产出比看,这个代价是值得的,尤其是做多端直流、直流电压下垂控制这类进阶场景。

1.3 统一求解法的总体技术路线

从实现角度拆解,一套统一求解法代码包含四个核心工作:

  • 建立交流子系统极坐标潮流方程,涉及P方程和Q方程。
  • 建立直流子系统功率平衡方程,直流网络导纳矩阵只需要电阻参数。
  • 建立VSC换流器稳态模型,包含功率平衡、电压耦合和控制方程。
  • 把上述方程和对应的未知量一起编号,组装整体雅可比矩阵,跑牛顿迭代。

代码层面的执行流程我用下来是六步:读数据、搭交流导纳阵、搭直流导纳阵、初始化变量、组装不平衡量向量和雅可比矩阵、迭代直到满足收敛判据。后面的章节我会把每一步的细节和关键Matlab实现都展开讲。

2. 数学模型与变量设计

2.1 交流子系统方程

交流部分还是标准的极坐标牛顿法,这是所有潮流计算的地基。对每个交流节点i,有功和无功不平衡量为:

F_Pi = P_i - U_i * Σ U_j * (G_ij * cos(θ_ij) + B_ij * sin(θ_ij)) F_Qi = Q_i - U_i * Σ U_j * (G_ij * sin(θ_ij) - B_ij * cos(θ_ij))

其中θ_ij = θ_i - θ_j。区别在于,传统纯交流系统里P_i、Q_i是已知的注入功率常量;而在交直流混合系统里,接换流器的交流节点其注入有功P_i和无功Q_i不再全是已知数——换流器注入的那部分功率是变量,要参与联立迭代。

配电网本身的R/X比值比输电网高不少,线路电阻大、电抗小,这会导致交流雅可比矩阵的对角占优特性变差。所以在工程上我倾向于把迭代初值取得干净一点:所有PQ节点电压幅值直接给1.0,相角给0,这样至少在起始点附近方程组的线性化性质可控。如果你在Matlab里跑纯交流部分都不太容易收敛,建议先单独验证交流模块,再叠加直流环节。

2.2 直流子系统方程

直流网络和交流网络的物理本质不同。交流线路要考虑阻抗、导纳、相角,而直流配电线路在稳态潮流计算中可以只计电阻,忽略分布电容和电感的影响——反正稳态下电容不传功率,电感等效为导线串联阻抗的一小部分,实际算例中影响很小。

直流节点i的功率平衡方程可以写成:

P_dc_i = U_dc_i * Σ_j G_dc_ij * (U_dc_i - U_dc_j)

这里的G_dc_ij = 1 / R_ij,就是直流线路电导。如果直流母线i直接接了一个恒功率负荷,那P_dc_i就是已知的负荷功率,方程右边需要等于这个给定值。直流节点没有相角,只有电压一个状态量,这是直流潮流比交流潮流简单的地方——但这也是工程中一个隐藏的坑点:直流网络只有一个变量维度,如果没有一个换流器主动控制直流电压,直流子网就没有“参考电压”,整个雅可比矩阵会奇异。

直流网络导纳矩阵的构建方式也值得单独提一下,先初始化全零矩阵,然后对每条直流支路k,把1/R加到对应位置的对角线上,把-1/R加到交叉位置上。代码大概长这样:

Ydc = zeros(n_dc, n_dc); for k = 1:size(dcbranch, 1) i = dcbranch(k, 1); j = dcbranch(k, 2); R = dcbranch(k, 3); Ydc(i, i) = Ydc(i, i) + 1 / R; Ydc(j, j) = Ydc(j, j) + 1 / R; Ydc(i, j) = Ydc(i, j) - 1 / R; Ydc(j, i) = Ydc(j, i) - 1 / R; end

2.3 换流器VSC方程与控制方式

VSC是交直流之间的桥梁,也是整套代码里最容易出bug的地方。稳态建模我采用的是工程中常见的简化模型,把换流器看成交流侧一个可控注入源、直流侧一个可控电流源,中间加一个损耗电阻。每个换流站引入四个核心变量:注入交流侧的有功P_s、无功Q_s、直流侧电压U_dc、调制比m。

基本方程需要满足三个层面。第一是交流侧注入功率方程,换流器注入交流节点的那一路功率,必须等于交流网络在这个节点消耗的功率,这个方程本质上是交流P、Q平衡方程的延展。第二是换流器有功平衡,交流侧进入换流器的有功,减去换流器损耗,等于送到直流侧的有功,写成:

P_s - R_loss * I_dc^2 - P_dc = 0

其中换流器损耗简化为等效电阻损耗,也可以用P_loss = a + b * I_dc + c * I_dc^2这种二次曲线,工程精度更高,代码上无非是多算几次电流平方。第三是换流器交流电压与直流电压的稳态耦合关系,不计调制细节的简化形式为:

U_dc = (2√2 / √3) * U_s / m

m是调制比,正常运行范围0到1之间。这个方程把直流电压、交流节点电压幅值和调制比绑在一起,迭代时如果出现m越界,大概率是初值或者功率分配不合理。

控制方式通过方程替换实现,我常用四种:

  • 定有功功率和定无功功率控制:替换交流侧P、Q方程,P_s = P_ref,Q_s = Q_ref。
  • 定直流电压和定无功功率控制:替换直流功率方程,U_dc = U_ref。
  • 定有功功率和定交流电压幅值控制:相当于传统PV节点,替换交流Q方程,U_s = U_ref。
  • 下垂控制:P_dc - P_ref + K_droop * (U_dc - U_ref) = 0,适合多端直流或多换流器协同运行。

工程上有一个必须记住的规则:整个直流网络至少要有一个换流器采用定直流电压或下垂控制,否则直流电压失去参考点,雅可比矩阵必然奇异,迭代会直接报错。

2.4 变量向量与方程配平的思路

统一求解法的一大难点是变量的分配与配平,说白了就是搞清楚每个未知数对应哪个方程,否则组装雅可比时候会乱套。我这里采用的分块变量顺序是:

x = [交流节点相角部分;交流PQ节点电压幅值部分;直流节点电压部分;VSC附加状态量部分]

对应的不平衡量是:

F = [交流节点P不平衡量;交流节点Q不平衡量;直流节点功率不平衡量;VSC方程不平衡量]

这样划分的好处是雅可比矩阵天然形成对角占优的分块结构,前两块是传统交流牛顿法已有的,后两块是直流和VSC新增的,代码复用时边界清晰。每个VSC的附加状态量按照P_s、Q_s、U_dc、m的顺序排进去,对应方程也按照交流P方程、交流Q方程、直流功率方程、电压耦合方程顺次排下来。控制方式替换时只需把对应位置的方程换成控制目标方程,索引逻辑保持不变,不会引起全局编号大改。

3. Matlab代码实现的核心细节

3.1 代码整体框架与数据结构

代码结构上我不建议一个脚本写到底,那样调试起来简直灾难。推荐的分层是枣核状:最外层是主函数,负责读数据、调初始化、执行牛顿迭代、输出结果;中间一层是三个独立模块,分别是生成交流导纳矩阵、生成直流导纳矩阵、构建全系统不平衡量与雅可比矩阵;最里层是基本的数值工具函数。

数据结构我统一用结构体承载,不用全局变量:

% 交流节点: bus_ac = [编号 类型 有功负荷 无功负荷 电压幅值初值 相角初值] % 交流支路: branch_ac = [编号 首端 末端 电阻 电抗 对地导纳] % 直流节点: bus_dc = [编号 类型 有功负荷 电压初值] % 直流支路: branch_dc = [编号 首端 末端 电阻] % VSC: vsc = [编号 交流节点 直流节点 损耗电阻 有功基准 无功基准 控制方式 控制目标]

用结构体比并行数组直观得多,后面扩展换流器控制方式时不需要动主循环的逻辑。节点编号也建议按“交流节点在前、直流节点在后”排,内部再细分成PQ、PV、平衡节点顺序,这样雅可比矩阵里交流部分依然保持传统潮流代码的三个子块。

3.2 雅可比矩阵的分块组装

整体雅可比矩阵可以划分为四大块:

J = [J_aa, J_ad; J_da, J_dd]

左上角J_aa是交流节点对交流变量的偏导,这部分和传统牛顿法完全相同;右下角J_dd是直流节点和VSC变量对直流及VSC方程的偏导,是新增部分;左下和右上两个块是交流变量与直流变量之间的耦合偏导,比如换流器交流侧功率对直流电压的偏导、直流功率对交流电压幅值的偏导。

编程实践中,我强烈建议先不要直接上解析雅可比,而是先用中心差分数值法算一个试验性的雅可比矩阵,拿它跑通迭代,再用解析雅可比对照检验。原因是解析式推导容易在符号和下标上出错,尤其是VSC方程里P_s、Q_s、U_dc、m之间耦合关系多,一旦某个偏导项符号写反,迭代瞬间发散而且出错位置很难肉眼发现。数值雅可比慢,但是用来验证正确性非常有用。

关键代码片段的骨架大概是:

% 变量划分 n_ac_theta = n_ac_bus - 1; % 去掉平衡节点相角 n_ac_v = n_ac_PQ; % PQ节点电压幅值 n_dc_v = n_dc_bus; % 直流节点电压 n_vsc_x = 4 * n_vsc; % VSC附加变量 n_x = n_ac_theta + n_ac_v + n_dc_v + n_vsc_x; % 不平衡量向量 F_P = zeros(n_ac_bus, 1); % 交流有功 F_Q = zeros(n_ac_PQ, 1); % 交流无功 F_DC = zeros(n_dc_bus, 1); % 直流功率 F_VSC = zeros(4 * n_vsc, 1);% VSC方程

3.3 牛顿迭代主循环与初值设计

牛顿迭代主循环本身不复杂,复杂度全在前面说的组装步骤上:

tol = 1e-6; max_iter = 50; for iter = 1:max_iter F = build_mismatch(x, data); J = build_jacobian(x, data); dx = -J \ F; x = x + dx; if max(abs(F)) < tol break; end end

初值设计有一些经验可以分享。交流节点电压幅值取1.0、相角取0,这是标准做法;直流节点电压初值不要随手写1.0,而是要根据直流基准电压来,如果直流电压基准值是20kV,实际额定运行电压就是20kV,标幺值取1.0没有问题。但如果你的直流节点基准选的是10kV,而系统实际运行在20kV,那初值应该给2.0而不是1.0,否则直流功率方程会出现很大的不平衡量,牛顿法第一轮就会把变量推到一个离谱的位置。

VSC附加变量里调制比m的初值非常重要,我习惯根据直流电压和交流电压初值反算:m = (2√2 / √3) * U_s / U_dc。如果懒得算,给0.8左右的中间值通常也能收敛,但在极端工况下容易触发调制比越限。

收敛判据我用的是不平衡量向量的无穷范数小于1e-6,标准牛顿法在这个精度下通常10次以内收敛。如果超过15次还在晃,往往不是迭代次数不够,而是控制方式配平出了问题。

3.4 代码移植与扩展建议

这套代码做完之后,扩展方向很明确。一个是把换流器的稳态模型换成含变压器和滤波电抗的详细模型,这时换流器交流侧不再直接接在节点上,需要引入虚拟节点,变量个数从4个变为5到6个,方程也相应增加。另一个是加入换流器容量约束和电流限幅,在每轮迭代后检查P_s和Q_s是否越限,越限时把控制方式切换为定有功加限幅模式,这就进入潮流计算中“控制模式切换”的领域了。

代码移植到其它平台时需要注意Matlab矩阵运算自动适配稀疏存储,如果自己用C++或Python重写,雅可比矩阵一定要用稀疏格式,否则几十个节点的算例还看不出差别,到几百上千节点的配电网时候,稠密矩阵求逆就是灾难。Python端建议直接用scipy.sparse和scipy.sparse.linalg.spsolve。

4. 算例搭建与结果分析

4.1 算例系统构造

我用一个改造过的配网测试算例来验证代码,结构是经典配网系统改造:交流侧33个节点,保持原来拓扑,然后在节点10和节点25分别接入两个VSC换流站,两座换流站通过直流线路连接到一个3节点直流子网上,其中节点1接VSC1、节点2接VSC2、节点3作为直流负荷节点,直流负荷大小为0.2标幺。

这样构造的好处是交流子网成熟,算例参考数据齐全,不会因为交流部分本身的bug干扰交直流联调;直流子网规模虽然小,但包含了恒功率负荷、两条直流输电线路以及两个不同控制方式的换流器,足以覆盖统一求解法涉及的核心特性。

控制方式设置:VSC1采用定有功功率加定无功控制,有功给0.1标幺(向直流网注入功率),无功给0;VSC2采用定直流电压加定无功控制,直流电压目标1.0标幺,无功给0。这样直流子网有且仅有一个电压参考点,满足雅可比非奇异的基本条件,而VSC1负责把功率从交流系统送进直流网络,由VSC2维持直流电压平衡,最终功率流向和物理直觉完全一致。

4.2 参数与基准值计算

基准值选取是一个需要仔细交代的环节。交流侧我取基准容量为10MVA,基准电压取交流系统的线电压额定值12.66kV,直流侧基准容量同样取10MVA,基准电压取直流母线额定电压20kV。这里的关键点是交流侧和直流侧的基准容量必须一致,否则换流器两端的功率标幺值无法对接,统一求解法的功率方程就会错位。

直流线路参数换算一下。直流线路1连接VSC1和VSC2,长度取2km,电阻率按0.085欧姆每千米计算,总电阻0.17欧姆,折算到基准阻抗Z_base = 20kV^2 / 10MVA = 40欧姆,标幺值约0.00425;直流线路2连接VSC2和直流负荷节点,总电阻约0.102欧姆,标幺值约0.00255。这个标幺尺度比交流线路小,直流方程对电压变化非常敏感,正好能考验统一求解法处理直流网络的数值稳定性。

换流器损耗电阻折算到标幺后取0.005,对应额定功率下约0.5%的损耗,这在工程上是合理的量级。如果换流器容量是实际工程值,建议先用有名值算出额定损耗,再按S_base折算,不要盲取一个经验数。

4.3 运行结果与解读

跑完迭代,输出结果会自然分成三部分:交流节点电压、直流节点电压和换流器功率。交流部分的关键节点电压,节点9的电压幅值大约0.970,相角-0.4度左右;换流器接入节点10由于有功被抽走,电压幅值略降到0.965;节点25作为另一座换流站接入点,电压波动幅度还要再小一点。整体看电压分布规律合理,没有出现局部崩溃或越限。

直流部分三个节点的电压都在0.999到1.001标幺附近浮动,符合直流电压控制的效果。直流负荷节点因为负载功率,电压略低于VSC2控制的节点,两条线路上的功率方向与设置一致。VSC1注入直流网络的0.1标幺有功,加上VSC2根据直流电压平衡自动调整的功率,一起满足直流负荷的0.2标幺需求,功率守恒是严丝合缝的。

收敛表现上,初值给好后5到8次迭代就能满足1e-6的收敛精度,每次迭代的不平衡量单调下降,没有明显迂回。这说明统一求解法在这个规模的系统上数值特性很好。我还故意做了一个实验:把VSC2改成定有功控制,这样整个直流网络没有电压参考点,雅可比矩阵直接奇异,Matlab会给出矩阵接近奇异的警告。这个实验能帮你理解电压参考节点在直流潮流中到底起什么作用。

5. 常见问题与调试经验

5.1 收敛失败问题定位与处理

我在实际调试中遇到最多的场景是迭代发散或者卡在某个数值附近来回震荡。这类问题的排查顺序可以固定下来,避免瞎试。

先检查初值。交流节点初值是否在合理范围内,直流电压初值是否与直流基准电压匹配,调制比初值是否接近稳态值。很多发散问题根源就是初值离解太远,牛顿法第一大步就把变量推到了不可行域。然后检查控制方式。全系统是否至少有一个换流器定直流电压或下垂控制,多个定直流电压换流器之间是否存在冲突,如果两个换流器同时定直流电压,各自的参考值又不一致,迭代过程会一直在两个目标之间找折中,表现为不平衡量不再下降。最后检查符号约定。换流器有功方向“整流为正还是逆变”是否全系统统一,直流负荷的功率方向是否与直流方程中的注入方向一致。这个看似低级的问题,在代码整合时特别容易混。

5.2 雅可比奇异的根源排查

雅可比矩阵奇异是统一求解法最令人头疼的问题之一。排查思路是先做一次只含交流部分的计算,确认交流雅可比本身没问题;然后加入直流网络但不加换流器,用固定电压源代替,确认直流导纳矩阵没问题;最后完整加入VSC模型,这时候如果奇异,问题基本出在直流电压参考点缺失或者控制方程与变量编号不匹配。

控制方程与变量编号不匹配的典型表现是:不平衡量向量里某个VSC方程全是0,或者某一行雅可比在对应列全部为0,找不到任何偏导关系。这种情况多数是控制方式替换时,方程写在了一个不被该VSC变量影响的索引位上。我调试时会在组装雅可比矩阵之后打印每个方程对应的非零列索引,人眼扫一遍就能定位。

5.3 工程应用中的额外注意点

把代码用于实际工程之前,还有几个点务必确认。一是基准容量的一致性,前面提过,交流侧、直流侧、换流器数据都要用同一个S_base。二是换流器损耗模型的粗细程度对结果的影响,损耗模型越精细,迭代收敛后的功率结果越可信,但不要为了精度把模型搞到不收敛。三是输入数据的量纲,Matlab代码常直接用标幺值运算,但原始工程数据往往是kV、MW、欧姆,换算务必用脚本统一处理,别在数据文件里手工换算,容易出错。

配电网的换流器控制策略比输电网更多样,定交流电压控制经常用于弱网支撑场合,下垂控制用于多端直流功率自动分配,这些控制方式增加的方程本质上都不复杂,关键还是把该方程正确嵌入统一求解法的整体方程体系中。每增加一种控制方式,建议先用一个极小系统验证雅可比矩阵数值正确性,再放到完整算例上跑。

在这套代码上反复调试几次之后,我最大的体会是:统一求解法的编程复杂度其实并不在牛顿迭代本身,而在“变量配平”和“雅可比组装”这两个环节。只要把变量编号和方程编号的对应关系理清楚,每一块偏导单独验证过,后面的扩展——加入更多换流器、更多直流节点、更复杂的控制策略——都只是重复已有的模式。如果后面有人想把这个框架延伸到三相不平衡潮流或者电磁暂态分析,统一求解法的分块结构也依然适用,只是每个模块内部的方程要换一套体系。先把稳态这版跑透、跑稳,后续的路会顺很多。

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

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

立即咨询