
在电力系统这个圈子里交直流混合配电网这两年是真的热。分布式光伏、储能、直流充电桩大规模接入传统交流配网越来越难扛直流配电的优势就摆在了台面上——效率高、控制灵活、对新能源友好。但问题是交直流混合之后潮流计算不再是纯交流那一套直流网络方程、换流器控制特性都得耦合进来这给仿真计算带来了新麻烦。我前阵子刚好用Matlab把统一求解法的交直流混合配电网潮流计算完整实现了一遍从数学建模到代码落地踩了不少坑这篇就把整个思路和实操细节捋清楚给准备做这块研究或工程应用的朋友一个能直接抄作业的参考。1. 内容整体设计与思路拆解1.1 为什么要专门做交直流混合配电网潮流计算先想明白一件事传统配电网是纯交流系统潮流计算用牛拉法或者PQ分解法早就很成熟了。但交直流混合之后问题变得不那么简单了。直流网络的存在让系统多了一套完全不同的电气约束——直流线路没有无功概念功率流动只跟电压和电流有关换流器作为交直流的接口它的控制策略又直接决定了功率怎么在两个网络之间传递。这几层耦合关系让潮流计算必须同时考虑交流网络方程、直流网络方程、换流器方程三组约束纯交流潮流那一套解法直接失效。我做过一个典型的案例在一个双端交直流配电网中交流侧接入两台VSC换流器中间通过直流线路互联。如果只把换流器当成简单的PQ节点或者PV节点来处理忽略直流线路的损耗和电压降落算出来的潮流分布和真实情况相差能到百分之七八。这在做保护整定、网损分析和优化调度时是没法接受的。所以交直流混合配电网的潮流计算核心就在于把换流器和直流网络的状态量都纳入统一求解框架这才是工程上真正可靠的做法。1.2 统一求解法一次求解全系统收敛统一求解法Unified Method的思路听起来不复杂把交流变量节点电压幅值、相角和直流变量直流节点电压、换流器控制变量放到同一个迭代向量里建立扩展的雅可比矩阵用牛顿法一次迭代同时更新所有变量。它和交替求解法最大的区别是交替法先算交流潮流、再把结果交给直流网络算反复迭代直到收敛本质上是一种松耦合统一法把交直流的所有方程捏在一起建立完全的耦合模型理论上收敛性更好对强耦合场景也扛得住。实际用起来统一法的优势很明显。我在跑多端直流配电网时比如三端、四端交替法经常出现收敛慢甚至震荡的情况特别是换流器控制模式比较多的时候不同控制目标之间互相影响松耦合迭代搞不定。统一法从数学上把这种耦合关系一次性处理掉了初期构造雅可比矩阵麻烦一点但是一旦矩阵建模正确收敛速度和稳定性都稳得多这也是我最后选统一法的原因。2. 装备选择与Matlab代码实现架构2.1 Matlab平台为什么适合做这个说实话交直流混合配电网潮流计算这个事用Matlab做开发确实有它的道理。矩阵运算是Matlab的看家本领潮流计算的核心就是稀疏矩阵的存储、分解和迭代更新这块Matlab有天然优势。另外VSC换流器的控制策略、直流网络的拓扑结构这些东西变化很快大家做研究时最常改的就是控制参数、节点参数和网络拓扑Matlab脚本写起来改起来效率高迭代试错成本低。Matlab里实现潮流计算没有现成的专用工具箱但没必要非得买什么电力系统分析包——基本的矩阵运算、稀疏矩阵功能完全够用。我主要的做法是直流网络用节点导纳矩阵直流潮流电导矩阵建模交流网络按常规方式建节点导纳矩阵考虑变压器、线路参数换流器用功率传输方程建模然后把三套方程拼到一个非线性方程组里用牛顿法求解。整个过程不需要额外工具箱纯Matlab代码就能搞定。2.2 代码整体架构设计实现的时候我采用了模块化设计主要分成五个功能块这样改网络拓扑或换流器控制模式时只需改对应模块不用整个脚本重写交流网络参数模块AC_Data.m交流节点编号、负荷、发电/分布式电源出力、线路导纳矩阵直流网络参数模块DC_Data.m直流节点编号、直流负荷、直流线路电阻、直流电导矩阵换流器控制参数模块VSC_Data.m换流器接入的交流节点、直流节点、容量、控制模式定功率、定电压、定无功等潮流计算主程序模块Unified_PowerFlow.m构造扩展雅可比矩阵、迭代求解结果输出模块Print_Results.m输出交直流节点电压、支路功率、换流器损耗等主程序和子模块的关系是单向依赖的——数据文件只提供参数不涉及算法算法程序只做计算不涉及输入输出。这种分离的好处我在实际调试中深有体会改参数不用动算法改算法不会影响数据排查问题能快速定位是数据问题还是计算逻辑问题。3. 核心数学模型与统一求解法原理3.1 VSC换流器的数学模型统一求解法里最核心的就是换流器的建模。不夸张地说换流器模型建不好整个潮流计算就是空中楼阁。VSC换流器在潮流计算中通常采用基波分量模型忽略谐波影响。换流器与交流系统之间的功率交换通过换流变压器和相电抗器实现功率方程为[ P_{sj} U_{sj}^2 G_{tj} - U_{sj} U_{cj}(G_{tj} \cos \delta_j B_{tj} \sin \delta_j) ] [ Q_{sj} -U_{sj}^2 B_{tj} U_{sj} U_{cj}(B_{tj} \cos \delta_j - G_{tj} \sin \delta_j) ]其中(U_{sj})是换流器接入交流节点的电压(U_{cj})是换流器交流侧输出电压即VSC桥臂输出电压的基波分量(\delta_j)是(U_{cj})滞后(U_{sj})的相角(G_{tj})和(B_{tj})是换流变压器加相电抗器的等效导纳。这套方程是整个换流器建模的地基一定要反复核对符号和变量关系错了后面全乱。直流侧与交流侧的有功功率是平衡的忽略损耗即[ P_{dcj} U_{dcj} I_{dcj} P_{sj} ]无功功率则由换流器的控制策略决定——定无功控制就固定(Q_s)定交流电压控制就把(U_s)固定下来。这部分方程是整个交直流耦合的桥梁统一求解法之所以能把交直流网络一起算靠的就是它建立了直流变量(U_{dc}, I_{dc})和交流变量(U_s, \delta)的数学联系。3.2 直流网络模型直流网络相对简单没有相角、无功的问题节点功率方程就是[ P_{dci} U_{dci} \sum_{j \in i} G_{dcij} U_{dcj} ]形式上和交流潮流的有功方程很像但只有一个电压变量(U_{dc})没有相角。直流节点分两类一类是连接换流器的节点这类节点的(P_{dc})受换流器控制方式约束另一类是纯直流负荷节点(P_{dc})直接给定只需解电压。在构建扩展雅可比矩阵时这些方程要加在交流方程后面形成分块对角加互耦的结构互耦部分就是换流器方程提供的交直流交叉偏导。3.3 统一求解法的修正方程把交流节点的有功无功不平衡量、直流节点的不平衡量、换流器控制方程的不平衡量全部放在一起形成扩展不平衡向量(\Delta F)对应的变量向量包含(\Delta \theta)、(\Delta U_s/U_s)、(\Delta U_{dc})以及换流器的控制变量(\Delta \delta)、(\Delta U_c)等。修正方程形式如下[ \begin{bmatrix} \Delta P \ \Delta Q \ \Delta P_{dc} \ \Delta F_{VSC} \end{bmatrix}-J \begin{bmatrix} \Delta \theta \ \Delta U_s / U_s \ \Delta U_{dc} \ \Delta \delta \ \Delta U_c / U_c \end{bmatrix} ]其中(J)就是扩展雅可比矩阵。核心工作就是要求出各分块矩阵的偏导数表达式包括交流节点对交流变量、直流节点对直流变量、以及换流器方程对交直流两侧变量的交叉偏导数。这部分推导繁琐但不算难难的是别漏项。我在代码里用了数值差分辅助校验解析推导的结果——先用解析表达式算出雅可比矩阵的某一列再用数值差分验证偏导数正确性确保矩阵完全正确。4. 实操过程与核心代码实现4.1 数据准备部分的关键细节和交流纯潮流一样交直流混合潮流的第一步也是把网络数据整理清楚。我习惯把这个过程拆成三个矩阵交流节点数据矩阵ACbus[节点编号, 类型, P负荷, Q负荷, P发电, Q发电, 电压幅值初值, 相角初值]交流支路数据矩阵ACbranch[首端节点, 末端节点, 电阻, 电抗, 电纳, 变比]直流节点数据矩阵DCbus[节点编号, 类型, P负荷, 电压初值]直流支路数据矩阵DCbranch[首端节点, 末端节点, 电阻]换流器数据矩阵VSCdata[换流器编号, 接入交流节点, 接入直流节点, 控制模式, 控制目标值, 换流变压器阻抗, 容量]有一点要特别注意直流线路电阻值通常很小尤其在低压直流配电网中线路电阻可能只有零点几欧姆形成的电导矩阵数值会很大。这会导致直流节点功率方程的量纲和交流侧差异较大在扩展雅可比矩阵中可能出现数值病态。解决办法是采用标幺值系统把交流、直流两侧都统一到标幺值下进行计算这样数值范围就协调了。我一开始就吃过这个亏用有名值算怎么都不收敛换成标幺值一次就过了。4.2 换流器控制模式的代码实现换流器控制模式是交直流潮流计算的灵魂我最常用的四种控制模式如下控制模式控制目标对应方程定有功功率控制(P_s P_{ref})(P_s - P_{ref} 0)定无功功率控制(Q_s Q_{ref})(Q_s - Q_{ref} 0)定直流电压控制(U_{dc} U_{dcref})(U_{dc} - U_{dcref} 0)定交流电压控制(U_s U_{sref})(U_s - U_{sref} 0)在代码里我用了控制标志位的方式实现每个换流器有一组标志位程序根据标志位自动把对应的约束方程纳入不平衡量向量。举例来说% VSC控制模式选择 if VSCdata(j, 4) 1 % 定有功定无功 F_VSC(1) P_s_calc - VSCdata(j, 5); F_VSC(2) Q_s_calc - VSCdata(j, 6); elseif VSCdata(j, 4) 2 % 定直流电压定无功 F_VSC(1) U_dc_calc - VSCdata(j, 5); F_VSC(2) Q_s_calc - VSCdata(j, 6); elseif VSCdata(j, 4) 3 % 定有功定交流电压 F_VSC(1) P_s_calc - VSCdata(j, 5); F_VSC(2) U_s_calc - VSCdata(j, 6); end这里有个关键点在交直流混合系统中必须有至少一个换流器采用定直流电压控制因为直流网络需要电压支撑才能确定整个直流系统的电压水平。否则直流系统的电压会悬空雅可比矩阵奇异计算必然发散。这个和纯交流系统中必须有平衡节点是同一个道理。我见过很多新手在这里犯错换流器全设成定功率控制结果怎么调初值都不收敛。4.3 扩展雅可比矩阵的组装技巧组装扩展雅可比矩阵是代码实现里最繁琐的部分。我的做法是分块组装先用稀疏矩阵存储交流子阵再拼接直流子阵和换流器交叉子阵% 交流潮流雅可比子阵常规牛顿法 [H, N, K, L] AcJacobi(V, theta, Ybus); % 直流雅可比子阵对Udc的偏导 DC_J DcJacobi(Udc, Gdc, Pdc_spec); % 换流器交叉偏导子阵 VSC_J VscJacobi(V, theta, Udc, VSCdata); % 组装扩展雅可比矩阵 J_ext [H N*Uc N_dc; K L*Uc M_dc; VSC_dc VSC_ac VSC_vdc];组装时一定要反复检查矩阵维度是否匹配——交流变量个数加直流变量个数加换流器控制变量个数必须等于方程个数否则就是欠定或超定牛顿法根本没法解。我在代码里专门写了一个断言函数检查维度每次修改模型后跑一遍能在早期拦截大量低级错误。雅可比矩阵的修正方程求解我直接用Matlab的左除运算符\它内部会按照稀疏矩阵的特性选择合适的分解算法比手动LU分解快不少。在节点规模几百个以内时全牛顿法的每步迭代时间都在毫秒级别完全不用担心性能问题真正影响收敛速度的是初值质量和雅可比矩阵的正确性。4.4 主迭代循环与收敛判据主迭代循环的框架和常规牛顿法潮流一致关键是设置合理的收敛判据。我一般设交流节点功率不平衡量和直流节点功率不平衡量的最大绝对值都小于(10^{-8})标幺值同时换流器控制方程的不平衡量也小于(10^{-8})三个条件同时满足才认为收敛。iter 0; while max(abs(dF)) 1e-8 iter 50 % 计算不平衡量 dF ComputeMismatch(V, theta, Udc, VSCdata); % 组装扩展雅可比矩阵 J_ext AssembleJacobian(V, theta, Udc, VSCdata); % 求解修正方程 dx J_ext \ (-dF); % 更新状态变量 [V, theta, Udc, delta, Uc] UpdateState(V, theta, Udc, delta, Uc, dx); iter iter 1; end迭代过程中我最常加的一个保护是用阻尼因子控制更新步长防止变量更新过大导致震荡。具体做法是计算alpha min(1, 0.8 / max(abs(dx)))然后x x alpha * dx。这招在启动阶段初值不准的时候极其管用能避免大量发散情况。等到迭代了几步进入收敛区后再恢复全步长牛顿法更新收敛速度基本不受影响。5. 常见问题与排查技巧实录5.1 收敛失败八成是初值或控制模式的问题我在调试过程中遇到的收敛问题非常多总结下来90%以上出在三个方面第一是初值设置不合理。直流电压初值如果偏离额定值太远比如额定800V给了100V的初值换流器功率方程在迭代初期会产生很大的不平衡量导致雅可比矩阵数值不稳定。我现在的做法是直流节点电压初值统一设为额定值交流节点相角初值设为零电压幅值设为额定值换流器控制角(\delta)初值设为零(U_c)初值设为交流电压幅值乘以一个略大于1的系数考虑到换流变压器压降。这套初值虽然朴素但在绝大多数场景下都能让迭代顺利启动。第二是换流器控制模式配置不合理。前面提到过必须有定直流电压控制的换流器作为直流电压支撑。另外如果有两个换流器同时定直流电压会造成功率分配不确定的问题雅可比矩阵也可能奇异。我在多端直流配电网中一般只保留一个定电压换流器其余全部定功率这样直流电压稳定性和功率分配都能同时满足。第三是参数单位混乱。这个最冤——换流器阻抗用标幺值交流线路用有名值结果算出来的雅可比矩阵数值相差几个数量级。我现在的统一做法是所有阻抗、功率、电压都转成标幺值再进计算核心数据入口处的转换做好计算过程中全部使用标幺值输出结果时再转回有名值。这样不仅收敛性好代码的可维护性也高很多。5.2 雅可比矩阵奇异的判断方法当牛顿法迭代发散时我第一步就是检查雅可比矩阵的条件数。Matlab里用condest(J_ext)可以快速估计稀疏矩阵的条件数。条件数过大比如超过(10^{12})说明矩阵接近奇异这时基本可以断定是控制模式配置问题——缺少定电压换流器、或者某个换流器控制方程和节点功率方程线性相关。还有一种情况比较隐蔽某台换流器接入的交流节点如果是PV节点同时它的定交流电压控制又要把这个节点电压固定住这时候两个方程描述的是同一个约束雅可比矩阵必然奇异。我在实际中就碰到过这个问题——换流器接入节点设成了PV节点同时换流器又选了定交流电压控制功能重复了。解决方法是换流器接入交流节点不要设置成PV节点让换流器的控制方程来决定这个节点的电压和无功避免约束冲突。5.3 换流器损耗的建模问题有的文献中换流器模型考虑损耗有的不考虑这在工程应用中差别很大。损耗建模最简单的方式是在换流器交流侧和直流侧之间加一个等效电阻精确一点的方法是用换流器的损耗曲线空载损耗加负载损耗。我在代码中实现了几种损耗模型用标志位切换if VSC_loss_model 0 % 忽略损耗P_ac P_dc elseif VSC_loss_model 1 % 等效电阻模型P_ac P_dc I_dc^2 * R_loss elseif VSC_loss_model 2 % 分段线性损耗特性根据有功功率查表求损耗 end实际算下来损耗模型对潮流分布的影响在网损和直流电压分布上有明显体现特别是大功率传输时等效电阻模型的结果和实测数据更接近。如果你的研究重点是网损分析一定要把损耗模型带上不能省略。5.4 代码调试的实战技巧最后分享几个我在Matlab里调试交直流潮流程序时提炼出的实用技巧第一是分步验证法。不要一上来就调整个交直流联合系统先把交流部分单独跑通再把直流部分单独跑通最后才联调。交流部分可以用标准的IEEE节点测试系统验证直流部分可以手算一个简单的两节点直流网络核对结果。联调时先跑一个节点规模最小、控制模式最简单的算例比如单台换流器带一个直流负荷确认没问题再逐步扩大规模。这样出现问题很容易定位在哪一部分。第二是使用Matlab的调试断点配合工作区检查。在迭代更新x的那一行设置断点观察dx的变化趋势。如果dx的符号频繁震荡且幅值不衰减说明雅可比矩阵有问题或者控制模式配置不当如果dx单调减小但速度很慢说明初值给得离真实解太远考虑改用阻尼牛顿法。第三是用画图辅助判断收敛过程。我在迭代循环里把每次迭代的max(abs(dF))记录下来迭代结束后画成半对数坐标曲线。收敛正常的曲线应该是指数下降的如果曲线出现平台期或者上升段说明计算过程有异常顺着异常点的迭代次数定位当时的变量状态和数据能快速发现问题。这种可视化排查方法在复杂交直流系统调试中帮我节省了大量时间。第四是注意数值精度与显示格式问题。format long应该常开尤其是在检查收敛判据时要看到足够多的小数位。另外Matlab默认的数值显示可能会把很小的量显示为零这在计算雅可比矩阵数值差分验证时容易造成误判所以数值差分步长的选择也很讲究——我一般取(10^{-6})太大会造成截断误差太小会遇到舍入误差。6. 个人体会与后续扩展交直流混合配电网潮流计算的统一求解法工程实现的难度并不在于牛顿法的框架——那个学过电力系统分析的人都会——真正的难点在于对换流器控制特性和交直流耦合约束的深入建模。能把这个模型用Matlab代码准确、高效地实现出来你对交直流系统的理解就会上一个台阶。我个人在实际操作中的体会是初学阶段不妨先从单台换流器加简单直流负荷的算例开始手算和代码互相验证一次把换流器的数学模型吃到骨头里再去扩展多端系统、复杂控制策略。这套流程走下来后面遇到实际工程数据的分析就会顺手很多。这个代码框架后续还可以往好几个方向扩展一是加上网损灵敏度分析用于交直流配电网的网损优化二是和时序潮流结合跑一天24小时的分布式光伏出力曲线和负荷曲线分析电压波动情况三是把换流器的损耗模型细化做更精确的能效评估四是拓展到多端直流系统和柔性直流配电网。Matlab的灵活性和矩阵计算能力在这类研究里有很大的发挥空间框架搭好之后后面就是在这个基础上加模块的问题了。