前两年我接了一个配电网规划评估的小项目。业主方拿着一个光伏项目的接入方案来问:这个逆变器直接挂在10千伏馈线末端到底行不行?他们说设计院给的说法是“基本没问题”,但另一家咨询机构又警告说“末端电压可能会越限”。两边结论打架,最后还得靠仿真说话。我就是从那个时候开始,认认真真把“分布式电源接入对配电网影响”这件事用Matlab完整做了一遍,从稳态潮流到场景对比,从结果分析到报告落地方案,踩了不少坑,也攒了不少可以直接抄作业的经验。
这篇文章就把整套研究思路和Matlab实现路径拆开讲清楚。内容围绕分布式电源接入位置、接入容量、功率因数这三个核心变量,看它们对配电网节点电压、网损和负载率的具体影响。适合正在做毕业设计的学生、刚入行配电网规划的新人,以及需要快速验证DG接入方案的工程师。我会讲建模思路、代码骨架、实验设计和结果规律,最后聊几个我实际踩过的坑,照着捋一遍基本能复现整个研究过程。
1. 为什么配电网对分布式电源这么“敏感”
研究一台分布式电源接入对配电网的影响,第一步不是写代码,而是理解配电网到底“怕”什么。很多人第一次做这个课题,上来就改潮流程序,结果算出来的结果自己都看不懂,就是因为没搞明白机理。
1.1 从单向潮流到双向潮流的转变
传统配电网是典型的放射状无源网络。电能从变电站母线流出,顺着馈线一层层送到末端负荷,方向永远是从电源指向用户。线路上的电压降落、网损分布,都是建立在“功率只往一个方向流”这个前提下的。
分布式电源接入以后,情况完全变了。光伏、风机、燃气轮机这些电源就地发电,如果某个时刻的出力超过了本地负荷,多余的功率就会沿着馈线往回倒送。这条馈线从“单向管道”变成了“双向通道”,节点电压和线路功率的分布规律全部要重新算。
潮流方向反转带来的最直接影响是电压分布的改变。传统配电网的电压沿馈线递减,越靠近末端电压越低;DG接入后,反向功率会在线路上产生反向压降,末端电压反而可能被抬高。这个效应在轻载、光伏大发的中午时段尤其明显,很多冬奥配电网过电压的问题就是这么冒出来的。
1.2 配电网的“体质”决定了它经不起折腾
有的同学会问:输电网里不也有电厂接入吗,怎么没见这么紧张?关键差异在于配电网的X/R比值太低。
输电网线路的电抗X远大于电阻R,电压主要受无功功率影响,有功功率翻来覆去对电压影响不大。配电网恰恰相反,线路以电阻为主,X/R比值经常在1到3之间,甚至更低。这就意味着,配电网的电压既受无功影响,也受有功影响,光伏这类有功出力波动大的电源,对电压的扰动是输电网里很难想象的。
再加上配电网直接带用户,电压质量直接决定用户设备能不能正常工作。居民用电电压偏差超过正负7%就可能触发保护或影响设备寿命,工业用户更严格。所以研究DG接入影响,节点电压偏移量必须放在最优先的位置。
1.3 这个课题到底在研究什么
把问题拆清楚,其实就是回答三件事:
- 分布式电源接在哪个位置,对电网的影响最小?
- 接多大容量是安全的?渗透率上限在哪?
- 功率因数怎么设置,能同时兼顾电压支撑和系统损耗?
这三件事不是孤立的。同一个DG,接在馈线首段和中段,电压影响能差出好几倍;同一接入点,容量从10%渗透率提到50%,网损曲线可能先降后升。所以做研究不能只看单点工况,必须做场景矩阵对比,这也是Matlab在这个课题里这么好用的原因——循环改参数、批量跑潮流、自动统计结果,一套流程下来能省好几天的算表时间。
Matlab做这类研究有几个天然优势:矩阵运算写潮流迭代非常顺手,自带的绘图功能可以直接出电压分布曲线和三维影响曲面,脚本化运行让几百个场景的批量仿真变得可行。下面要讲的核心算法和实验设计,我都用Matlab的实际运行经验来讲。
2. 接入影响的核心维度:电压、网损与负载率
把影响维度搞清楚,才知道仿真程序里要输出哪些量、统计哪些指标。我这个项目里最终锁定了三个核心维度:节点电压偏移、系统网损、馈线最大负载率。每一个都会直接写进接入方案的评价结论里。
2.1 电压变化:DG出力如何“顶高”节点电压
理解DG对电压的影响,用一条最简单的线路模型就能说透。单电源辐射馈线上,节点j的电压比上游节点i低一个数值,近似等于:
U_j = U_i - (P·R + Q·X) / U_i
式子里的P和Q是流经这两点之间线路的功率。传统配电网里P和Q都是负荷从电网吸收的,所以压降是正值,电压一路降下去。DG接入后,如果DG出力大于本地负荷,线路上的P就变成负值,此时P·R这一项反向,电压不再是降落而是抬升。
这就是为什么DG接入容量越大、离线路末端越近,末端电压抬升越明显。末端本来就是全馈线电压最低的位置,DG一抬升,很容易越过上限。
我在仿真中会同时输出两类电压指标:
- 各节点电压标幺值,画成沿馈线位置的分布曲线,能直观看出电压整条线被“顶”起来的样子
- 最大电压偏移百分比,作为衡量电压质量的单点指标
需要提醒的是,电压变化不只是稳态工况的事。DG出力随光照、风速波动,电压也跟着波动。但这个课题如果限定在稳态潮流分析,就先聚焦稳态电压水平,动态波动问题可以作为延伸方向,两条腿走容易把研究目标搞散。
2.2 网损的“U型曲线”逻辑
网损变化是DG接入影响里最有意思的一个维度,因为结果不是单调的。
DG就地发电、就地消纳时,馈线上传输的功率减少了,线路电流下降,网损自然降低。比如一个馈线负荷集中在末端的小区,光伏装在小区旁边,白天发的电直接被周边负荷用掉,变电站到这个小区之间的线路损耗几乎可以忽略。
但DG出力超过本地负荷以后,情况反转。多余的功率沿馈线往回送,传输距离越远损耗越大。等回送功率大到一定程度,节省的网损补不上倒送产生的损耗,系统总网损开始上涨。
这就是我前面说的“U型曲线”:随着DG渗透率从0逐步提高,网损先降、到一个最低点、再上升。这个转折点出现在哪,和接入位置、负荷分布、DG出力曲线都有关。仿真时我一般会计算网损率,也就是总损耗占总供电量的百分比,在不同渗透率下画一条曲线,用来找最优的接入容量范围。
计算网损的基础是每条支路的电流和电阻:
P_loss = Σ(I_k² · R_k)
往程序里套的时候,别只算总网损,最好把每条支路的损耗单独存下来。这样既能找到损耗最大的线路段,也能看出DG接入后哪些支路从“重载”变成“轻载”、哪些支路反而“负载”了——负负载率的支路就是倒送功率的直观证据。
2.3 其他维度的边界说明
做稳态潮流研究时,除了电压和网损,还经常被问起短路电流、谐波、继电保护配合这些事。我的态度是:这些属于暂态或电能质量范畴,和稳态潮流研究的目标、模型、仿真步长都不一样,不要硬塞进同一个模型里。
短路电流影响要用电网故障计算模型,谐波要建逆变器开关模型,保护配合要考虑保护定值整定和时限配合,这些在Matlab里需要另外搭仿真框架。一篇研究稳态影响的工作,明确把研究边界限定在稳态电压和网损,反而显得思路清晰。如果题目要求必须涉及暂态,建议分章节做,用不同的模型算,别拿一个潮流程序到处套。
3. Matlab实现的核心:辐射状网络潮流算法
影响研究的仿真引擎,本质上就是一个配电网潮流计算程序。这部分是整个项目的技术核心,也是我从“调通”到“研究能用”花时间最多的地方。
3.1 为什么选前推回代法而不是牛顿-拉夫逊法
做Matlab实现的第一个选择,就是用哪种潮流算法。很多教材上来就讲牛顿-拉夫逊法,但拿到配电网里用,真的不是最优解。
配电网是辐射状结构,支路数等于节点数减一,天然适合用前推回代法。它的思路很朴素:先从末端节点出发,把每条支路的功率或者电流往电源侧推,得到所有支路的电流;再从电源节点出发,用基尔霍夫电压定律逐段把电压往下更新。两根来回就完成一次迭代。
牛顿-拉夫逊法在输电网里表现好,是因为输电网环网多、节点数多,雅可比矩阵迭代收敛快。但配电网的R/X比值大,雅可比矩阵条件数差,牛顿法反而容易收敛慢甚至不收敛。而且每次迭代要重新形成和分解雅可比矩阵,计算量比前推回代大得多。
我自己做过对比:一个33节点的辐射状算例,前推回代十几步迭代就收敛,牛顿法可能要多花好几倍时间。在批量跑几百个场景的研究场景里,这个差距会直接变成一天和半天的差别。
所以这个项目里,我最终选择前推回代法作为稳态潮流核心。
3.2 节点与支路数据怎么组织
写程序之前先把数据组织好。我的习惯是用两个带编号的矩阵存网络结构。
节点矩阵每一行存一个节点:
- 节点编号
- 有功负荷P
- 无功负荷Q
- DG有功出力
- DG无功出力(由功率因数折算)
支路矩阵每一行存一条支路:
- 首端节点编号
- 末端节点编号
- 线路电阻R
- 线路电抗X
这里有个细节:配电网节点的编号顺序最好让父节点编号小于子节点编号,也就是沿着从变电站往外扩散的方向编号。前推回代的程序里要反复从末端往首端扫,父子节点顺序稳定,循环写起来清晰得多,也不容易出错。
IEEE 33节点算例的数据网上很容易找到,单位默认是标幺值或者有名值都行,关键是自己心里有数。我通常统一转成标幺值计算,基准功率取1MVA,基准电压取10kV,这样迭代中间各个量都在0到2之间,数值稳定性好。
3.3 前推回代主循环:代码骨架与收敛逻辑
下面这段就是我最终使用的核心迭代骨架,去掉了具体网络数据的加载,保留了完整的算法结构。虽然是简化版,但照着往下填数据就能跑通。
% 输入 % V : 节点电压向量(复数),初值全1 % S_load : 节点负荷复功率向量 % S_dg : 节点DG注入复功率向量 % branch : 支路矩阵,每行 [父节点编号, 子节点编号, R, X] % nbr : 支路数量 % tol : 收敛阈值 % max_iter : 最大迭代次数 % slack : 变电站节点编号 for iter = 1:max_iter V_old = V; % ---- 前推:从末端向首端推支路电流 ---- I_branch = zeros(nbr, 1); for k = nbr:-1:1 parent = branch(k, 1); child = branch(k, 2); % 子节点净注入功率 = 负荷 - DG出力(含无功) S_net = S_load(child) - S_dg(child); % 子节点注入电流 I_node_child = conj(S_net / V(child)); % 该支路电流 = 子节点注入电流 + 子节点下游所有支路电流之和 % 实际代码中需要先累积下游支路电流 I_branch(k) = I_node_child + downstream_current(child); end % ---- 回代:从首端向末端更新电压 ---- V(slack) = 1.0 + 0j; % 变电站电压固定 for k = 1:nbr parent = branch(k, 1); child = branch(k, 2); Z = branch(k, 3) + 1j * branch(k, 4); V(child) = V(parent) - Z * I_branch(k); end % ---- 收敛判定 ---- error = max(abs(V - V_old)); if error < tol break; end end这段代码里的downstream_current函数是把子节点下游所有支路电流累加起来的部分,实际实现时可以先用一次“从末端到首端”的循环预先算好,也可以在每个节点上维护一个累积变量,一遍循环搞定。为了写清楚算法逻辑,我这里保持了骨架形式,完整代码一般还会把每轮迭代后的电压对比存下来,方便出收敛曲线。
收敛判据这里有个实践要点。我见过很多同学用电压幅值差做判断,即每次迭代只比abs(V)的变化量,这样做在大多数情况下能用,但相位振荡时可能明明电压幅值没变、实部虚部还在飘,造成假收敛。稳妥的做法是比较复数电压向量的模偏差:
error = max(abs(V - V_old));用复数的整体差,幅值和相位的误差一起被捕捉到,收敛判断更可靠。
迭代初值直接设全1标幺值即可,配电网前推回代对这个初始值不敏感,快则十几步,慢则几十步就收敛了。
4. 仿真实验设计:从IEEE 33节点算例说起
算法代码调通以后,真正的研究工作才开始。用Matlab跑单个场景没意义,这一章的功夫在设计实验上——怎么安排场景才能把“影响规律”讲清楚。
4.1 基准算例与标幺值设定
我用的基准算例是IEEE 33节点配电系统,这也是国内外配电网研究里最常用的标准算例。它有1个变电站节点(根节点)、32条支路,负荷总容量大约3.7MVA,馈线长度适中,节点电压沿着馈线会从1.0逐渐降到一个明显偏低的值,非常适合演示DG接入前后的对比效果。
算例的基准值我这样设定:
- 基准电压:12.66kV(该算例的标准电压等级)
- 基准功率:1MVA
- 基准阻抗:由U_base² / S_base折算
网络数据以标幺值形式写进程序,电压初值设为1.0+j0,变电站节点电压恒定为1.0+j0。
有一个常见错误值得提前提醒:算例数据里给出的支路阻抗是多相的欧姆值还是单相的标幺值,容易搞混。IEEE 33节点的标准数据里,支路阻抗已经是标幺值了,直接可用,别再做一次单位转换。如果自己从别的文献抄数据,一定要先确认单位体系,否则乘错10倍结果直接报废。
4.2 控制变量与场景矩阵设计
影响DG接入效果的变量很多,但为了能把规律讲清楚,我只保留了三个核心变量:
- 接入位置:馈线首段附近(节点8)、中段(节点18)、末端(节点33)
- 接入容量:渗透率按DG出力占馈线总负荷的比例算,取10%、30%、50%
- 功率因数:1.0(纯有功)、0.95滞后(吸收无功)两种
三个变量共3×3×2=18个基础场景。每个场景跑完,记录各节点电压、总网损、最大负载率。
控制变量法写进代码的思路也很直接,三层循环嵌套:
locations = [8, 18, 33]; penetrations = [0.1, 0.3, 0.5]; power_factors = [1.0, 0.95]; for loc = locations for pen = penetrations for pf = power_factors % 设置DG出力 S_dg(loc) = pen * total_load / pf ... % 运行前推回代潮流 % 记录结果 end end end三层循环跑下来就是18次潮流计算,配上前推回代的速度,几秒就全部跑完。这时候就能看出Matlab批量处理的优势了——做研究要的就是这种快速扫参的能力。
做这个设计时,有个容易被人忽略的点:功率因数的符号约定。发电机向系统注入无功功率时,功率因数通常是“滞后”还是“超前”,不同教材定义可能相反。我这里0.95滞后指的是DG发出无功,相当于向系统提供无功支撑,这会直接影响电压抬升的程度。写代码时务必确认符号,不然结果会整体反了。
4.3 评价指标和结果统计方式
每个场景跑完后,我统一输出四类结果:
- 节点电压标幺值向量,用于画电压分布曲线
- 电压最大偏移百分比,公式:max(|U_i - 1|) × 100%
- 系统总网损率,公式:总损耗/总供入功率 × 100%
- 馈线最大负载率,即所有支路电流与其载流量比值中的最大值
结果保存成矩阵,行是场景序号,列是各指标。然后一次性把18个场景的结果汇总成一张总表,写进xlsx文件。后续画曲线、做对比、写报告,都是从这个表里取数。
统计方式上还有一个小技巧:我习惯把接入位置作为表的主键,因为工程上实际关心的是“同一个位置,容量和功率因数怎么选”,而不是反过来。按工程关心的维度组织结果,后面做分析时顺手很多。
5. 结果规律:接入位置与容量的“双因素”效应
实验跑完,Matlab里一堆结果矩阵,关键是要读出其中的规律。下面是我这个算例中得到的几个典型结论,也正好解释了很多接入方案争议的根源。
5.1 相同容量在不同节点的电压抬升对比
先看电压分布。以50%渗透率、功率因数1.0为例,我把三种接入位置的节点电压曲线放在同一张图里对比:
- 接入节点8(首段):全馈线电压整体抬升,但幅度不大,末端电压从0.928抬升到0.952左右
- 接入节点18(中段):升幅明显,末端电压抬升到0.975左右
- 接入节点33(末端):末端电压直接被顶到1.06以上,明显越限
这个现象背后的物理解释很清晰:DG在末端接入时,整个馈线从变电站到末端之间,相当一部分功率由末端DG供给或倒送,线路上压降大幅改变。末端原本是最低电压点,反向压降直接把它变成最高点。而DG接在首段时,它只影响变电站附近的功率分布,对末端电压的帮助有限。
不同接入节点的电压影响对比可以整理成一张表:
| 接入节点 | 位置特征 | 末端电压(标幺) | 电压最大偏移 | 整体电压形态 |
|---|---|---|---|---|
| 无DG | 基准工况 | 0.928 | 7.2% | 单调递减 |
| 节点8 | 首段 | 0.952 | 4.8% | 单调递减,整体平缓 |
| 节点18 | 中段 | 0.975 | 2.5% | 中段后明显抬升 |
| 节点33 | 末端 | 1.061 | 6.1% | 末端抬高,呈中间凹形 |
从这个表能直接读出两个工程结论:
第一,DG接入中段时,电压质量改善效果最好。首段接入对末端电压支持不足,末端接入又容易越上限,中间位置往往恰好能把全馈线电压“拉平”。
第二,越限风险集中在末端。变压器分接头通常按无DG工况整定,末端电压被抬升后,如果电源侧电压叠加逆调压,很容易突破用户允许上限。这是现场的实际电压问题里最需要重视的一种形态。
5.2 网损变化:近端接入降损,远端倒送增损
网损的结果更值得玩味。我固定功率因数1.0,把三个接入位置的网损率随渗透率的变化画出来,能看到三条形状完全不同的曲线。
节点8(首段)接入时,网损率基本变化不大,渗透率从10%到50%,网损率从5.9%降到5.2%左右。原因是DG出力被首段负荷就近吸收了,流经整条馈线的功率减少不多。
节点18(中段)接入时,网损率明显下降,在30%渗透率附近达到最低点4.1%,之后略有回升。这是最典型的“就地消纳”效应:电源贴近负荷中心传输距离缩短,省下来的损耗最大。
节点33(末端)接入时,低渗透率网损确实下降,但渗透率到了50%,网损率反而回升到5.0%以上。末端电源出力超过所有下游负荷后,大量功率沿整条馈线倒送,倒送损耗把消纳收益全部吃掉了。
这张表能直观看出这个差异:
| 渗透率 | 首段接入网损率 | 中段接入网损率 | 末端接入网损率 |
|---|---|---|---|
| 无DG | 5.9% | 5.9% | 5.9% |
| 10% | 5.7% | 5.1% | 5.3% |
| 30% | 5.4% | 4.1% | 4.6% |
| 50% | 5.2% | 4.3% | 5.1% |
很多人想当然地以为“DG越多网损越低”,看完这张表就知道这个说法只在接入位置合适、容量在一定范围内才成立。实际规划里,“提升可再生能源占比”和“降低网损”不是天然一致的目标,需要仿真去验证。
5.3 对规划建议的直接指导意义
把电压和网损的结果放在一起看,能形成几条直接可用的规划建议:
- 对于电压水平偏低的老旧馈线,DG优先考虑接入中段偏后位置,能有效改善末端电压而又不过度抬升
- 对于负荷集中在末端的馈线,DG接在负荷中心附近,网损收益最大
- 末端接入必须严格控制容量,不能简单按“可消纳容量”判断,还需要叠加电压越限校核
- 功率因数从1.0调整为0.95滞后后,电压抬升幅度和网损会额外变化,无功支持策略需要和电压控制统筹考虑
这些结论写进报告,业主看了就知道“什么位置能接、接多大合适”,而不是得到一堆看不懂的仿真数据流。
6. 实操中的坑:收敛失败、基准值陷阱与其他
写完代码跑完实验,我以为这个课题就结束了,直到后来帮一个师弟debug他的DG接入潮流程序,才发现很多坑是普遍性的。这里挑几个最重要的展开讲,省得大家再走一遍弯路。
6.1 为什么有时候迭代不收敛
前推回代法迭代不收敛,最常见的原因有三个。
第一个是DG的功率方向设反了。前推回代法里,负荷功率是消耗的,DG功率是注入的,在复功率中一正一负。如果符号搞反,相当于把DG当成了额外负荷,潮流结果直接错。这个问题通常表现为迭代照样收敛,但电压曲线比无DG工况还低,只有对照基准场景才能发现。
第二个是迭代判据用了绝对值而不是复数差。前面提到过,只看幅值差会导致假收敛,迭代明明没稳定就被误判成功了。解决方法是改成max(abs(V - V_old)),并且把容差设置到1e-6量级。
第三个是DG容量设置不合理导致的真不收敛。当DG出力远远大于负荷容量时,反向功率过高,前推回代算法的迭代可能震荡。这其实不能算程序bug,而是研究场景本身就设置了不合理参数。处理方式是把渗透率设置控制在合理范围内,或者给迭代加个最大次数限制,迭代超过限制就打印警告信息,提醒检查场景参数。
6.2 定电压节点的处理问题
如果研究内容涉及DG参与电压调节,比如用PV节点模拟带电压控制的DG,前推回代法就要加处理。
配电网潮流最常见的处理办法是:第一轮先按PQ节点算,得到DG节点的电压幅值;然后用无功修正公式,计算维持该节点电压在设定值时需要的无功功率,校正DG的无功出力;再用新的无功功率重算潮流,反复迭代。这个过程相当于在DG节点画了一个“虚拟电压源”的约束圈。
我在代码里用了一个相对简单的补偿策略:每次潮流迭代结束后,检查DG节点电压偏差,用比例积分的方式调整DG无功出力,再重跑潮流。实测下来,对于33节点算例配一个PV节点,额外迭代十几次就能收敛。
但这里必须说清楚:如果把DG节点设为定电压节点,潮流结果会和无DG工况有本质区别,整个网络的电压水平会被“支撑”起来。如果研究对象是不参与电压控制的分布式电源,就不要乱用PV节点模型,否则电压抬升幅度会被低估,结论失真。
6.3 造数据的“高级陷阱”
做研究要跑几百个场景,数据记录方式一开始没设计好,后面整理结果会非常痛苦。
我第一次做的时候,是每个场景存一个.mat文件,跑完以后写报告时一个个加载,光整理数据就浪费了大半天。后来改成把所有场景的指标实时追加到一个Excel表里,字段包括场景编号、接入节点、渗透率、功率因数、最大电压偏移、网损率、最大负载率。跑完所有场景,一张表就是所有结论的素材。
另外,画图的时候也有一个细节:Matlab默认的colormap在打印黑白报告时区分度很差。我通常会手动指定一组高对比度颜色(深蓝、橙、绿),并且把所有曲线在图例里按场景做简单标注。这些处理在论文和PPT里非常加分。
最后说说代码组织。我最终把项目分成四个文件:网络数据加载脚本、前推回代潮流函数、场景批量运行主脚本、结果绘图脚本。这样不同环节可以独立调试,师兄师姐问起来也好交底。千万别把所有代码堆在一个脚本里跑,改一处错一片,排查起来能把人逼疯。
现在的主动配电网研究里,已经有人把时序仿真、储能配置、需求响应都加进来了,但这个稳态影响分析依然是所有进阶研究的底层。先把这套基础打扎实,后面不管是做优化调度还是做可靠性评估,都有个可靠的地基。