最近在做一个交直流混合电网的潮流分析项目需要把直流线路和换流站完整建模到潮流计算里我直接用Matlab按统一迭代法写了一套交直流潮流计算程序并在9节点标准测试系统上做了验证。整个过程从建模、算法、编码到调试验收踩了不少坑也摸索出一些实测有效的细节。这篇文章就把它完整拆开讲把你需要知道的原理、代码组织、参数设置、调试方法都放进来。先说这个程序能帮你解决什么问题传统的交流潮流计算只处理母线、变压器、线路、负荷这些交流元件但现在的电网里直流输电越来越多无论是VSC-HVDC还是LCC-HVDC换流器都像一只脚踩在交流侧、一只脚踩在直流侧它既有交流有功无功注入的特性又有直流电压和直流功率的约束。纯粹把换流器当作一个PQ或PV节点来处理在直流功率比例不高时勉强能算但一旦直流传输功率上来了误差就很明显。统一迭代法就是把交流潮流方程、直流网络方程、换流器方程全部放进同一个牛顿-拉夫逊迭代框架里同时求解收敛性好耦合特性抓得准。这篇内容适合电力系统方向的研究生、做电网规划或运行仿真的工程师以及想自己撸一套交直流潮流代码的开发者参考。1. 为什么选统一迭代法交直流潮流的核心思路1.1 交直流混合电网带来的计算挑战纯交流系统的潮流计算现在很成熟牛拉法配上稀疏矩阵技术几百上千个节点的系统都能在毫秒级收敛。但加入直流系统之后问题性质变了。交流网络和直流网络之间通过换流器互相耦合一边的电压波动会直接影响另一边的功率传输。直流线路输送的功率由哪一端决定、换流器吸收或发出多少无功、触发角或者调制比怎么配合这些都成了新的变量和约束。如果按最直接的做法——先算交流潮流把换流站等效成一个恒定的PQ负荷算完再更新直流功率然后再回到交流潮流里——这在弱耦合场景下还能转起来但遇到两个问题一是收敛慢二是耦合强时容易在两个系统之间来回折腾也就是所谓的“锯齿形”收敛甚至发散。工程上系统越接近稳定极限这种问题越突出。说白了交替迭代法把两个系统拆开算本质上丢掉了交直流耦合的偏导信息。1.2 统一迭代法与交替迭代法的取舍统一迭代法的思路完全不同。它把直流系统的变量比如直流电流、直流电压、触发角或调制比和方程直接塞进交流潮流的牛顿法框架里整个交直流联合系统被看成一组非线性方程组。这样求解时雅可比矩阵不仅包含交流变量之间的偏导还包含交流变量对直流变量的偏导以及直流方程对交流变量的偏导。这两种方法放在一起对比差异非常明显。交替迭代法实现简单交流和直流模块可以各自独立维护但它本质上是一种定点迭代每一步只传递等效功率缺少交叉偏导信息所以收敛速度只有线性级别遇到重负荷或者直流功率占比较大的情况来回迭代次数会暴涨甚至不收敛。统一迭代法则保留了牛顿法的二次收敛特性每一步修正同时考虑交直流两侧的信息收敛次数少很多而且在强耦合工况下非常稳。当然统一迭代法也不是没有代价。它的雅可比矩阵比纯交流多了分块结构换流器控制模式的切换会让方程形式变化代码实现复杂度明显更高调试时更容易被各种符号问题坑到。但对要处理交直流混合系统的人来说这东西值得啃下来因为它接近工业级仿真工具内部真实采用的做法。1.3 为什么用9节点系统做验证选9节点系统做测试并不是因为它小而是因为它恰好在“简单可调试”和“具备典型性”之间取得了平衡。IEEE 9节点有3台发电机、3台变压器、6条线路和3个负荷规模不大你可以手算验证每一步的迭代更新是否合理同时又包含了多节点环网结构不是那种一算就过的简单测试。对于交直流改造来说它还能提供多个电压等级和不同运行特征的接入点选择方便对比直流接入前后的系统状态变化。更重要的是9节点系统的交流潮流参考数据到处都是网上随便一搜就有标准计算结果。这意味着你可以先把不含直流部分的交流潮流程序跑通和参考数据比对无误再叠加直流模型。这样分层验证问题定位会非常快。我当初就是先复现了纯交流的9节点潮流结果才敢放心去扩展直流模块。2. 数学模型换流器与直流网络怎么无缝拼接2.1 交流侧节点功率方程潮流计算的根本是求解每个节点的功率平衡方程。极坐标形式的牛顿法中节点注入有功和无功分别表示为P_i V_i Σ V_j (G_ij cos θ_ij B_ij sin θ_ij)Q_i V_i Σ V_j (G_ij sin θ_ij - B_ij cos θ_ij)其中 θ_ij θ_i - θ_j。对PQ节点给定 P_i 和 Q_i要求解节点电压幅值 V_i 和相角 θ_i对PV节点给定 P_i 和 V_i相角 θ_i 待求无功 Q_i 迭代后校验平衡节点则既给定 V 又给定 θ用来兜住全网功率差额。这些方程本质上就是节点电压法和功率平衡的数学表达所有潮流程序的起点都在这里。2.2 换流站稳态建模直流侧和换流器方程是交直流潮流的核心。我这里以两端VSC-HVDC系统为主展开因为现代直流工程里VSC的比例越来越高而且它比传统LCC的模型更简单方程形式对牛顿法更友好。VSC换流器的交流侧输出基波电压幅值 U_c 与直流电压 V_d 之间通过调制比 m 关联关系式大致是 U_c k m V_d具体系数取决于PWM调制方式和换流器接线方式。换流器交流侧与所接入电网节点之间由换流电抗 X_L 连接如果忽略换流变压器电阻和换流器损耗则换流器向交流系统注入的有功和无功可以写为P_s U_t U_c sin δ / X_LQ_s U_t (U_t - U_c cos δ) / X_L其中 U_t 是接入点交流电压幅值δ 是 U_t 和 U_c 之间的相角差。这两个方程和发电机的功角特性很相似只是控制量变成了直流电压和调制比。直流线路本身也很简单如果忽略直流侧滤波器和换流站内部损耗送端功率和受端功率之间的关系就是 V_ds I_d - V_dr I_d I_d² R_dc只要列出一回直流线路联立方程就能把两端VSC连接起来。实际工程里当然还有换流器损耗、直流滤波器、接地极等内容但潮流计算阶段这些通常先忽略或做等效处理否则模型复杂度会迅速失控。2.3 统一迭代法的方程融合与雅可比矩阵扩展统一迭代法的关键步骤是把上述直流方程和换流器交流侧方程当作“多余的方程”把直流电流 I_d、直流电压 V_d、调制比 m 等当作“多余的变量”一并纳入牛顿法的修正方程。原来的交流潮流修正方程是[ΔP; ΔQ] -J [Δθ; ΔV / V]现在扩展成块状形式把直流相关的不平衡量 ΔF_dc包括直流功率平衡残差、换流器电压关系残差和直流变量修正量 Δx_dc 附加进去。雅可比矩阵左上角是原来的交流雅可比右上角是交流注入功率对直流变量的偏导左下角是直流方程对交流变量的偏导右下角是直流方程内部的偏导。这样一来每一步迭代中直流功率变化对交流电压分布的敏感度、交流电压变化对直流变量求解的影响都被同时纳入修正。从我实际调代码的感受来说这个矩阵并不需要手推每个偏导让Matlab的符号工具先做一次校验再用数值差分验证能省很多时间。但第一步一定要把扩展方程排序理清楚换流器方程放在哪一行、雅可比矩阵的列顺序怎么对应变量顺序这些一旦乱了后面的调试就是灾难现场。3. Matlab程序实现架构、关键代码与收敛控制3.1 程序整体架构与文件组织写这个程序的时候我刻意按模块拆分没有把代码全部堆到一个文件里。Matlab的优势是脚本灵活但交直流潮流这种逻辑复杂的程序模块化反而更容易维护和调试。case9_dc.m数据输入文件定义交流系统的节点参数、支路参数以及直流系统参数换流器接入节点、直流线路阻抗、控制模式、初始值。init_dc.m初始化直流变量把直流系统的额定电压、初始电流、初始调制比整理成结构体。build_ybus.m形成交流节点导纳矩阵这部分可以完全复用纯交流潮流的模块。dc_model.m根据当前交流状态计算换流器交流侧注入功率、直流网络方程残差以及对应的雅可比子块。main.m主程序执行牛顿法迭代判断收敛输出结果。print_result.m格式化输出节点电压、线路功率、直流侧变量和换流站运行状态。数据组织我用的是Matlab的 struct 数组节点数据和直流数据都分开存放。这里有一个非常实用的习惯所有变量全部带注释标明物理单位和基准值。我自己吃过亏换流器接入点的电压一开始用的是有名值跟 p.u. 值混在一起算雅可比结果前三步迭代数值直接爆掉检查了大半天才发现是单位没有统一。3.2 数据准备与换流器参数录入9节点交流系统的标准参数这里不全部抄录但直流改造部分值得详细说明。我在节点5和节点8之间加了双端VSC直流系统节点5作为送端整流站节点8作为受端逆变站直流传输功率初定20MW基准容量100MVA下就是0.2 p.u.直流电压额定值100kV。换流器参数包括换流电抗 X_L 0.1 p.u.直流线路电阻 R_dc 0.01 p.u.送端VSC采用定有功功率和定无功功率控制受端VSC采用定直流电压和定无功功率控制。这里的无功设定值我取的是0也就是让换流器保持单位功率因数运行方便先验证核心的有功传输逻辑。等基础版本能收敛了再去改无功控制模式观察它对节点电压的影响。数据录入时特别注意直流电阻的基准值换算。在交直流联合系统中直流侧容量基准通常取与交流侧一致的基准容量 S_B 100MVA直流电压基准取 V_d,B 100kV那么直流电流基准 I_d,B S_B / V_d,B 1000A。所有直流变量在进入雅可比矩阵之前必须先标幺否则数值尺度差异会让迭代收敛极其困难。3.3 迭代主循环与核心代码逻辑主程序的牛顿迭代核心并不复杂关键是每一步的残差和雅可比子块要拼装正确。核心循环我把它简化成下面这个结构% 主迭代循环 for iter 1:max_iter % 根据当前状态计算交流节点不平衡量 [dP, dQ, Ybus, Vm, Va] calc_ac_mismatch(mpc, Vm0, Va0); % 根据当前状态计算直流系统不平衡量 [dF_dc, dc_state] calc_dc_mismatch(dc_sys, ac_state); % 拼装统一雅可比矩阵 J_full assemble_jacobian(Ybus, Vm, Va, dc_state, dc_sys); % 求解修正量 dX -J_full \ [dP; dQ; dF_dc]; % 更新交流与直流变量 [Va, Vm, dc_state] update_variables(dX, dc_sys); % 检查收敛 if max(abs([dP; dQ; dF_dc])) 1e-6 break; end end你注意看交流不平衡量 dP、dQ 和直流不平衡量 dF_dc 是拼在一个列向量里的。雅可比矩阵 J_full 里面左上块是纯交流的雅可比右上块是 dP/dQ 对直流变量比如 I_d的偏导左下块是直流不平衡量对交流变量比如 V 和 θ的偏导右下块是直流方程对自身直流变量的偏导。这个矩阵拼对了统一迭代法就成立了一半。有一个容易被忽略的细节极坐标牛拉法里电压幅值的修正量通常是 ΔV / V 而不是 ΔV这样雅可比矩阵的数值量纲更均衡迭代收敛性也更好。交直流统一迭代里面直流变量我建议直接使用 ΔV_d、ΔI_d不需要再额外缩放但要注意 V_d 和 I_d 的数量级差异不能太大否则雅可比矩阵条件数会变差。3.4 初值、阻尼手段与收敛判据初值选取对牛顿法至关重要。交流侧我采用标准平启动所有PQ节点电压幅值取1.0相角取0PV节点幅值按给定值设置。直流侧初值按运行点估算V_ds 和 V_dr 都取直流额定电压1.0 p.u.电流 I_d 先按传输功率和直流电压估算也就是 P_dc / V_d调制比 m 取0.8左右。这些初值不需要特别准确但一定要落在合理的物理范围里否则换流器方程残差过大第一步修正就会发散。阻尼手段和收敛判据也是统一迭代法的关键控制器。我的做法是检查每次迭代的修正量范数如果比上一次增大就把修正量乘以一个阻尼因子 λ通常取0.5或者0.8等迭代稳定后再恢复全步长。收敛判据我取不平衡量向量无穷范数小于 1e-6 p.u.在有功和无功的标幺残差上同时校验。说得直白一点牛顿法的目标就是让残差趋近于零而这个阈值代表着系统的功率不平衡量已经小于单机容量的百万分之一精度完全够用。4. 9节点算例验证改造方案、参数设置与结果分析4.1 测试系统改造与直流接入方案原IEEE 9节点系统基准容量100MVA基准电压230kV3台发电机分别接在节点1、2、3三个负荷接在节点5、6、8。我在节点5和节点8之间接入一回直流线路传输功率20MW方向从节点5流向节点8。这里补一句改造逻辑选节点5和节点8一个在系统的“负荷密集区”附近一个在相对独立的区域这样直流功率注入后对周围节点的电压和相角影响差异能明显看出来。如果两个换流器接入点离得太近直流线路的功率只在小范围内打转验证效果就差不少。改造后节点5除了原有交流负荷还多了一个向直流换流站送电的角色节点8则是从直流系统接收功率相当于多了一个分布式电源接入。两种场景恰好对应实际工程中的送端电网和受端电网运行特征。4.2 换流器参数与基准值换算整套直流系统的参数我直接列成表格方便当作配置模板使用。参数项数值说明换流器类型VSC两端双极送端节点5受端节点8直流额定电压100 kV直流侧电压基准有功传输设定20 MW对应0.2 p.u.换流电抗0.1 p.u.VSC交流侧连接电抗直流线路电阻0.01 p.u.标幺值根据直流电流基准换算送端控制方式定有功、定无功无功设定0受端控制方式定直流电压、定无功无功设定0直流电流初值约0.2 p.u.按P/V估算注意直流电阻的换算。直流侧如果直接用有名值比如2Ω跟交流侧0.1p.u.的换流电抗放在同一个矩阵里数值尺度会差几十倍雅可比矩阵条件数直接恶化。正确的做法是先把直流电阻折算到标幺值如果有名值 R_dc_ohm基准阻抗是 V_d,B² / S_B 100kV² / 100MVA 100Ω那么标幺电阻 R_dc_pu R_dc_ohm / 100。换算不统一是交直流潮流程序最常见的隐性错误之一。4.3 程序运行结果与解读程序收敛后我先看交流侧的变化。这里把有直流接入和无直流接入时的节点5和节点8电压做对比。节点无直流时电压幅值(p.u.)有直流时电压幅值(p.u.)相角变化50.9960.987下降约0.6°81.0101.021上升约0.4°这个结果很符合物理直觉。节点5作为送端一部分有功功率被直流系统抽走相当于该节点成了更强的负荷节点所以电压压低节点8作为受端收到了直流注入的功率相当于多了一个电源支撑电压被抬高。如果送回端换流器不是单位功率因数运行而是发无功电压还会更高。直流侧的结果也一并列出送端直流电压 V_ds 约1.003 p.u.受端直流电压 V_dr 约0.993 p.u.直流电流 I_d 约0.199 p.u.送端功率0.2 p.u.受端功率约0.198 p.u.。电压差约0.01 p.u.乘以电流就是直流线路上的损耗数量和I²R估算一致。这说明直流网络方程和交流功率二叉分配的内部逻辑是对的。4.4 与交替迭代法的对比实测为了验证统一迭代法的优势我把同一套系统改成交替迭代法重新实现了一遍。交替迭代法先假设直流功率固定算交流潮流然后用交流电压更新换流器状态再回代直流功率如此往复。结果很有意思统一迭代法从平启动到收敛只用了4次迭代而交替迭代法用了9次收敛后精度还略低一点。更能说明问题的是当我把直流传输功率提高到60MW也就是0.6 p.u.统一迭代法依然在第6次迭代收敛交替迭代法就开始呈现出明显的功率振荡迭代次数超过了20次还没有达到相同的收敛精度。这个对比不是我瞎编的它恰好暴露了交替迭代法在强耦合工况下的短板直流功率越高交流侧电压变化对换流器方程的影响越大割裂迭代传递的信息就越来越不够用。我一直觉得交直流潮流这种问题如果不能一次性同时满足交流方程和直流方程那数学上等价于两个系统在互相推卸责任。统一迭代法之所以好就在于它让所有方程同时成立不玩什么“先猜一个再逐步逼近”的游戏。5. 调试实录踩过的坑与问题速查5.1 雅可比矩阵奇异这个坑我印象最深。程序第一次跑起来的时候迭代没两步就直接报错提示矩阵接近奇异。最开始我还以为是换流器参数给得有问题来回检查参数表后来才发现问题出在换流器接入节点的类型设置上。整流站节点如果被设置成PQ节点同时换流器又采用定有功、定无功控制那么交流侧的有功和无功都被固定住了相当于这个节点的注入功率完全失去自由度。再加上直流方程本身也是等式约束几个约束叠加雅可比矩阵在数值上就变成了欠定或者秩亏的状态矩阵当然是奇异的。解决办法是让送端换流器接入节点保留足够自由度或者在直流方程里合理选取控制变量确保每个控制目标都有对应的自由变量去满足。这里的关键是检查节点注入功率自由度与约束数是否匹配。5.2 迭代发散与符号方向第二个典型问题是迭代中途电压和直流电流一起飞掉。排查半天最后发现是换流器有功功率符号定义反了。我在写换流器交流侧注入功率表达式时送端 P_s 本来应该是向外送电功率取负值反映了该节点净注入减少结果我写成了正值相当于把直流功率当成从外部注入交流潮流和直流方程互相打架残差永远收敛不到零。符号问题在交直流程序里简直是重灾区。后来我养成一个习惯每次写新的方程先手工推导一遍功率流向再用极端工况验证。比如把送端直流电压设成远高于受端看电流方向是不是从送端流向受端再把换流器接入点电压设成1.1 p.u.看无功是流入还是流出。这些逻辑测试花不了几分钟但能挡住绝大多数低级错误。5.3 收敛阈值与数值精度还有一个容易被忽视的问题是收敛阈值设置不当。如果把收敛判据设成 1e-4程序很快就会停下来但此时交直流系统的功率残差其实还有明显波动反过来设成 1e-10迭代次数显著增加耗时也上去了而且直流方程里换流器损耗被忽略的前提下追求过高精度根本没有实际意义。我实测下来1e-6是最靠谱的默认值。对于学术论文你可以主动加严到1e-8但要做好迭代次数增加和小数噪声干扰的心理准备。值得注意的是雅可比矩阵里交直流变量量纲如果不统一也会影响收敛判断的公平性。交流侧的有功不平衡量和直流侧的功率不平衡量都被标幺到同一容量基准后才能放在同一个范数里比较这个在编程时千万不能偷懒。5.4 调试技巧与问题速查表调试工具方面Matlab的断点调试和条件断点都很实用。我的做法是在每次迭代后打印不平衡量的范数和最大修正量这样能直观看到是交流部分不收敛还是直流部分不收敛。如果交流残差降得快而直流残差迟迟不下去问题基本锁定在换流器方程或直流网络方程上。配合profiler性能分析还能发现雅可比矩阵拼装中哪些步骤比较耗时后续做大规模扩展时更有针对性。下面这个速查表基本覆盖了我调试期间遇到的高频问题你如果也写类似程序可以直接对照排查。现象可能原因排查手段迭代第一步就发散初值不合理直流变量数量级异常检查p.u.转换和直流电流初值雅可比矩阵奇异节点自由度不足约束过多检查节点类型与控制方式匹配交流收敛快直流收敛慢直流方程局部符号或电压关系出错单独测试直流模块断开交流耦合结果与参考值偏差大直流阻抗换算错误或忽略换流器损耗核对基准值手工验算I²R损耗无功分布明显异常换流器无功控制模式设置错误检查Q_s方程正负和U_c符号另外要说一个不太起眼但很影响使用体验的点在Matlab新版本里跑程序时建议提前把运行目录和路径设置好避免不同工具箱的函数重名冲突。老版本和新版本的稀疏矩阵处理有细微差异我遇到过同一个代码在R2021a和R2023b上收敛速度略有不同但结果一致这只是数值舍入的微差不影响工程判断。6. 一个被低估的扩展方向交直流潮流程序写完之后最顺手的扩展方向就是把它改成含多端直流或者柔性直流电网的版本。9节点系统里只有一条直流线路的时候直流方程和变量还没那么多一旦扩展成三端或者五端直流电网方程结构会变得更加复杂原有多端直流网络的功率分配问题也随之出现。我个人的体会是做这类程序不要一上来就追求完美和通用先在一个简单的系统上把“公式到矩阵再到代码”的对应关系彻底打通后面自然就有底了。先把9节点的每条母线和每条支路数据吃透再把换流器方程和直流网络方程跑通这比盲人摸象式地套用商业软件结果靠谱得多。最后再分享一个小技巧核验交直流程序是否正确不要只盯着最后的收敛结果要看中间物理量是否自洽。换流器送端有功和直流线路输送功率、受端有功三者要满足能量守恒直流线路两端电压差乘以直流电流必须等于直流线路电阻的损耗交流侧的电压分布要和换流器注入功率相匹配。把这几个链条打通了这套程序不管怎么改核心都不会歪。