ARTICLE · INTELLIGENCE

战地情报 · 详情页

来自尧图项目组的一线实战观察与深度解析

基于隐式Zbus高斯法的配电网三相不平衡潮流计算程序实现与验证

基于隐式Zbus高斯法的配电网三相不平衡潮流计算程序实现与验证 配电网三相不平衡潮流计算这个方向做电力系统的人基本都绕不过去。尤其现在分布式光伏、充电桩、农村单相长线路一多三相不平衡早就不是“偶尔发生”的工况而是配电网的常态。我见过不少工程师拿单相潮流程序去算三相配网算出来的节点电压看着还行但一接上实测数据就完全对不上问题就出在模型把三相天然的不平衡特性给抹掉了。这些年我用Matlab实现了多套配电网潮流算法包括前推回代、牛顿法还有标题里提到的隐式Zbus高斯法实测下来隐式Zbus高斯法是“稳定性”和“实现成本”之间权衡得最舒服的一条路特别是在变压器数量、位置、绕组方式需要灵活设定的场景下它的优势非常明显。这篇文章就围绕这套基于隐式Zbus高斯法的三相不平衡潮流计算程序展开重点讲四件事为什么配电网潮流必须用三相模型、隐式Zbus高斯法的迭代原理、变压器模型怎么参数化设定数量、位置、绕组方式以及如何把IEEE 12、33、36节点这几套经典测试系统跑通并验证结果。适合正在做配电网潮流、分布式电源接入评估、电压质量分析的朋友参考也适合刚入门想找一套可靠三相潮流代码当起点的研究生。1. 先搞清楚配电网的三相不平衡到底是怎么来的为什么单相潮流不够用配电网和输电网的物理特性差异非常大。输电网一般是环网结构三相线路换位负荷相对对称用单相模型做等值计算误差不大配电网则基本是辐射状树形结构分支多、供电半径长而且大量负荷是单相接入的。居民负荷、路灯、单相光伏逆变器、空调压缩机这些都是典型的单相负荷。三条相线上挂的负荷功率根本不可能一样哪怕总容量设计得比较均衡实际运行中三相电流也会明显不对称。这种不平衡会带来什么后果最直接的是中性点电压偏移。三相四线制系统里三相负荷越不对称中性点电流越大中性点的电位就越偏离零。负荷端的相电压会出现一相偏高、一相偏低的情况偏低的可能跌破设备正常工作范围偏高的又可能加速设备绝缘老化。另一条看不见的路径是变压器零序电流一部分零序分量会通过变压器的连接组别流入接地系统造成变压器附加发热和中性点过流。单相潮流为什么算不了这个因为单相模型把三相负荷给平均化处理了等于默认三相完全对称。它只能得到一个“等效功率”的电压结果算不出A相电压偏低、C相偏高的这种真实状态更算不出中性线电流和零序电压。哪怕你只关心电压合格率三相不平衡场景下单相法的结果都可能是过乐观的。另外配电网还有一个和输电网显著不同的电气特性R/X比值很大。架空线路和电缆的电阻接近甚至超过电抗这意味着潮流的收敛特性和有功无功的耦合关系都跟输电网很不一样。牛顿法在多相不平衡配电网里如果初值给得不好非常容易发散前推回代法在纯辐射状网络里效率很高、也确实常用但遇到弱环网和比较复杂的变压器连接方式时实现起来就比较绕。隐式Zbus高斯法走的是“建导纳阵、形成阻抗阵、反复回代”的路线不依赖雅可比矩阵迭代稳定性好处理辐射状网、少环网的能力都比较自然。这也是我在这个项目里最终没有沿用前推回代、而是把隐式Zbus高斯法作为内核的原因。2. 隐式Zbus高斯法的核心原理把非线性负荷问题变成反复求解线性网络很多第一次接触隐式Zbus高斯法的朋友会问Zbus不是把网络等值成一个阻抗矩阵嘛可潮流方程明明是非线性的一个阻抗矩阵能解决什么事这个问题问到点子上了。它确实不能一次性解决非线性方程但可以把非线性问题拆成两步反复交替线性网络部分交给Zbus非线性负荷部分每次迭代前单独处理。配电网里除电源节点外负荷节点的注入电流和电压是强耦合的。对恒定功率负荷注入电流表达式是I_i conj(S_i / V_i)这里的S_i是节点i的负荷复功率V_i是节点电压。电流取决于电压电压又由电流决定这是典型的环比关系只能迭代逼近。隐式Zbus高斯法的推导逻辑其实很直接。把电网写成节点电压方程Y V I两端同时左乘Y的逆V Z I这里的关键技巧是Z矩阵只需要形成一次并做一次因子分解。因为网络的拓扑和参数在整个迭代过程中是不变的变化的只有节点注入电流I。所以每次迭代只需要做两件事按当前电压更新负荷注入电流I(V^(k))然后回代求解一次线性系统得到新的电压V^(k1)。叠代格式可以写成V^(k1) Zbus × I(V^(k)) V_slack其中V_slack是源母线一般是变电站母线或平衡节点的已知电压Zbus反映的是源母线之外各部分网络对注入电流的响应。每次迭代后判断电压更新量的最大值是否小于收敛容差max |V^(k1) - V^(k)| ε如果是就退出否则继续下一次迭代。这个思路跟牛顿法最大的区别在于不需要雅可比矩阵的更新和因子分解。牛顿法每一轮迭代都要重新计算雅可比矩阵、做LU分解在有几百个三相节点、每个节点有三相电压和相角的系统里计算量和代码复杂度都不小。隐式Zbus高斯法在迭代格式上更像“反复修正电压直到负荷电流自洽”只要网络是线性的——变压器、线路导纳、电容组这些都不随运行点变化——响应矩阵始终保持不变所以迭代非常稳。当然它也有短板。最大的问题是收敛速度通常比牛顿法慢尤其在网络规模变大、负荷特别重的情况下可能迭代几十次甚至上百次。再有就是对非常接近电压崩溃边界的运行点恒定功率负荷的电流模型会导致迭代不收敛这是电力系统潮流计算共有的难点。但就配电网常规工况来说隐式Zbus高斯法的表现相当能打。对比维度牛顿法隐式Zbus高斯法每轮迭代计算量需重算雅可比矩阵并分解仅更新注入电流并回代对初始值敏感性敏感易发散不敏感较稳健辐射状配电网适用性一般好弱环网支持可以但实现复杂天然支持计算速度快收敛阶数高较慢线性收敛编程实现难度高低到中等如果系统规模很大别直接对完整的三相导纳矩阵求逆用稀疏分解再回代会更高效。完整的Zbus显式矩阵在节点很多时会非常占内存——一个三相N节点系统Zbus维度是3N×3N节点数上千之后就不是闹着玩的了。我的代码里对中小规模算例直接做了inv主要是为了简化阅读工程化的版本建议改成对Ybus做LU分解然后用“分解一次、反复回代”的模式。3. 变压器建模数量、位置、绕组方式在代码里怎么落地标题里特意标了“可设定变压器数量、位置、绕组方式”这句话听起来简单实际实现时工作量不小。很多现成的配电网潮流程序把变压器当成固定环节预先算好参数塞进数据文件想改一台变压器的位置或者换一种连接组别得手动改半天。而一个通用的三相配电网潮流程序变压器必须是数据驱动的参数化模型。3.1 变压器在潮流模型里的基本等值结构配电变压器在主电路中起到的是电压变换和电气隔离的作用。从潮流计算的角度看一台双绕组变压器可以等值为“理想变压器 串联阻抗”的串联组合其中串联阻抗就是短路阻抗漏抗为主电阻占一小部分。理想变压器负责电压变比和相位移串联阻抗则产生压降和损耗。有的模型还会在电源侧并联一个励磁支路但绝大多数配电网潮流计算会把励磁电流忽略掉因为励磁导纳对潮流分布的影响不到0.5%对结果基本没影响。在相分量模型里变压器需要表达成一个3×3的序导纳矩阵或者相导纳矩阵。三相变压器的不同连接组别对三个序分量的阻抗响应是完全不同的尤其零序阻抗差异巨大。下面这个表是设计代码时必须搞清楚的核心差异绕组连接方式正序/负序阻抗零序阻抗特性是否提供零序通路Dyn11约为短路阻抗与激磁阻抗并联较大是通过三角形绕组形成环流回路Yyn0约为短路阻抗取决于铁心结构通常很大否无三角形绕组Dd0约为短路阻抗与激磁阻抗相关很大否Yd11约为短路阻抗与激磁阻抗相关很大否YNyn0约为短路阻抗与零序磁通路径相关是两侧中性点均接地Dd0带接地变约为短路阻抗可以提供特定零序路径是为什么零序这么关键因为三相不平衡的本质就是零序分量不为零。正序和负序分量在变压器里几乎都能顺利穿越唯独零序分量对连接组别高度敏感。Dyn11是目前国内配电变压器用得最多的连接组别低压侧星形带中性线高压侧三角形。这种结构的好处在于低压侧的不平衡电流可以在高压侧三角形绕组内部形成零序环流不至于把零序分量强行注入中压网络同时低压侧中性点可以做直接接地让单相负荷获得稳定参考电位。相比之下Yyn0连接组别的变压器低压侧虽然也有中性线但由于高压侧没有三角形绕组提供零序环流回路零序磁通只能走铁心和油箱等路径零序阻抗大中性点电压偏移问题就突出得多。这就是为什么同样的三相不平衡负荷挂在Dyn11变压器下和挂在Yyn0变压器下运行表现会差很远。3.2 代码里如何参数化变压器我在程序里给变压器定义了一个独立的数据结构每条记录包含以下字段所在支路连接的首末节点编号额定容量kVA电压变比高压侧/低压侧额定电压短路阻抗百分比和短路损耗连接组别比如Dyn11、Yyn0分接头位置或固定变比修正系数所属馈线/子系统标识之所以把“数量、位置、绕组方式”单独拎出来说因为这些参数在传统算例里通常是被写死在代码里的而在这个程序里全部变成可配置项。多台变压器串联或并联、变压器放在馈线首端还是中段、用Dyn11还是Yyn0只需要修改数据输入不需要动迭代引擎的代码。这与真实配电网的规划业务非常贴合——电网改造、新装配变、调整供电范围对应的就是增删变压器记录、修改连接节点或改绕组方式。变压器支路加入三相导纳矩阵时需要根据连接组别构造对应的导纳子块。以常见的Dyn11为例高压侧三角形绕组、低压侧星形绕组向量组别的相位移是-30度不同国标定义可能带正负号需要注意统一惯例。在Matlab里按相分量展开时实际上是把理想变压器的变化关系结合漏阻抗形成一条三相等值支路。若一次侧相电压向量为Va、Vb、Vc二次侧为va、vb、vc理想变化比是k则等值关系可以写成va k × Va考虑相位移角度漏阻抗Zt折算到某一侧后串联在理想变压器之后。最终支路导纳矩阵Yt的定义满足[I_primary; I_secondary] Yt × [V_primary; V_secondary]这部分展开矩阵手工推算容易出错建议用符号推导或者矩阵分块计算我代码里写了一个专门的build_transformer_matrix_of_connection函数按不同连接组别返回6×6的导纳矩阵再装配到全局相导纳矩阵对应的位置。4. Matlab代码实现从数据输入到迭代求解的整体框架这套代码我拆成了五个模块数据读取、导纳阵构建、源母线初始化、迭代求解、结果输出。每个模块独立成函数后续要把前推回代法、改进算法或分布式电源模型接进来都不需要大动干戈。4.1 数据结构设计用什么方式装下三相系统做三相潮流第一件容易翻车的事是用单相潮流的数据结构硬套。单相潮流里每个节点只有一个电压而三相潮流每个节点有三个电压分量还可能有中性点。我的做法是每个节点用一个结构体或表格行存储三相电压的实部和虚部比如V_phase [Va_re Va_im; Vb_re Vb_im; Vc_re Vc_im]尺寸为3×2或直接使用复向量3×1。所有节点拼起来后节点电压整体是一个3N×1的复向量导纳矩阵Ybus的维度也是3N×3N。负荷数据同样要按相存储。一个节点既可能挂三相对称负荷也可能只挂A相单相负荷甚至A-B相间负荷。程序里负荷的输入接口设置为三列复功率数组每一列对应A、B、C三相缺相的填0。前处理要做一道校验把所有负荷功率逐相累加看看每相的总功率是否合理这能在源头上防止三相数据填错导致结果离谱。4.2 导纳矩阵构建和稀疏处理导纳矩阵的构建是从零开始的先初始化全零矩阵然后逐条遍历线路支路和变压器支路把支路导纳子块叠加到全局矩阵的对应位置。线路在三相模型中要考虑相间互感和电容配电线路距离短多数情况下可以忽略对地电容但相间阻抗矩阵不能忽略。带中线或保护线的四线制线路如需精确计算中性点电压偏移可以把中性线也作为独立节点建模矩阵维度会进一步增加。Matlab里有个非常重要的性能细节用稀疏矩阵构建导纳阵。先估计非零元素数量用spalloc分配内存再填写元素。这个方法在30节点及以下的测试系统上体验不出差异但一旦扩展到几百节点效果天差地别。全矩阵方式在1000个三相节点时矩阵维度3000×3000已经明显吃力而稀疏矩阵几乎毫无压力。4.3 主迭代循环核心代码逻辑整个求解过程的主循环大概长这样% 初始化电压源母线设为额定电压其余节点设为1.0 p.u. V ones(3*N, 1); V(slack_idx) 1.0; for iter 1:max_iter % 根据当前电压计算负荷注入电流 I_load zeros(3*N, 1); nonzero_load find(load_active); % 只处理有负荷的节点 I_load(nonzero_load) conj(S_load(nonzero_load) ./ V(nonzero_load)); % 源母线注入电流单独处理通常为松弛节点不需要显式给出 I_load(slack_idx) 0; % 用Zbus回代求新电压 V_new Zbus * I_load; V_new(slack_idx) V_slack; % 收敛判断电压最大偏差 err max(abs(V_new - V)); V V_new; if err tol converged true; break; end end这个版本的代码在概念上是最朴素的隐式Zbus高斯法适合教学和验证算例。实际工程中可能需要做两点改进一是把直接求逆改成LU分解二是为恒功率负荷加阻尼系数防止某些重负荷场景下出现振荡。阻尼迭代是实践中非常好用的技巧。标准的迭代格式是直接用新电压替换旧电压但在负荷重或系统弱的情况下可能出现电压在两个值之间反复横跳。此时改用V^(k1) α × V_zbus (1 - α) × V^(k)其中α取值0.3~0.7迭代就会稳定下来。代价是收敛速度降低但稳定压倒速度。这个技巧我在多个系统上验证过是解决不收敛问题的最简单手段。4.4 变压器参数配置示例看一下参数文件的组织思路比文字描述直观得多% list of transformers % bus_from, bus_to, rating_kva, vratio, zpercent, conn, tap tfm_data [ 1, 2, 2000, 10/0.4, 4.5, Dyn11, 1.0; 4, 7, 800, 10/0.4, 4.0, Yyn0, 1.0; 9, 10, 500, 10/0.4, 4.0, Dyn11, 0.975; ];每一行就是一台配电变压器数量随意增减位置就是bus_from和bus_to绕组方式写在conn列。分接头位置通过tap列修正例如9-10号节点变压器的tap0.975相当于低压侧电压比额定值高2.5%用来补偿线路长距离压降。在程序内部这个参数会转换为理想变压器的电压变比修正从而影响潮流结果。强调一点分接头设置不是瞎调的。它的本质是牺牲某一侧的电压水平换取另一侧的电压改善。线路末端电压偏低适当上调变压器低压侧电压是常规手段但上调太多可能造成首端用户过电压这是个需要结合全网电压约束来反复试算的工程问题。5. IEEE 12、33、36节点算例数据组织、结果验证与收敛性排查5.1 三个测试系统的特点和差异IEEE标准算例的典型价值在于提供了可复现的基准结果很多学术论文都用它做验证。三个系统各有侧重IEEE 12节点节点规模小结构简单适合作为代码调试的第一站。我一般在开发新功能时先用它跑通输出结果肉眼检查确认没有低级错误后再上复杂度高的系统。IEEE 33节点这是配电网潮流领域最经典的测试系统之一采用12.66kV基准电压含33个节点、32条支路系统总负荷约3.7MW。大量文献都报告过它的电压分布曲线非常方便做横向对比。IEEE 36节点规模和复杂度进一步提升数据通常在配套的测试系统文档中给出包含更多分支和变压器环节适合考核程序在处理多变压器场景下的表现。这三个系统串起来正好是“调试→验证→压力测试”的完整路径。如果程序在12节点系统上结果正确、在33节点系统上和基准结果吻合、再在36节点系统上收敛顺利那这个程序的基本可靠度就相当高了。5.2 怎么判断算出来的结果是对的验证潮流结果的正确性不能只看“迭代收敛了”就完事而要从电气物理规律上交叉检查。我常用的检查手段有几个第一功率平衡检查。把源母线输出的总功率算出来减去全网负荷和网损应该严格等于零。三相总功率平衡能对上的话网络模型大概率没有建错。第二电压分布趋势检查。辐射状配电网沿馈线方向的电压应该呈阶梯式下降除非中间有变压器升压或分接头补偿。尤其是重负荷节点附近电压必然偏低。第三和已知基准结果对比。IEEE 33节点系统在标准负荷条件下典型最小电压出现在节点18附近大概在0.90~0.92p.u.之间。如果算出来末端电压反而升高或者最低电压出现在馈线首端一定哪里出了问题。第四三相电压的相位关系检查。正常工况下三相电压应该大致保持120度相位差只有严重不平衡或中性点偏移时才会出现明显畸形。如果三相互补关系完全错乱需要回头检查负荷数据是否填对了相别。下表列一个IEEE 33节点系统在典型负荷状态下的结果示例方便对比节点A相电压幅值(p.u.)B相电压幅值(p.u.)C相电压幅值(p.u.)11.00001.00001.000080.96550.96620.9631180.92080.92190.9162220.97270.97310.9702330.95170.95200.9489注意这里的数值是假设负荷三相基本平衡但略有偏差时的情况。三相不平衡程度越大各相之间的电压差异就越明显这也是检验程序是否真正实现三相建模的试金石如果你把A、B、C三相负荷输入一组完全一样的数据三相电压也应该完全相等否则就说明程序里存在相序处理bug。5.3 常见的收敛问题与定位思路迭代不收敛是使用这类程序时最常碰到的问题我把实际调试中积累的排查顺序说一下。优先检查导纳矩阵是否奇异。导致奇异最常见的原因是线路数据重复、变压器支路连接错误、或者某些节点变成了孤立节点。用rank函数检查矩阵是否满秩实操中对角占优的网络这块不至于出问题但数据少填一行就可能产生断网。接着检查源母线设置。隐式Zbus高斯法要求至少有一个松弛节点否则求解就不具备唯一性。如果代码把源母线也当成普通节点处理V_new Zbus * I_load之后整条网络的电压会产生整体漂移表现为迭代一直不收敛或者结果极其离谱。然后是负荷功率的极性。潮流里约定流入网络的负荷功率为正源母线输出功率也为正。如果把负荷功率符号搞反相当于把负荷当成发电机电压结果可能不降反升。这个低级错误实际出过的概率非常高因为很多配电数据表里的功率方向习惯跟课本不完全一致。最后再考虑阻尼和阈值调整。如果前三种情况都排除了把阻尼系数从1.0降到0.5试一次很多顽固的振荡问题可以解决。收敛容差没必要设到1e-10通常1e-6已经完全满足工程精度迭代次数在弱网情况下能差出好几倍。6. 一版跑通之后这套程序还能往哪些方向扩展当隐式Zbus高斯法的内核和变压器参数化模型都稳定之后程序的扩展性会显得非常舒服。至少这几个方向我已经自己实测过效果都还不错。第一接入分布式光伏和储能模型。分布式电源在三相配电网潮流里一般当作PQ节点功率已知为负值或PV节点电压幅值限定来处理。对PV节点要在每次迭代中修正无功功率使电压幅值维持在设定值附近。这个逻辑在隐式Zbus高斯法中并不难加只要在电流注入计算前额外增加一个无功修正环节。不过要提醒的是配电网里PV节点数量不宜太多修正逻辑处理不好会引发振荡这也是很多光伏并网分析文件里把逆变器切成PQ模式的原因。第二弱环网处理。前推回代法对付纯辐射状网很舒服但如果网络里存在合环开关或者用户自备线路构成闭环就需要额外的回路补偿计算。隐式Zbus高斯法没有这个问题因为Zbus矩阵本身就包含了环网拓扑形成环网时只是导纳矩阵的装配规律变化迭代格式完全不用改。这也是我向朋友推荐这套算法的重要原因。第三负荷动态模型。本文一直默认负荷是恒定功率但实际配电网里恒阻抗负荷和恒电流负荷也大量存在比如电热设备近似恒阻抗、城市照明近似恒电流。比较好的做法是允许每一类负荷设定百分比例如总负荷的40%为恒功率、30%为恒电流、30%为恒阻抗然后在每次迭代时把混合负荷转化为等效注入电流。这个功能对算冬季空调负荷、夜间照明负荷特别有用。第四中性线显式建模。当前版本的默认设置相当于假定中性点电位足够稳定但真要分析严重的单相接地或者三相严重失衡导致的中性点电压偏移最好把中性线作为独立的导纳支路建进去。代价是矩阵维度增加比较多但从结果对比来看中性线建模对低压用户侧电压质量的分析价值是很大的。第五运行点连续扫描。配电网负荷日变化曲线通常按小时或15分钟一条点如果想算全日电压曲线可以把潮流程序包在循环里逐点计算。隐式Zbus高斯法每步迭代主要开销就是一次回代几百个点时长的跨度完全在可接受范围内。配合这套代码的变压器参数化设定甚至可以做“不同分接头设置下全年电压合格率”这种规划级分析。我个人在实际工程中体会最深的一点是三相不平衡潮流程序最容易出错的地方往往不是数学内核而是三相数据组织和变压器连接方式的处理。一套干净的数据结构、一套参数化变压器配置、再加上一个不依赖良好初值的稳定迭代内核这套代码就能真正脱离论文Demo的范畴变成日常分析工具箱里的一员。如果你正卡在配电网三相潮流分析的起步阶段沿着隐式Zbus高斯法这条线往下走是一条性价比很高的路线。
RELATED READING

延伸阅读

更多一线实战笔记与深度复盘,助您持续精进