ARTICLE DETAIL

资讯详情

深耕郑州网站建设与运营推广的一线实战洞察。

配电网线损分析:等值电阻法原理与Matlab/Python代码实践

配电网线损分析:等值电阻法原理与Matlab/Python代码实践 做配电网线损分析的朋友十有八九都绕不开等值电阻法。它不需要跑完整的潮流计算只要手里有馈线首端的电量、各段线路的阻抗和配变容量就能把整条馈线的损耗估得八九不离十。今天这篇稿子我不打算复述教科书上的推导过程而是直接用 Matlab 和 Python 两套代码走一遍完整链路把从原始数据到损耗电量的每个环节都拆开讲清楚。无论你是刚把 Matlab 2026b 装好、想找个电气工程练手项目的学生还是被月度线损报表逼着写自动化脚本的供电所运检人员这篇文章都值得你看完——代码可以直接抄注意事项是我在真实项目里用时间换来的。1. 等值电阻法到底在算什么——原理与适用边界1.1 从“一堆负荷”到一个电阻配电网和输电网有个很大的不同10kV 馈线往往带了几十台甚至上百台配电变压器每台配变下面又挂着大小不一的负荷。想用潮流法逐点计算需要准确的负荷曲线、线路参数、变压器参数数据准备工作量极大算完还不一定比工程估算准多少。等值电阻法的思路很朴素把整条馈线上分布的所有负荷想象成全部集中到某一个点上这个点上接一个“等值电阻”当首端总电流流过这个电阻时产生的损耗和真实网络里所有线段损耗之和相等。这个电阻就是我们要算的 R_eq。公式表达起来非常简单R_eq Σ(S_j² × R_j) / (ΣS)²其中 S_j 是第 j 段线路流过的容量等于该段下游所有配变容量之和R_j 是第 j 段线路的电阻ΣS 是整条馈线的总容量。算出来的 R_eq 不是某条真实线路的电阻而是一个等效参数物理含义是“虚拟集中负荷点”的等效阻抗。有了它整条馈线的损耗功率就可以写成P_loss 3 × I² × R_eqI 取首端电流就行不需要知道每一段的电流分布。这就是等值电阻法高效的根本原因把一个网络问题简化成单点参数问题。1.2 两种加权口径按容量算和按电量算实际应用中S_j 的取值有两种口径对应不同使用场景。第一种是按配变额定容量加权也就是把 S_j 取为该段下游所有配变额定容量之和。这种口径的优点是不需要逐户电量的数据只要知道每台配变的容量和馈线拓扑就能算非常适合规划阶段估算线损、预测新增负荷对损耗的影响。缺点是它假设所有配变按额定容量的比例同时满载运行和真实负荷分布会有偏差。第二种是按实际电量加权把 S_j 取为该段下游所有配变统计周期内电量的总和。这种口径更贴近实际运行状态精度更高但需要每台配变的计量电量。如果配变数量多、采集不到数据就只能用容量口径先顶着等计量数据补齐了再用电量口径复核。两条口径的代码逻辑完全一致差别只在输入数组的取值。我在实际项目里通常建议月度线损分析用电量口径规划评估用容量口径两边都算一下还能看出线损构成的合理性。1.3 适用场景与精度边界等值电阻法不是万能药。它天生适合辐射状、单电源供电的中低压配电网——这种网络里电流方向明确下游容量累加关系清晰。对于环网运行、多电源并列、分布式电源大量接入的馈线电流流向不再单一方法的前提假设被破坏算出来的结果只能作为粗略参考必须用潮流计算复核。精度方面等值电阻法的误差主要来自三处负荷分布假设与实际不符、三相不平衡、忽略线路对地电容和并联支路损耗。工程经验上只要拓扑和电量数据没大问题10kV 馈线的计算结果误差控制在 5% 到 10% 以内是可以做到的。对于只用来做趋势分析和供电所对标这个精度完全够用。这也是为什么多年过去这个方法在线损管理里依然是主力工具。2. 从原始数据到损耗电量的完整计算流程2.1 数据准备你需要哪些基础资料动手写代码前先把数据捋清楚。等值电阻法需要三类基础数据第一是馈线拓扑和线路参数。至少要知道馈线从首端到末端的线路段划分以及每段线路的单位阻抗和长度。单位阻抗可以从导线型号查表得到比如 LGJ-120 导线的电阻大约 0.27 Ω/km10kV 线路常见型号在 0.2 到 0.6 Ω/km 之间。如果线路有分支需要把分支参数合并到主干段上或者单独建分支模型。第二是配变参数。每台配变的额定容量是必填项如果做电量口径还要带出该配变在统计时段内的有功电量和无功电量。第三是馈线首端计量数据。通常是一个月或一个季度的总有功电量、总无功电量以及统计小时数。注意正反向电量要合并处理分布式电源注入的电量和负荷用电量方向不同不能直接相加减要按代数和处理但最终损耗计算用的是视在电量。2.2 五步走的算法流程整个计算过程拆成五步思路就和代码结构一一对应第一步确定全馈线总容量 S_total。把所有配变容量或电量累加作为后面归一化的分母。第二步计算每一段线路流经的容量 S_j。这是最核心的一步要求从馈线末端往首端累加某一段线路下游接的所有配变容量加起来就是流过这一段的容量。因为渗透电力从首端流向末端线段越靠近首端流过的容量越大。第三步按等值电阻公式计算 R_eq。把每段的 S_j 平方后乘该段电阻求和再除以总容量的平方。第四步由首端电量和电压计算均方根电流 I_rms。公式是I_rms sqrt(A² Q²) / (√3 × U × T)A 是统计时段有功电量kWhQ 是无功电量kvarhU 是额定线电压kVT 是运行小时数h。注意这里的电量要同期不能拿两个月的有功和一个月的无功配一起算。第五步计算损耗电量。损耗功率乘以运行时间再考虑负荷曲线形状系数 KΔA 3 × I_rms² × R_eq × T × K² / 1000最后除 1000 是因为前面算出的是 Wh要换算成 kWh。2.3 损耗电量公式里的三个细节K、均方根电流、单位先说说形状系数 K。它的物理意义是实际负荷电流的均方根值与平均值之比。如果负荷恒定不变K 等于 1如果峰谷差大K 就大于 1。工程上取 1.0 到 1.1 比较常见精确一点可以根据日负荷率查表或按经验公式算。我不会建议你在这个系数上过度纠结它对结果的影响通常在 10% 以内远小于数据不准带来的偏差。再强调一下电流为什么用均方根而不是平均值。损耗和电流平方成正比平均值电流算损耗会系统性地低估。用视在电量除以时间和电压得到的是统计时段内的等效均方根电流这个思路绕开了逐时负荷曲线是等值电阻法能够用“粗数据”算“可接受精度”的关键。最后是单位的坑。你算出来 3 × I² × R 的单位是瓦W乘上运行小时 T 得到瓦时Wh除以 1000 才是千瓦时kWh。很多新手第一次跑代码算出来的损耗电量大了 1000 倍就是因为少了这一步换算。我自己一开始写 Matlab 脚本时也栽过这个跟头后来干脆把所有单位转换都写进代码里不再靠脑子记。3. Matlab 代码实现与逐行拆解3.1 输入数据怎么组织Matlab 的强项是矩阵运算所以输入数据最自然的组织方式就是等长数组。我习惯把线路段按从首端到末端的顺序排好电阻放一个数组每段末端节点所带的配变容量放另一个数组。如果某段线路后面接了多个配变就把这些配变容量加起来作为一个数填进数组。举个例子一条 10kV 馈线分成 4 段每段末端配变容量分别是 160、200、100、250 kVA线路电阻按顺序是 0.45、0.32、0.28、0.21 Ω。这段数据足够演示完整流程后面 Python 部分的算例也用同一组数据方便交叉验证。需要提醒的是R_line 的单位必须统一成 Ω。很多 GIS 导出的数据给的是“单位阻抗×长度”可能写成 Ω/km 和 km要预先乘好不要等代码跑完才发现差了几个数量级。3.2 核心计算代码直接上 Matlab 代码关键步骤都写了注释% 等值电阻法求配电网线损 % 输入线路段电阻(Ω)按首端到末端排列 R_line [0.45, 0.32, 0.28, 0.21]; % 输入各段末端节点所带配变容量(kVA) S_node [160, 200, 100, 250]; % 输入首端有功电量(kWh)、无功电量(kvarh)、统计小时(h)、额定电压(kV) A_g 120000; Q_g 60000; T 720; U 10; % 第 1 步总容量 S_total sum(S_node); % 第 2 步从末端往首端累加得到每段流经容量 n length(R_line); S_seg zeros(1, n); acc 0; for j n:-1:1 acc acc S_node(j); S_seg(j) acc; end % 第 3 步等值电阻 R_eq sum(S_seg.^2 .* R_line) / S_total^2; fprintf(等值电阻 R_eq %.4f Ω\n, R_eq); % 第 4 步均方根电流 I_rms sqrt(A_g^2 Q_g^2) / (sqrt(3) * U * T); fprintf(均方根电流 I_rms %.2f A\n, I_rms); % 第 5 步损耗电量(kWh)记得除以 1000 K 1.03; % 负荷曲线形状系数 dA 3 * I_rms^2 * R_eq * T * K^2 / 1000; fprintf(损耗电量 dA %.1f kWh\n, dA);逐行说几个值得注意的点。S_seg 的累加方向是整个算法的灵魂代码里从 n 倒着循环到 1这样就保证了第 j 段流过的容量等于它自身末端配变加上后面所有线路段的容量。如果搞反方向把首端的总容量一路往下传给末端等值电阻会被严重低估。R_eq 那一行的向量化写法S_seg.^2 .* R_line非常简洁先逐元素平方再逐元素乘电阻最后 sum 求和。如果遇到规模特别大的馈线网络这种写法比 for 循环逐个加要快得多。不过配电网单条馈线通常就几十段性能差异其实无所谓重要的还是逻辑清晰。I_rms 那行公式里sqrt(A_g^2 Q_g^2)得到的是视在电量 kVAh除以sqrt(3)*U*T后单位自然就是 A不需要额外换算。如果你在 Excel 里手算过一遍会发现和这里的结果完全一致。3.3 Matlab 实现中的四个注意事项第一数组顺序必须和物理拓扑一致。R_line 和 S_node 的索引一一对应一旦错位累加结果全是错的而且不容易一眼看出来。我建议在代码前面加注释说明顺序约定或者在变量名里带后缀_from_start之类的提示语。第二单位换算要在进代码前完成。电阻、容量、电量、电压、时间这五个量的单位必须分别是 Ω、kVA、kWh/kvarh、kV、h。GIS 导出的长度单位如果是 km要提前乘单位电阻。第三Matlab 的矩阵默认是列优先但一维数组没有行列的概念用zeros(1, n)和用zeros(n, 1)在绝大多数运算里结果一样。不过如果后面要用transpose或者拼表建议统一用行向量避免维度报错。第四算出来的 dA 如果明显不合理先检查是不是忘记除 1000。以我接触过的代码来看这个错误出现的频率高到值得在代码旁边加一行注释“小心下面的除法不能删”。4. Python 版本从脚本到可复用函数4.1 用 NumPy 和函数改写等值电阻计算Python 版本如果只是把 Matlab 代码翻译过来意义不大。我更推荐用函数封装的方式写这样单条馈线的计算和批量计算都可以复用同一套逻辑。用 NumPy 处理数组计算用普通的def函数把等值电阻计算和损耗计算拆成两个模块职责更清晰import numpy as np def equivalent_resistance(r_line: np.ndarray, s_node: np.ndarray) - float: 按容量口径计算等值电阻。 r_line: 每段线路电阻(Ω)按首端到末端排列 s_node: 每段末端所带配变容量(kVA) s_total s_node.sum() s_seg np.zeros_like(r_line) acc 0.0 for j in range(len(r_line) - 1, -1, -1): acc s_node[j] s_seg[j] acc r_eq np.sum(s_seg ** 2 * r_line) / s_total ** 2 return r_eq def line_loss(r_eq: float, a_g: float, q_g: float, t_h: float, u_kv: float, k: float 1.03) - tuple: 求损耗电量(kWh)和均方根电流(A)。 r_eq: 等值电阻(Ω) a_g: 首端电量(kWh) q_g: 首端无功电量(kvarh) t_h: 统计时长(h) u_kv: 额定电压(kV) i_rms np.sqrt(a_g ** 2 q_g ** 2) / (np.sqrt(3) * u_kv * t_h) d_a 3 * i_rms ** 2 * r_eq * t_h * k ** 2 / 1000.0 return d_a, i_rms r_eq equivalent_resistance( r_linenp.array([0.45, 0.32, 0.28, 0.21]), s_nodenp.array([160, 200, 100, 250]) ) d_loss, i_rms line_loss(r_eq, 120000, 60000, 720, 10) print(fR_eq {r_eq:.4f} Ω) print(fI_rms {i_rms:.2f} A) print(fdA {d_loss:.1f} kWh)这段代码和 Matlab 版本的关系很清楚np.sum对应sumnp.sqrt对应sqrt**对应^数组操作风格几乎一致。主要差异在于 Python 用类型注解把入参含义写清楚了函数返回值用元组(d_a, i_rms)一并带出。我在实际项目里还会把s_node改成从 pandas DataFrame 的某一列读取比如df[配变容量].values这样代码就不局限于单条馈线而是可以循环处理整个区县几百条馈线的数据。等值电阻法的计算逻辑足够简单用 pandas 做数据清洗、用 numpy 做计算比直接在 Matlab 里操作表格要顺手。4.2 手算验证用一个 4 节点算例把结果对清楚只看代码不验证总是不踏实。我拿前面那组数据手算一遍你看完可以自己在 Excel 里核对再用 Matlab 和 Python 跑三方结果一致才能确认代码没问题。总容量S_total 160 200 100 250 710 kVA从末端往前累加每段流经容量第 4 段250 kVA第 3 段250 100 350 kVA第 2 段350 200 550 kVA第 1 段550 160 710 kVA等值电阻R_eq (710²×0.45 550²×0.32 350²×0.28 250²×0.21) / 710² (226845 96800 34300 13125) / 504100 371070 / 504100 0.7361 Ω均方根电流I_rms sqrt(120000² 60000²) / (√3 × 10 × 720) 134164 / 12470.7 10.76 A损耗电量ΔA 3 × 10.76² × 0.7361 × 720 × 1.03² / 1000 195.2 kWh这里有个比较直观的结论算出来的等值电阻 0.7361 Ω 比每段线路电阻都大因为它把下游所有负荷集中到了一个等效点等效点越靠后等值电阻越大。你如果拿不同拓扑的数据算几遍会对这个参数产生更直观的感觉。4.3 Python 工程化的小建议用 Python 做线损计算我建议把脚本提升成一个小工具库而不是每次复制粘贴。一是把函数放进独立的line_loss.py模块用 ifname main 作为测试入口。这样既可以在其他脚本里import line_loss复用也能单独运行做自检。二是输入数据统一用 pandas 管理。比如线路参数表有“线段编号”“起点”“终点”“电阻”“所带容量”五列可以先按拓扑顺序排好序再values转成 numpy 数组传入函数。排序这步看似不起眼却是实际数据中最容易出错的地方——GIS 导出的表和手工台账的顺序往往不一致。三是批量计算的场景下给函数加一个verboseFalse开关只有调试的时候才打印中间量。跑几百条馈线时每行都打印会很刷屏而且浪费时间。四是处理好除零边界。如果S_total是 0说明这条馈线没有配变或者数据缺失应该跳过而不是报错。我在函数开头加一行if s_total 0: return 0.0等价地在 Matlab 里也可以用if S_total 0, R_eq NaN; return; end来处理。做工程软件防御性编程比算法本身更容易被人感谢。5. 实际项目中的常见问题与排查清单5.1 六类高频问题速查表我在处理线损自动化项目时见过的高频问题翻来覆去就那么几类。整理成一张速查表对照检查能省很多时间问题现象根本原因排查方向损耗电量大了 1000 倍漏掉 Wh 到 kWh 的换算检查公式最后的 /1000等值电阻小得离谱容量累加方向做反了检查循环是从末端还是从首端开始电流算出来几百安电压错用 0.4kV或电量单位不是 kWh确认额定电压和电量单位结果对不上另一门语言的输出数组顺序错位打印前几个元素人工比对损耗为负数电量代数和方向处理错误确认光伏注入电量符号某些馈线结果明显偏大拓扑有分支未合并检查是否按下游所有配变累加分支没合并这个问题要特别说一下。真正的馈线很少是纯链式更多是一条主干带好几条分支。处理方式是先把分支化简成主干上的等效负荷比如从主干某节点引出三条分支每条分支都有自己的配变和线路那就把三条分支下游的配变容量累加作为主干该节点的 S_node再把分支的线路电阻折算到主干。详细折算公式不同教材写法略有差异工程上常用的思路是保持分支损耗不变反算出一个等效电阻加到主干对应段上。5.2 如何用 Matlab 和 Python 互验结果我自己写计算脚本时有个习惯同一份数据Matlab 和 Python 各跑一遍对不上就不往下走。不是不信任代码而是两种语言的数据组织方式不同容易暴露“想当然”的错误。互验的步骤很简单。第一步固定同一组输入数据比如就用前面那个 4 段算例。第二步分别输出 R_eq 和 dA保留 6 位有效数字。第三步两者做差如果绝对误差大于 1e-6就说明至少有一边数据读错了优先检查数组顺序和单位。到时候可以专门在某些行打disp(S_seg)或print(s_seg)对比中间量。这种方式对算法调优也有效。当你调整拓扑、修改负荷分布后如果两边结果同时变化但差值始终很小基本可以认定是算法逻辑本身一致而不是碰巧对上了。5.3 从单条馈线扩展到大范围自动计算等值电阻法的真正价值在于批量。单条馈线手算也就十分钟但如果一个县公司有三百条馈线月月算线损就必须写自动化脚本。我的做法是用一个主控脚本来做三件事读入馈线台账表和抄表电量表按馈线编号分组对每条馈线按拓扑顺序排好 R_line 和 S_node调用 equivalent_resistance 和 line_loss 函数把结果写回一个汇总 DataFrame最后导出 Excel。数据量再大的时候还可以用 DataFrame.groupby 加 apply 的方式把所有馈线一次性算完。不过要注意的是每条馈线的线路段数不一样pandas 的组内循环还是要老老实实地对数组操作不能指望向量化操作自动处理不等长数据。5.4 温度与线路老化一个容易忽略的影响因素前面提过导线电阻随温度变化这里再展开一下。铜导线电阻温度系数大约是 0.004/℃如果夏季导体温度 50℃冬季 10℃同样一段线路电阻能差 16% 左右。月度线损分析最好按当月平均气温修正导线电阻。工程上偷懒的做法是不修正因为温度影响相对负荷分布误差通常不是主导项但如果你在做一个精度要求比较高的片区损耗评估建议把温度修正系数也做成一个输入参数而不是写死在代码里。另外一个常被忽略的是老旧线路的实际电阻往往比铭牌值或查表值大。原因包括接头接触电阻、导线氧化、长期运行导致的截面积变化。如果条件允许用实测的线路阻抗或者借助线损管理系统的历史数据反推等效电阻会比查表更可靠。6. 算完等值电阻之后——从数字到决策的最后一公里计算本身不是终点。线损分析要落到管理动作上才有意义。我说说基于等值电阻结果做分析的几个常见套路。把等值电阻和首端电流结合起来看。同样一条馈线R_eq 高说明线路末端负荷占比高或者线径偏细I_rms 高说明负载重。两者都高线损率必然难看优先安排线路改造或负荷割接。反过来R_eq 低但线损率高可能是无功不足导致电流虚高这时候投电容器比换导线更划算。把理论损耗和同期实际损耗对比。如果实际损耗比等值电阻法算出来的理论损耗明显偏高说明存在管理损耗比如窃电、计量误差、档案与实际不符。这是线损管理中很有价值的一种校验手段它不需要精确到每户却能把问题定位到馈线层面。把多条馈线的 R_eq 做成横向对比。单位长度等值电阻偏大的馈线说明线路供电半径过长或者线径偏细是电网薄弱环节的依据之一。这种横向对比在 Matlab 里用 bar 图在 Python 里用 matplotlib 都能快速出图结果呈现给非技术背景的管理人员也直观好懂。说到底等值电阻法是一个用了很多年的经典方法算法本身不复杂但它把“数据组织能力”和“工程判断力”的要求留给了实现者。代码可以在一个下午写完真正的功夫在数据清洗、拓扑梳理和结果解读。你在实际项目里跑过几轮之后再回头读最开始的那些教科书公式会有完全不同的体会。我个人的习惯是只要涉及线损数据永远把“单位对齐、拓扑顺序对齐、时间口径对齐”这三件事写在项目开工清单的第一页。这九个字看着简单却是我在无数个对着异常数据找 bug 的夜晚里总结出来的。等值电阻法绝不会因为换用 Python 或 Matlab 而变聪明但一套严谨的数据管线和一批可复用的代码能让这个方法在你手里发挥出比教科书大得多的价值。
返回列表