
简介面向电力系统研究与工程应用的分布式发电配电网潮流计算 MATLAB 资源聚焦 DG 接入后对配电网网损的影响分析适用于电气工程专业学生、配电网规划人员及对前推回代法感兴趣的开发者。包体为压缩包内含 1 个 m 文件总计仅 3KB代码量精简便于直接阅读、修改与复用。目前已有 181 人学习下载适合作为入门理解与快速验证用工具。文件围绕前推回代潮流算法展开前推过程从电源节点逐级推算电压与功率回代过程从负荷节点反向修正通过调整 DG 的位置、容量与接入方式可计算不同场景下配电网的电压分布与网损变化进而理解分布式电源对系统损耗、供电质量及稳定性的综合影响。对优化配电网运行、评估 DG 并网策略、实现低损耗供电具有直接参考价值。1. 潮流计算分布式发电机接入后配电网网损为什么不是单调下降做配电网规划或者写DG并网评估报告的朋友大多有过同一个困惑分布式发电机接入配电网之后网损是升还是降直觉和经验经常打架。同一套网络DG放在馈线中段网损可以明显压下来挪到接近末端的地方不仅没省反而把线损推高。这个反直觉结论的根源就在潮流计算——DG改变了功率流动方向常规牛顿法在辐射状配电网里收敛慢遇到高R/X支路还会震荡。这份DGdS.m资源就是用前推回代法把配电网潮流算稳再根据节点电压和支路功率直接统计网损支撑不同DG配置的对比分析。适合做配电网电压/网损分析的工程师以及需要快速复现并网方案数据的研究生。2. 前推回代法为什么配电网网损分析绕不开这个算法2.1 牛顿法在辐射状配电网里不香的三个原因配电网虽然是power grid的末端环节但它的拓扑和输电网差别很大。输电网通常是环网结构节点之间电气耦合强节点电压都在1.0 p.u.附近牛拉法迭代非常舒服。配电网不一样绝大多数馈线按辐射状运行支路数多、回路少而且R/X比值普遍偏高线路电阻和电抗接近甚至超过1。这种网络用牛顿法求潮流每一步都要组装雅可比矩阵矩阵规模随节点数快速增长遇到重负荷或者高R/X支路初始电压稍微偏离额定值迭代就容易震荡甚至不收敛。前推回代法则完全绕开了矩阵组装。它利用配电网辐射状这个拓扑特点把潮流求解拆成两个方向的遍历一个方向求支路功率分布另一个方向求节点电压修正。每次迭代只有两次遍历不需要求导不需要矩阵分解内存占用几乎和节点数成正比。对于几百个节点的馈线模型普通台式机跑几十次迭代就是毫秒级的事这个效率优势在反复扫描DG容量时特别明显。还有个工程上的实感牛拉法在配电网里出问题时你往往分不清是数据错了还是算法不收敛。前推回代则不同它的每一步都有物理意义——电压算出来偏高说明上游支路功率累加多了电压偏低说明负荷或阻抗输错了。调试的时候能顺着物理逻辑排查这对工程场景很重要。2.2 前推和回代到底谁先谁后方向不能记反前推回代这个名字容易让人误解。我见过不少资料把它的方向写反这里把顺序拆开说清楚。第一步是回代Backward Sweep从末端节点开始向首端变电站方向逐条支路累加功率或电流。末端节点只有负荷和DG注入没有出线所以功率是已知的从最末端一路往回推每条支路上流过的功率就能确定下来。第二步是前推Forward Sweep从首端节点开始向末端逐条支路推进用上一步得到的支路功率和支路阻抗计算电压降落依次更新每个节点的电压幅值和相角。一轮前推结束后把新旧电压做差如果最大偏差小于设定的收敛阈值迭代结束否则用新电压作为初值重新做下一轮回代。用代码来表达这个循环结构大概是下面这个骨架% 前推回代核心迭代骨架伪代码级别 V ones(n, 1); % 节点电压幅值初值标幺值1.0 V_old zeros(n, 1); tol 1e-6; % 电压差收敛阈值 max_iter 50; % 迭代上限 iter 0; while max(abs(V - V_old)) tol iter max_iter V_old V; % 回代从末端往首端按支路顺序累加支路功率 S_branch backward_sweep(branch, net_inject); % 前推从首端往末端用支路功率计算电压降落并更新电压 V forward_sweep(branch, S_branch, V_old); iter iter 1; end这里的两个函数backward_sweep和forward_sweep在DGdS.m里是以子函数或者内联循环形式存在的。关键是理解它们的输入输出回代函数吃节点注入功率和支路拓扑产出一条支路功率向量前推函数吃支路功率和当前电压产出一组新节点电压。两者配合一轮才算完成一次完整的潮流迭代。2.3 收敛判据和迭代上限怎么定别把误差放得太宽前推回代在配电网场景下收敛性通常很好但收敛判据的选取直接决定网损结果的精度。我一般用节点电压幅值差作为判据即相邻两次迭代中所有节点电压幅值变化的最大绝对值。阈值tol取1e-6也就是0.0001%的电压偏差。这个精度下算出来的网损小数后两三位是稳定的足够支撑网损对比分析。迭代上限一般取50次。配电网前推回代正常情况20次以内收敛如果跑到50次还在迭代基本不是初值问题而是拓扑数据有问题——比如某个负荷节点没有连到馈线上或者支路方向反了。这时候不要无脑把阈值调大、把上限调高那只会让错误结果“看起来收敛了”。先检查拓扑连通性和支路编号顺序比调参数有效得多。收敛判据还有一个常见误区用功率失配量做判据。输电网潮流用功率失配很自然但配电网里PV节点少、大部分是PQ节点功率失配的残差曲线在迭代过程中容易震荡反而不如电压差判据平稳。这里我的习惯是电压差做收敛判据功率失配只作为结果合理性检查的参考。3. 把DGdS.m跑起来节点数据、支路参数与收敛控制3.1 输入数据怎么组织支路矩阵和节点功率矩阵拿到DGdS.m之后第一步不是点运行而是把数据捋清楚。最常见的配电网潮流程序数据组织方式是两组矩阵支路矩阵和节点注入功率矩阵。支路矩阵描述网络拓扑和阻抗每行对应一条支路典型列顺序是[首端节点编号, 末端节点编号, 电阻R, 电抗X]。电阻和电抗的单位必须和功率单位配套比如功率用kW和kvar电压用kV那么阻抗就应该是欧姆不要混用。以一条三节点馈线为例支路编号首端节点末端节点R (Ω)X (Ω)1120.4920.2512230.2920.191节点注入功率矩阵则记录每个节点的负荷和DG出力。配电网潮流里通常把DG当作注入功率处理负荷取正值DG出力取负值两者代数和就是该节点的净注入功率。注意DGDdS.m里对符号的约定有可能和别的程序不同运行前先在文档或代码注释里确认正负号约定否则后面所有结果都会反着。负荷数据一般是[节点编号, 有功P(kW), 无功Q(kvar)]的形式DG数据单独一组[节点编号, 有功Pdg(kW), 无功Qdg(kvar)]。节点1通常是变电站出口的平衡节点电压固定不需要写负荷和DG。3.2 主循环代码回代、前推和网损累计是怎么串起来的DGdS.m里的核心计算逻辑拆开看就是三件事回代求支路功率、前推求节点电压、终端统计网损。下面这段代码是一个可读性较好的结构示例主干逻辑和DGdS.m的做法一致% DGdS_m 主计算流程结构示意 % 输入branch支路矩阵、load负荷矩阵、dgDG出力矩阵 % 输出V节点电压标幺值、total_loss全网有功网损kW % 节点净注入功率负荷 - DG实部为有功虚部为无功 net_inject complex(load(:,2) - dg(:,2), load(:,3) - dg(:,3)); V ones(size(net_inject,1), 1); % 电压标幺值初值1.0 V_old zeros(size(net_inject,1), 1); tol 1e-6; % 收敛阈值 max_iter 50; for iter 1:max_iter % 回代从末端向首端累加支路功率 % 按拓扑从远到近遍历current为各支路末端节点编号 S_branch complex(zeros(size(branch,1),1)); for k size(branch,1):-1:1 end_node branch(k,2); start_node branch(k,1); % 支路功率 末端节点净注入 该节点下游所有支路功率之和 S_branch(k) net_inject(end_node) sum(S_branch(branch(:,1)end_node)); end % 前推从首端向末端更新电压 V_new V_old; for k 1:size(branch,1) start_node branch(k,1); end_node branch(k,2); % 电压降落 支路功率 * 支路阻抗 / 首端电压共轭 dV S_branch(k) * complex(branch(k,3), branch(k,4)) / conj(V_old(start_node)); V_new(end_node) V_old(start_node) - dV; end % 收敛检查 if max(abs(V_new - V_old)) tol V V_new; break; end V_old V_new; end % 网损统计各支路有功损耗累加 % 损耗 |S_branch|^2 * R / |V|^2逐支路累加得到全网有功网损 total_loss 0; for k 1:size(branch,1) end_node branch(k,2); total_loss total_loss abs(S_branch(k))^2 * branch(k,3) / abs(V(end_node))^2; end这里有个细节值得说明回代过程中求某条支路的功率时要把它下游所有支路功率加进来这就是sum(S_branch(branch(:,1)end_node))这一行的作用。它把“末端节点净注入功率”和“这个节点下面挂着的所有支路功率”合并成一条支路上实际流过的总功率。如果漏掉下游支路功率结果会明显偏小电压算出来也会偏高。前推部分的核心是每段支路的电压降落公式末端电压等于首端电压减去支路电流在阻抗上产生的压降。用功率除以首端电压共轭得到电流再乘以阻抗得到压降这是配电网前推的标准做法。注意这里用的是标幺值计算电压初值取1.0 p.u.在配电网电压水平下可以直接用不需要额外换算。网损统计放在潮流收敛之后。每个支路的有功损耗等于该支路电流模值的平方乘以电阻最后把所有支路累加。DGdS.m里大概率也是这种做法区别可能在于单位换算——有的实现里直接算标幺值损耗再乘以基准容量变成kW这需要你把基准容量确认清楚否则网损数字会差一个量级。3.3 把DG折算到节点注入功率符号别搞反分布式发电机接入配电网从潮流计算角度看本质上是改变了对应节点的净注入功率。假设某个节点原来负荷是200kW、100kvarDG出力是150kW、50kvar那么该节点净注入就是-50kW、-50kvar。负号代表这个节点整体上是在向电网馈入功率和纯负荷节点的方向相反% 节点净注入功率计算负荷为正DG出力为负 net_inject(end_node) (load_p - dg_p) 1j * (load_q - dg_q);这个符号约定是全网统一的基础。如果符号搞反回代阶段累加出来的支路功率方向就错了前推阶段的电压降落也会跟着错最后算出来的网损可能比实际值大好几倍。调试的时候如果发现某几个节点的电压异常偏高先看这个节点的净注入功率符号对不对。3.4 输出网损和电压分布怎么把结果变成可对比的表格潮流算完除了总网损节点电压分布也是判断DG接入影响的重要输出。我一般把结果整理成两个向量一个是各节点电压幅值一个是各支路有功损耗。前者直接看电压质量后者看损耗集中在哪条支路。% 输出整理节点电压和支路损耗 result_table table((1:n), abs(V), ... VariableNames, {Node, Voltage_pu}); % 支路损耗明细方便定位损耗最大的支路 branch_loss zeros(size(branch,1),1); for k 1:size(branch,1) branch_loss(k) abs(S_branch(k))^2 * branch(k,3) / abs(V(branch(k,2)))^2; end这份表格是后续分析DG接入位置和容量影响的基础数据。保留原始结果而不是只记总网损后面做对比曲线时能省很多回头重算的时间。4. 分布式发电机接入位置与容量网损曲线的非线性特征4.1 同一个DG不同接入位置为什么网损变化方向相反配电网网损的本质是电流流过线路电阻产生的热损耗和支路电流的平方成正比。DG接入后它对网损的影响完全取决于它改变了哪些支路的电流分布。如果DG靠近负荷密集区负荷电流从变电站出口到DG这一段就短了上游支路电流明显减小网损下降如果DG放在馈线末端情况就变了——末端节点电压被抬高馈线中后段的电流反而可能增加更麻烦的是当DG出力大于末端负荷时多余功率会沿着馈线往变电站方向倒送线路里出现双向潮流网损不降反升。用前推回代算完几个典型位置后这个规律会很直观。比如同一个33节点配电网模型DG放在馈线中段网损可能下降30%以上放在末端可能回升10%~20%。这个非线性特征决定了“DG接入一定降低网损”的说法是错误的必须基于潮流计算结果来判断。4.2 容量扫描脚本设计渗透率从0开始逐点扫要找到某个接入位置下的最佳DG容量最直接的做法是做一个容量扫描保持DG接入位置不变从0开始逐点增大DG出力每点跑一次前推回代记录总网损最后画出网损随DG渗透率变化的曲线。% 容量扫描渗透率从0%~100%共11个点 cap_list linspace(0, 1.0, 11); loss_record zeros(size(cap_list)); for k 1:length(cap_list) % 按当前渗透率设置DG出力基准出力乘以比例系数 dg_p(:, 2) base_dg_p * cap_list(k); % 跑一次前推回代返回总网损 [V, total_loss] run_forward_backward(branch, load, dg_p); loss_record(k) total_loss; end % 绘制网损-渗透率曲线 plot(cap_list * 100, loss_record, -o); xlabel(DG渗透率 (%)); ylabel(全网有功网损 (kW)); grid on;base_dg_p是设定的DG容量基准值扫描过程中按比例缩放。run_forward_backward是前面第3章封装好的潮流计算函数。跑完这11个点曲线形态基本就能说明问题常见结果是先降后升呈现U型。最低点对应的渗透率就是该接入位置下网损最小的DG配置。容量扫描的间隔可以按需调整初扫用10%~20%的步长找到谷底附近再用2%~5%的步长细化。整体耗时取决于节点数和扫描点数几百个节点的网络跑一趟只要几十秒比手工改参数反复试高效得多。4.3 多方案对比位置×容量的典型规律同一套网络里不同接入位置和不同渗透率组合网损变化的量级和方向差异很大。用DGdS.m扫完几组典型配置后得到的一般规律可以汇总成下面这张对比表接入位置低渗透率约20%高渗透率约80%趋势判断首端母线附近网损变化很小网损小幅升高对潮流分布影响有限收益不明显馈线中段负荷密集区网损明显下降接近最小值附近首选接入段渗透率可适当提高末端重负荷节点网损轻微下降网损显著回升谨慎接入可能出现功率倒送这里要强调一下表中的趋势是辐射状配电网下的典型结果具体数值会随网络结构、负荷分布和线路参数变化。你手里的模型跑出来的谷底位置可能不同但“中段受益、末端风险”这个方向性结论在绝大多数配电网模型里都成立。这张表的价值在于做并网方案初筛时能少走弯路。新项目拿到手先按表中规律判断哪些位置有分析价值再用容量扫描精确定位最优渗透率不需要所有节点都试一遍。5. 避坑指南DGdS调试中常见的五个翻车点5.1 节点编号混乱导致回代功率对不上现象迭代次数明显增多甚至50次上限仍不收敛电压结果忽高忽低没规律。原因前推回代依赖严格的拓扑父子关系。回代时从末端往首端累加支路功率要求程序能判断“哪个节点在最末端、哪条支路是下游支路”。如果节点编号没有按拓扑顺序编排或者支路矩阵里首端、末端写反了回代阶段累加的功率就不是这条支路实际流过的功率全盘皆错。解决运行前做一次拓扑校验确认每个节点有且只有一个父节点不存在孤立节点和环网支路。常见做法是用BFS从平衡节点出发遍历一遍网络未访问到的节点就是孤立节点逐个排查。另外支路矩阵中每条支路的首端节点应当是更靠近变电站那一侧末端的下游方向要一致。5.2 单位混用导致网损差三个数量级现象潮流能正常收敛节点电压也正常但网损数值大得离谱或者小到可以忽略和手算结果完全对不上。原因功率用了MW阻抗用了欧姆电压用了kV三个单位混搭。配电网里单条馈线功率往往是几十kW到几MWR和X单位是欧姆电压等级10kV或0.4kV任何一个单位不配套网损都会差10^3量级。解决全部统一到同一套单位再计算。我的习惯是功率用kW和kvar电压用kV阻抗用Ω这样电压标幺值以额定电压为基准计算结果直接就是工程单位。如果你坚持用标幺值就要把基准功率、基准电压、基准阻抗三者成套定义谁也别单独换。5.3 收敛判据只盯功率差电压差还在抖现象程序报告“已收敛”但把前后两次迭代的电压打印出来一看各节点电压还有明显波动网损结果也不稳定。原因部分潮流程序默认用功率失配量做收敛判据。配电网PQ节点占绝大多数功率失配残差的迭代曲线容易出现锯齿状震荡某个瞬间刚好小于阈值就误判收敛实际上电压还没稳定下来。解决把收敛判据改为电压幅值差即相邻两次迭代所有节点电压幅值变化的最大绝对值小于1e-6。如果程序不支持修改判据可以在外层加一个后校验收敛后多跑两次迭代看电压和网损是否仍然稳定不稳定就说明收敛判据有问题。5.4 DG按PV节点处理分分钟无功越限现象DG出力增大后某个接入节点的电压被钳在1.0 p.u.附近但潮流结果里该节点的无功出力已经远超逆变器额定容量看起来DG像变成了一个巨型无功源。原因把DG节点的类型设置成PV节点强行约束电压恒定。实际配电网里的光伏逆变器、风机变流器通常按恒功率因数运行无功能力有限不适合当PV节点即便某些场景按PV节点处理也需要在每轮迭代后检查无功越限越限后把节点改回PQ节点并降低无功设定。解决默认把DG按PQ节点处理功率因数设为0.95~1.0无功按有功和功率因数换算。只有做电压支撑专题分析时再考虑PV节点模型并且必须加无功越限修正逻辑否则潮流算完的DG无功出力完全不符合物理实际。5.5 前推回代方向写反电压越修越偏现象程序能跑通迭代也收敛但节点电压沿馈线方向越来越高末端电压比首端还高明显违背功率传输的基本规律。原因实现时把方向写反了。正常的做法是回代阶段从末端向首端累加功率前推阶段从首端向末端计算电压降落。写反之后回代累加的功率流向错了前推阶段电压不是降落而是升高结果自然全反。解决用一条三节点链式网络手算一组数据一端固定电压1.0 p.u.中端和末端带负荷手推一轮电压。中间节点和末端节点的电压应当逐级下降且下降幅度随距离增大而增大。用这个手算结果对照程序输出能快速定位方向是否写反。这个习惯我一直保留着每次拿到新写的潮流程序第一件事就是用三节点模型做方向校验不跑通这一关不碰大网络。6. 进阶用最优因子法加速收敛并把结果交叉验证6.1 最优因子法的实现位置前推回代在多数网络里收敛足够快但碰到DG渗透率高、馈线末端电压接近上限的工况迭代次数会明显增加。这时候可以引入最优因子法也叫松弛因子法在每次前推结束后对电压修正量乘一个因子再叠加到旧值上% 最优因子法对电压修正量做松弛处理 dV V_new - V_old; % alpha 是松弛因子常见取值0.85~1.1重载场景取小 V V_old alpha * dV;alpha等于1时就是标准前推回代没有变化。alpha大于1叫超松弛能加速收敛但可能引起震荡alpha小于1叫欠松弛收敛更稳但速度略慢。配电网重载场景、DG渗透率较高时我的经验是alpha取0.9附近往往比默认值更快抵达收敛阈值。这个参数不需要精确求最优二分试几次就能找到一个合适的值属于性价比很高的改动。6.2 用牛拉法结果做交叉验证前推回代程序写完之后一定要做一步独立的交叉验证才不会把错误结果当成正确结果用。常见做法是拿Matpower或者自己实现的牛拉法算同一套网络对比各节点电压幅值。两种方法在收敛精度一致的前提下节点电压偏差应该在1e-5以内网损偏差在千分之一以内。对不上的话优先检查单位、正负号约定和支路方向而不是怀疑算法本身。我的习惯是每次改完DG配置把前推回代的结果和牛拉法结果同时跑一遍电压差超过1e-5就当场排查。这套流程帮我挡掉过一个隐蔽的单位错误——当时网损结果看着合理但和牛拉法对比发现末端电压差了2%追根溯源是某一组负荷数据里混进了MW和kW两种单位。从那以后我每次拿到别人写的潮流程序第一件事不是直接跑大模型而是先用三节点网络校验方向再用牛拉法交叉验证精度最后才把DG配置放进去做容量扫描。这个习惯看着多花十分钟实际省掉的是反复返工的时间。希望这篇笔记能帮你把DGdS.m跑顺也把这个验证流程带进你自己的项目里。本文还有配套的精品资源点击获取