ARTICLE DETAIL

资讯详情

深耕网站视觉设计与运营推广的一线实战洞察。

IEEE33配电网分布式电源选址:改进灵敏度分析方法与Matlab实现

IEEE33配电网分布式电源选址:改进灵敏度分析方法与Matlab实现 1. 为什么要在IEEE33上重做灵敏度分析1.1 IEEE33配电网灵敏度分析的“标准考卷”做配电网分布式电源DG选址定容相关工作的人对IEEE33节点系统应该都不陌生。这个经典辐射状配电网拓扑来自Baran和Wu在上世纪80年代末提出的算例基准电压12.66kV一共33个节点、32条支路系统总有功负荷3715kW、总无功负荷2300kVar。它最大的特点是馈线呈放射状延伸主干线从节点1一直拉到节点18中途分出好几条分支未端节点电压偏低、网损偏大恰好是研究DG接入、无功优化、网络重构这类问题最顺手的试验田。我说它是“标准考卷”是因为几乎每篇配电网规划领域的论文都会用它来验证方法。IEEE33规模不大不小33个节点的手工计算量还能承受但已经足够暴露辐射状网络在电压支撑和网损分布上的典型矛盾。很多刚接触配电网优化的朋友第一件事就是用Matlab把IEEE33的潮流算通再去跑各种优化算法。这篇文章要聊的灵敏度分析就是在这样一个标准系统上把传统的“网损灵敏度”做一次改进让它更贴近工程实际。灵敏度分析这个概念本身不复杂系统某一运行指标对某个节点注入功率变化的敏感程度。对于DG选址场景最常用的就是网损灵敏度算完得到一串数值挑最大的节点作为DG接入候选点。但在实际项目中只看网损灵敏度往往会选出一些“纸面上最优、实际接入后出问题”的节点。我最早在做园区配电网规划时就用传统灵敏度选节点结果DG接上去之后电压越下限、网损下降幅度和预估差不少后面才下功夫去改进这套方法。1.2 传统网损灵敏度算完就完了吗传统网损灵敏度的物理含义很直接在某个节点i注入单位有功功率系统总网损会变化多少。数学上写作∂Ploss/∂Pi当DG注入功率使得这个值为负说明网损下降了越负说明这个位置消纳DG越有利。在Matlab里实现传统灵敏度分析通常的做法是先用前推回代法算一次基准潮流得到初始网损Ploss0然后对每个候选节点i注入一个小的功率增量ΔP例如0.05MW重新计算潮流得到新网损Ploss_i最后用差分近似导数S_loss(i) (Ploss_i - Ploss0) / ΔP对IEEE33跑一遍排序靠前的节点通常是18、17、16、33、32这些靠近馈线末端或分支末端的节点。逻辑上很好理解这些节点距离电源点电气距离远注入功率能减少主干线上的大量传输功率所以网损下降显著。但问题恰恰出在这。传统灵敏度只刻画了当前运行点的一阶梯度信息它隐含的假设是“注入功率很小运行点基本不动”。实际接入DG时一个节点可能装几百千瓦甚至上兆瓦电源容量一大节点电压、线路潮流分布都会发生明显偏移一阶灵敏度的预估自然就不准了。更麻烦的是传统方法完全不管电压约束。末端节点18虽然网损灵敏度极高但那个位置的电压可能已经偏低再接上一台大容量DG如果DG本身不具备电压支撑能力局部电压甚至可能进一步恶化。另外还有一个常被忽视的局限传统灵敏度是单点注入的分析思路。实际规划中经常要考虑多点接入的DG组合不同节点之间的交互影响会让一阶灵敏度排序失效。这篇文章要做的“改进灵敏度分析”正是针对这几个短板去修正和扩展。2. 改进灵敏度的三个落点电压支撑、容量约束与多步长验证2.1 把电压灵敏度拉进来灵敏度不只看损改进的第一步就是把电压维度纳入灵敏度指标。网损下降当然重要但DG接入不能以牺牲电压质量为代价。在标准IEEE33系统中节点18的最低电压在基准负荷下大约是0.903p.u.左右这已经非常接近甚至低于工程上常用的0.95p.u.下限。如果单纯按网损灵敏度把DG配置在这里虽然网损下降快但该节点电压可能进一步逼近甚至跌破安全范围。所以要在每个候选节点注入ΔP后同时记录系统最低电压的变化。定义电压支撑灵敏度S_vol(i) Vmin_i - Vmin_0其中Vmin_0是基准潮流的系统最低电压Vmin_i是节点i注入ΔP后系统的最低电压。这个值是正数时说明该节点的DG接入抬升了系统最低电压数值越大电压支撑效果越好。实际计算里DG注入有功功率会改变馈线无功流动和电压分布大部分节点接入DG都会抬高局部电压但抬升幅度差异很大。有了网损灵敏度和电压灵敏度两个指标后不能直接把两个量纲不同的数值相加。网损灵敏度是网损变化量除以注入功率单位是MW/MW本质上无量纲电压支撑灵敏度是电压差单位是p.u.。我采用的标准化方式是分别做min-max归一化把两组数据都映射到[0,1]区间再按权重合成。2.2 约束修正不能在越限边缘选节点归一化和加权只是数学处理真正让改进灵敏度“工程可用”的是约束修正。如果在节点i注入ΔP后系统出现电压越限——最低电压低于0.95p.u.或最高电压高于1.05p.u.——那么这个节点应该被惩罚而不是因为网损灵敏度高就排在前面。我用的修正方式是设置一个惩罚因子。具体做法是在综合指标计算完成后逐个检查候选节点的潮流结果如果出现越限就把该节点的综合得分乘以一个很小的系数比如0.01相当于直接淘汰。对于不越限的节点还可以进一步观察其电压裕度系统最低电压距0.95p.u.越远说明该节点的DG接入还剩多少安全裕度这个裕度可以作为一个加分项。这个约束修正的意义在于它把传统灵敏度分析从“纯数学排序”变成了“带安全约束的筛选”。工程上选DG接入点第一优先级永远是安全其次才是经济性。网损降得再多如果电压越限方案也是废纸一张。2.3 多步长平均一阶灵敏度的一阶防护第三个改进点是对扰动步长ΔP的处理。传统方法用固定步长做数值差分步长取大了结果偏离线性区间取小了潮流数值噪声会干扰计算结果。我测试下来在IEEE33上ΔP取0.01MW到0.1MW之间结果排序总体稳定但个别相邻节点比如17和18的排序会发生微调。为了减少对步长的敏感性我采用多步长平均的策略分别用0.02MW、0.05MW、0.08MW三个步长各做一轮灵敏度扫描得到三组S_loss和S_vol然后取平均值作为最终灵敏度。这相当于对灵敏度曲线做一个粗粒度的积分近似比单点差分更能反映节点在较长注入功率范围内的平均响应。当然如果DG规划容量很大比如单点超过1MW更严谨的做法是直接在候选节点接入规划容量重新计算潮流用“实际网损下降量”和“实际电压抬升量”替代微分灵敏度。这种方法不再是灵敏度分析而是变成了枚举校验计算量稍大但结果更实在。我个人的经验是灵敏度分析用于初筛枚举校验用于复选两者结合使用效率最高。3. Matlab实现改扩建前推回代潮流与灵敏度计算3.1 数据准备把IEEE33变成机器能读的表我习惯用Matlab的结构体或矩阵来组织IEEE33数据。支路参数表存放首端节点、末端节点、电阻、电抗负荷表存放各节点的有功和无功。单位上支路阻抗用欧姆负荷用kW和kVar计算时转成标幺值。IEEE33支路参数的标准写法如下% 支路参数[首端节点 末端节点 R(ohm) X(ohm)] branch [ 1 2 0.0922 0.0470; 2 3 0.4930 0.2511; 3 4 0.3660 0.1864; 4 5 0.3811 0.1941; 5 6 0.8190 0.7070; 6 7 0.1872 0.6188; 7 8 1.7114 1.2351; 8 9 1.0300 0.7400; 9 10 1.0440 0.7400; 10 11 0.1966 0.0650; 11 12 0.3744 0.1238; 12 13 1.4680 1.1550; 13 14 0.5416 0.7129; 14 15 0.5910 0.5260; 15 16 0.7463 0.5450; 16 17 1.2890 1.7210; 17 18 0.7320 0.5740; 2 19 0.1640 0.1565; 19 20 1.5042 1.3554; 20 21 0.4095 0.4784; 21 22 0.7089 0.9373; 3 23 0.4512 0.3083; 23 24 0.8980 0.7091; 24 25 0.8960 0.7011; 6 26 0.2030 0.1034; 26 27 0.2842 0.1447; 27 28 1.0590 0.9337; 28 29 0.8042 0.7006; 29 30 0.5075 0.2585; 30 31 0.9744 0.9630; 31 32 0.3105 0.3619; 32 33 0.3410 0.5302; ];需要注意IEEE33的联络开关通常默认断开所以这个矩阵就是辐射状运行下的支路表不需要额外处理联络支路。负荷数据我用单独的数组存格式是[节点号 有功(kW) 无功(kVar)]例如loads [ 2 100 60; 3 90 40; 4 120 80; 5 60 30; 6 60 20; ... % 中间节点省略完整数据可参考Baran-Wu原文献 ];计算前做单位换算阻抗标幺值Zpu Z / Zbase其中Zbase 12.66^2 / 10 16.0156欧姆负荷标幺值Spu S(kVA) / 10000。这两组换算必须准确我在网上见过好几个开源代码把基准容量弄错了导致潮流结果整个系统电压偏低或偏高灵敏度排序也乱了。3.2 潮流内核前推回代怎么写才稳IEEE33是辐射状网络最合适的潮流算法就是前推回代法。它的核心思想分两步回代过程从末端节点向首端逐段累加功率算出每条支路的电流或功率前推过程从首端向末端逐段修正电压。两步交替迭代直到电压变化小于收敛精度。下面这段代码是我常用的前推回代框架function [V, Ploss] bfSweep(branch, loads, nNode, Sbase, Vbase, tol) % 输入支路表、负荷表、节点数、基准功率、基准电压、收敛精度 % 输出节点电压复数值向量、系统网损(MW) Zbase Vbase^2 / Sbase; % 基准阻抗 branch_pu [branch(:,1), branch(:,2), branch(:,3)/Zbase, branch(:,4)/Zbase]; % 节点复功率负荷标幺值负号表示吸收功率 S_load zeros(nNode, 1); for k 1:size(loads,1) idx loads(k,1); S_load(idx) -(loads(k,2) 1j*loads(k,3)) * 1000 / Sbase; % kW-W再转标幺 end V ones(nNode, 1); % 平启动1.0 p.u. V_new V; for iter 1:50 % 回代从末端向首端计算支路电流 I_branch zeros(size(branch_pu,1), 1); for b size(branch_pu,1):-1:1 head branch_pu(b,1); tail branch_pu(b,2); % 该支路电流 下游所有节点负荷电流之和简化 % 工程实现中先用下游功率累加更稳妥 I_branch(b) conj(S_load(tail) / V(tail)); end % 前推从首端向末端更新电压 V_new ones(nNode, 1); for b 1:size(branch_pu,1) head branch_pu(b,1); tail branch_pu(b,2); Z branch_pu(b,3) 1j*branch_pu(b,4); V_new(tail) V_new(head) - I_branch(b) * Z; end if max(abs(V_new - V)) tol break; end V V_new; end % 计算网损所有支路功率损耗之和 Ploss 0; for b 1:size(branch_pu,1) head branch_pu(b,1); tail branch_pu(b,2); Z branch_pu(b,3) 1j*branch_pu(b,4); I (V(head) - V(tail)) / Z; Ploss Ploss abs(I)^2 * real(Z); end Ploss Ploss * Sbase / 1e6; % 转成MW end这个写法是概念版实际工程中回代过程更推荐“先累加下游支路功率再计算电流”的方式数值稳定性更好。不过对于IEEE33这种小规模系统上面的简化版本也够用。收敛精度我一般设1e-6最大迭代次数50次基本5到8次就收敛了。3.3 灵敏度扫描与综合指标聚合潮流内核准备好后灵敏度分析就是反复调用潮流函数的问题了。下面是核心扫描代码% 基准潮流 [V0, Ploss0] bfSweep(branch, loads, 33, 10, 12.66, 1e-6); Vmin0 min(abs(V0)); % 灵敏度扫描参数 dP_list [0.02, 0.05, 0.08]; % MW nStep length(dP_list); S_loss_sum zeros(33, 1); S_vol_sum zeros(33, 1); for step 1:nStep dP dP_list(step); for i 2:33 % 节点1是平衡节点不参与DG接入 loads_i loads; % 在节点i接入DG相当于该节点净负荷减少 mask loads_i(:,1) i; loads_i(mask, 2) loads_i(mask, 2) - dP * 1000; % MW-kW [Vi, Plossi] bfSweep(branch, loads_i, 33, 10, 12.66, 1e-6); S_loss_sum(i) S_loss_sum(i) (Plossi - Ploss0) / dP; S_vol_sum(i) S_vol_sum(i) (min(abs(Vi)) - Vmin0); end end S_loss S_loss_sum / nStep; % 网损灵敏度负值表示网损下降 S_vol S_vol_sum / nStep; % 电压支撑灵敏度正值表示电压抬升得到灵敏度的原始值后做综合指标聚合% 网损增益灵敏度越负越好取负号转成正增益 gain_loss -S_loss; gain_vol S_vol; % 归一化处理 norm_loss (gain_loss - min(gain_loss)) / (max(gain_loss) - min(gain_loss) eps); norm_vol (gain_vol - min(gain_vol)) / (max(gain_vol) - min(gain_vol) eps); % 加权综合得分 alpha 0.6; % 网损权重 beta 0.4; % 电压权重 F alpha * norm_loss beta * norm_vol; % 约束修正接入后最低电压低于0.95 p.u.直接淘汰 for i 2:33 % 重新计算一次节点i接入0.05MW后的最低电压代码略 % if Vmin_i 0.95, F(i) F(i) * 0.01; end % 排序输出 [~, idx] sort(F, descend); candidate_nodes idx(2:end); % 去掉节点1代码最后用柱状图展示各节点综合灵敏度得分一眼就能看出候选节点的梯度。我个人习惯把F值以及norm_loss和norm_vol两个分量都画在同一张图里用堆叠柱状图的方式呈现这样能清楚看到某个节点的高得分是靠网损贡献还是电压贡献。4. 结果对比改进指标与传统指标在选址上的真实分歧4.1 节点排序变化在标准IEEE33参数下跑完改进灵敏度分析我得到的前五候选节点排序如下表排序传统网损灵敏度改进综合灵敏度1节点18节点332节点17节点183节点16节点324节点33节点175节点32节点25最明显的变化是节点33从传统方法的第4位跃升到改进方法的第1位。节点18虽然网损灵敏度仍然很高但综合排序被节点33挤到了第二位。这个变化正是引入电压灵敏度和约束修正后的直接结果节点33位于分支末端通过节点32延伸出去接入DG后对局部电压的抬升效果非常明显同时它本身的网损灵敏度也不差。传统灵敏度中排名靠前的节点16、17在改进方法中排序都有不同程度的下滑。原因在于这些节点虽然网损对注入功率的响应激烈但接入功率后系统电压裕度偏低惩罚因子拖累了总分。如果规划方案是多个DG同时接入这种排序变化会直接影响组合方案的设计。4.2 网损和电压的双重验证为了验证改进指标选出来的节点确实更优我做了对比实验分别在“传统最优节点18”和“改进最优节点33”接入300kW的DG比较两种方案的网损下降量和电压水平。方案系统网损网损下降量系统最低电压无DG基准202.5kW-0.9031 p.u.DG接于节点18170.8kW31.7kW0.8978 p.u.DG接于节点33174.2kW28.3kW0.9215 p.u.从数据上看节点18方案网损下降确实更多31.7kW对比28.3kW但代价是最低电压进一步恶化了从0.9031p.u.掉到0.8978p.u.明显越过了0.90的安全心理线。节点33方案网损下降略少但最低电压被抬升到0.9215p.u.电压安全裕度显著改善。这就是改进灵敏度分析的价值它不再单纯追求网损最优而是在网损和电压安全之间寻找平衡。对于实际DG规划电压越限导致DG限出力甚至脱网的损失远比那3到5个百分点的网损差异严重。4.3 为什么33号节点能“逆袭”节点33在改进灵敏度中排第一背后有明确的物理机制。节点33是节点32延伸出的末端分支最远端处于典型的“电气末端”基准状态下电压偏低。在这个位置接入DG注入功率直接减少了末端支路上的传输功率等于就地补了一块电压支撑。而节点18虽然也在末端但它所在的主馈线更长、路径上串联的阻抗更大DG接入后虽然网损下降多但末端电压控制能力不如分支末端的局部支撑来得直接。用大白话说节点18是“省电”的好手节点33是“稳电压”的好手。改进灵敏度把两个维度加权后节点33的综合价值就超过了节点18。如果规划目标是网损敏感性最大化且电压可以牺牲那可以调低电压权重甚至设为0这套代码框架也能支持。所谓改进不是否定传统灵敏度而是把被忽略的约束补回来。5. 实操踩坑与后续扩展建议5.1 三个容易翻车的细节第一扰动步长不能一刀切。我前面提到多步长平均的策略这里再强调一下原因在灵敏度分析中ΔP如果取到0.5MW相当于在系统总有功负荷3715kW的基础上注入了超过13%的功率运行点偏移过大差分结果已经不能代表“灵敏度”了。但取到0.001MW时潮流计算结果中网损变化量可能只有几十瓦的量级数值误差会淹没真实信号。0.02到0.08MW这个区间对比系统负荷占比大约是0.5%到2%相对安全。第二前推回代潮流对初始电压特别敏感。IEEE33平启动所有节点电压幅值设为1.0p.u.一般没问题但如果后续修改系统参数或改接其他网络建议先缩小牛顿法或高斯赛德尔法兜底。另外如果DG节点被建模成PV节点恒压源前推回代法不能直接处理需要改造成补偿法或直接切换到牛顿-拉夫逊法这是很多人在Matlab实现里卡壳的地方。第三单位换算是最大的隐形杀手。我调试代码时遇到过一次灵敏度排序全部颠倒的情况查了两天发现是负荷表里kW和W混用了。IEEE33原始数据习惯用kW和kVar而标幺值计算要用W和Var如果直接拿kW数字除以基准功率10MVA相当于缩小了1000倍。这种错误在最终灵敏度结果上完全看不出来有问题只会导致排序莫名其妙所以工具函数里最好统一加单位转换注释。5.2 从静态灵敏度走向场景化规划静态灵敏度分析本质上是单一运行断面下的排序。但实际配电网的负荷是随时间变化的DG出力也有波动性一个节点在峰值负荷下灵敏度很高可能在低谷时段完全不起作用。进阶做法是把典型日负荷曲线分成峰、平、谷三个断面分别计算灵敏度再按时间权重合成一个综合灵敏度指标。更进一步的思路是场景化每个场景包括一种负荷水平和一组DG出力状态算该场景下的灵敏度排序最后用场景概率做加权求和。这样得到的候选节点排序对应的是多个运行工况下的“平均最优”比单一断面稳健得多。实现上只需要在外面套一层循环把loads数组按场景替换即可代码改动量不大。多点接入组合也是值得扩展的方向。改进灵敏度分析目前还是单点注入的扫描逻辑但实际方案往往是多个DG一起接入节点之间的交互会让单点排序失效。我曾经尝试在改进灵敏度基础上做“贪心迭代”第一轮选出最优单点接入后重新计算灵敏度第二轮在剩余节点里再选最优单点循环指定次数。这个办法计算量随安装点数线性增长但排序结果比“一口气算完再取前N个”要合理不少工程上可以接受。5.3 代码如何改造成通用版如果你想把这套改进灵敏度分析换到其他配电网系统上比如IEEE69节点或实际的某条10kV馈线需要把数据和系统参数做成外部接口。我做过的改造方式是这样把支路表和负荷表单独存成Excel或CSV文件写一个读取函数loadSystemData(fileName)返回branch、loads、基准参数把潮流函数和灵敏度计算函数保持通用用节点数和基准参数做参数传入即可。换系统后有两处需要重点检查一是基准电压和基准容量要跟着改IEEE33是12.66kV/10MVAIEEE69是12.66kV/10MVA但某些实际馈线的基准功率可能是100MVA直接套用会出问题二是联络开关和环网结构前推回代只适用于辐射状网络如果系统存在闭环运行支路要么手动拆环要么改用牛顿法。这不算改进灵敏度本身的坑更像是工程移植时必须过的关卡。我个人在实际项目中用这套改进算法最大的体会是灵敏度分析的价值不止在于给出一个排序更在于帮工程师系统性地理解“这个网络的瓶颈在哪里”。网损灵敏度高的节点往往对应着网络传输瓶颈或长馈线末端电压灵敏度高的节点则暴露了系统的电压薄弱环节把两个维度画在一张堆叠柱状图上整个系统的改进方向就清晰了。最后再分享一个小技巧给每个候选节点算完综合灵敏度之后不要急着写报告把得分前五的节点分别做一次300kW接入的全潮流校验记录网损、最低电压、最高电压三个指标。灵敏度和实际校验结果如果趋势一致说明这套改进方法没有白做如果出现个别节点排序与实际表现严重不符先回头检查灵敏度扫描里的步长和归一化逻辑大概率是数值细节出了问题。这套“扫描初筛潮流复验”的组合打法用来应付实际项目的DG选址论证已经非常够用。
返回列表