☰
前推回代法求解配电网潮流:分布式发电机接入后的网损分析
2026/10/1 11:59:47 网站建设 项目流程

简介:面向电力系统研究与工程应用的分布式发电配电网潮流计算 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.251
2230.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(负荷矩阵)、dg(DG出力矩阵) % 输出: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、100kvar,DG出力是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到几MW,R和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跑顺,也把这个验证流程带进你自己的项目里。

本文还有配套的精品资源,点击获取

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

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

立即咨询