那段时间我在做一个分布式电源接入方案的评审工作办公室争论最凶的问题不是保护定值也不是弃光率而是最朴素的一句光伏到底装在哪几个节点最好有人说放末端末端电压低正好用光伏抬电压有人说放负荷中心就地消纳减少倒送还有人说干脆靠近变电站线路短损耗小。争到第三轮我们终于把问题翻译成了一个数学问题同样接入1MW的电源IEEE33这种33节点配电网里放在哪个节点全网网损降得最多电压抬得最稳于是灵敏度分析正式登场。这篇文章就以IEEE33节点配电网为例讲清楚传统灵敏度分析为什么不够用、改进灵敏度分析到底改了什么、对应的Matlab代码怎么写以及我在实现过程中踩过的坑。1. 为什么配电网选址绕不开灵敏度分析——从一次方案争论说起1.1 一次方案评审中的真实困境那次评审会上方案组拿了一份风光资源分布图又拿了一份负荷分布表结果每拨人都有自己的判断。有人盯着电压最低点说节点18的电压已经逼近0.9光伏必须放这里有人盯着负荷最大点说节点24、25的负荷很大DG应该贴近大负荷还有人担心线损说越靠近变电站的节点线路越短损耗天然小。这些说法单独看都有道理但放到同一个评估框架里就乱了。电压最低点可能是电压改善最优位置却不一定是网损改善最优位置负荷中心可能是消纳最方便的位置却可能因为电气距离近而“喂不饱”远端线路。吵来吵去唯一能达成共识的就是我们需要一个能统一量化“节点价值”的指标。灵敏度分析就是干这个的。1.2 灵敏度分析到底在“灵敏”什么配电网里的灵敏度本质是“目标函数对控制参数变化的响应程度”。DG选址最常用的有两类网损灵敏度和电压灵敏度。以网损灵敏度为例数学定义是 ∂Ploss/∂P_i即节点 i 的注入有功功率变化一个单位时全网网损的变化量。工程上可以理解为如果我在节点 i 接入 1kW 分布式电源全网网损会因此降低多少 kW。这个值越负、绝对值越大说明这个节点接入 DG 的降损收益越高。电压灵敏度同理衡量的是节点 i 注入功率变化后某一节点电压幅值的变化量。在调压研究中常用比如想知道“在哪个节点加无功补偿对全网最低电压提升最明显”本质上就是比较各节点的电压灵敏度。这两个指标在原理上非常清晰但落地时问题不少。常规做法是在当前运行点做一次线性化算出每个节点的灵敏度值再排序。这种方式速度快、代码简单可一旦 DG 容量变大、运行点偏离基准点排序结果经常会“翻车”。这就是后面要讲的重点——改进灵敏度分析解决了什么。1.3 为什么拿IEEE33节点当试验场IEEE33 节点系统是配电网研究里的经典算例33 个节点、32 条支路、基准电压 12.66kV、基准功率 10MVA总负荷约 3715kW 2300kvar。它的结构非常“有讲头”——有主干馈线有多个分支既有靠近电源的节点也有远离电源的末端节点还有负荷特别重的节点段。基态下末端节点电压会明显偏低网损也偏高这个特征特别适合做 DG 接入位置的研究。因为算例规模不大Matlab 跑潮流只需要毫秒级就算把每个节点的容量扫描曲线全算出来整体也就是十几秒的事。这个特点决定了我们可以在它上面做“重计算、轻代价”的改进试验这也是很多论文和工程项目拿 IEEE33 当验证载体的原因。2. 从潮流方程到灵敏度指标IEEE33系统的计算基础2.1 数据准备支路参数与负荷矩阵做灵敏度分析之前必须先把算例数据吃透。IEEE33 的标准参数在公开文献里有多个版本个别负荷数值会有小幅出入但不影响算法验证。我用的版本如下支路参数为有名值欧姆负荷为有功kW加无功kvar。%% IEEE33 节点系统基础数据有名值 % 支路: [首端节点, 末端节点, 电阻R(ohm), 电抗X(ohm)] branch_ohm [ 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.2350 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 ]; % 负荷: [节点, 有功(kW), 无功(kvar)] load_kwkvar [ 2 100 60 3 90 40 4 120 80 5 60 30 6 60 20 7 200 100 8 200 100 9 60 20 10 60 20 11 45 30 12 60 35 13 60 35 14 120 80 15 60 10 16 60 20 17 60 20 18 90 40 19 90 40 20 90 40 21 90 40 22 90 40 23 90 50 24 420 200 25 420 200 26 60 25 27 60 25 28 120 70 29 200 600 30 150 70 31 210 100 32 60 40 33 60 40 ];数据读进来以后建议转成标幺值。基值取 Sb10MVA、Vb12.66kV这样支路阻抗和负荷功率都在 1 附近潮流计算数值更稳也不会因为数量级差异带来浮点误差。Sb 10e6; % 基准功率 10MVA Vb 12.66e3; % 基准线电压 12.66kV Zb Vb^2 / Sb; % 基准阻抗 branch branch_ohm; branch(:,3:4) branch(:,3:4) / Zb; Sload zeros(33,1); for i 1:size(load_kwkvar,1) nd load_kwkvar(i,1); Sload(nd) (load_kwkvar(i,2) 1j*load_kwkvar(i,3)) / 1e3 / Sb; end这里把负荷定义成“正方向从电网吸收功率”。后面接入 DG 时直接在对应节点的 Sload 中减去一个有功量即可非常直观。2.2 前推回代潮流辐射状网络最省心的解法配电网潮流计算我首选前推回代而不是牛顿-拉夫逊法。原因是配电网的 R/X 比值偏大潮流方程容易病态牛顿法对初值敏感而辐射状网络天然适合前推回代——回代时从叶子节点向根节点累加电流前推时从根节点向叶子节点更新电压两步交替迭代就能收敛。function [V, Ploss] bfpowerflow(branch, Sload) % bfpowerflow: 前推回代潮流 % branch: [from, to, Rpu, Xpu] % Sload: n*1 复数列向量负荷为正标幺 % V: 节点电压标幺值Ploss: 总网损标幺值 n length(Sload); Zbranch branch(:,3) 1j*branch(:,4); % 建立拓扑关系 parent zeros(n,1); Znode zeros(n,1); children cell(n,1); for k 1:size(branch,1) f branch(k,1); t branch(k,2); parent(t) f; Znode(t) Zbranch(k); children{f} [children{f}, t]; end % BFS 求深度和遍历顺序 depth zeros(n,1); queue [1]; head 1; while head length(queue) nd queue(head); head head 1; for ch children{nd} depth(ch) depth(nd) 1; queue(end1) ch; end end [~, idx_desc] sort(depth, descend); % 叶子到根的顺序 V ones(n,1); maxIter 200; tol 1e-8; for iter 1:maxIter % 回代叶子到根累加支路电流 Iinj conj(Sload ./ V); Ibr zeros(n,1); for i idx_desc Ibr(i) Ibr(i) Iinj(i); if parent(i) 0 Ibr(parent(i)) Ibr(parent(i)) Ibr(i); end end % 前推根到叶子更新电压 Vnew V; for nd queue % BFS顺序即深度升序 if parent(nd) 0 Vnew(nd) V(parent(nd)) - Ibr(nd) * Znode(nd); end end if max(abs(abs(Vnew) - abs(V))) tol V Vnew; break; end V Vnew; end if iter maxIter warning(前推回代达到最大迭代次数可能不收敛); end % 网损 sum(|Ibr|^2 * R) Ibr_real abs(Ibr); Ploss sum(Ibr_real.^2 .* real(Znode)); end代码里有一个容易被忽略的细节支路索引用“子节点编号”来对应也就是Ibr(i)表示节点 i 与父节点之间那条支路的电流。这样做的好处是在回代累加时不需要反复查支路表直接用 parent 数组就能完成向上累加代码干净很多。基态算出来总网损大约在 202kW 上下标幺值约 0.0202末端节点电压最低点通常在节点 18 附近电压约 0.90~0.91。这个基态结果可以直接作为后续灵敏度计算的基准。2.3 用数值扰动法计算传统网损灵敏度严格意义上的灵敏度可以从潮流雅可比矩阵求逆得到但在工程实现里我更推荐数值扰动法。思路就是导数的定义在基准运行点给某个节点注入功率加一个小扰动 dp重新计算网损然后用差商代替微商。function sens lossSensPerturb(branch, Sload, dp, candNodes) % 扰动法计算网损灵敏度 % dp: 有功扰动量标幺建议 0.0005~0.002 [~, Ploss0] bfpowerflow(branch, Sload); sens zeros(length(Sload),1); for k candNodes Sload2 Sload; Sload2(k) Sload2(k) - dp; % 等效接入纯有功DG [~, Ploss2] bfpowerflow(branch, Sload2); sens(k) (Ploss2 - Ploss0) / dp; end enddp 的大小直接影响灵敏度数值。我试过取 0.0001 和 0.005前者会被潮流收敛误差干扰后者已经明显偏离线性区间。常规做法是取基准总负荷的 0.05%~0.2%IEEE33 上我一般取 dp0.001pu也就是 10kW结果很稳定。扰动法还有个额外好处想换成电压灵敏度只需要把目标函数从Ploss改成某个节点的电压幅值改两三行就行。解析法当然更“数学正确”但在工程验证和快速迭代阶段扰动法的灵活性和代码可维护性明显更好。3. 传统灵敏度的三个盲区改进从何而来3.1 线性化只在基准点成立DG容量一大排序就变传统灵敏度最大的问题是它只在基准运行点附近成立。前面算出的灵敏度本质上是当前潮流点的一条切线DG 容量小的时候这条切线还能代表真实趋势容量一旦上百千瓦甚至兆瓦运行点早就偏出去了。我在 IEEE33 上做过一组对照测试用 10kW 小扰动算一个排序再分别把 DG 容量提到 300kW、600kW、900kW 重新算实际网损得到的“真实降损效果排序”差得非常多。下面这组结果是我在本地方跑出来的典型形态数据版本和功率因数设置不同会略有差异DG容量水平排序靠前的节点示意10kW小扰动18, 17, 16, 33, 32300kW18, 33, 17, 32, 25600kW33, 32, 25, 24, 18900kW25, 24, 33, 31, 18小容量时末端轻载节点因为对电压改善敏感排名靠前容量变大后这些节点很快进入功率倒送区反而是负荷重、可消纳空间大的节点24、25附近开始占据优势。这个规律只靠基准点的一次线性化是看不到的。3.2 网损-容量曲线不是单调递减存在最优容量很多初学者默认“DG装得越多网损降得越多”实际完全不成立。网损-容量曲线通常是先降后升的 U 型DG 出力小于本地净负荷时注入功率替代了部分沿馈线传输的功率网损下降但一旦 DG 出力超过本地净负荷多余功率就要沿馈线往根节点反送反送电流同样会在线路上产生损耗网损反而回升。每个节点的 U 型曲线深浅和谷值位置都不一样。轻载末端节点往往谷值很浅比如节点 18 的最佳接入容量大概只有 100~200kW 这个量级重载中远端节点比如 24、25的谷值很深最佳接入容量可以达到几百千瓦甚至更高。传统灵敏度只能告诉你“这个方向有收益”却给不出“到底装多少最合适”和“装多了会不会更差”这两个关键信息。3.3 网损指标和电压安全完全脱节第三个盲区是目标函数太单一。网损灵敏度排序出来的“最佳节点”未必是电压最安全的节点。某些末端节点接入大容量 DG 后电压会显著抬升甚至越过 1.05pu 的上限反过来某些靠近变电站的节点网损灵敏度很低但接入 DG 后对提升末端低电压几乎毫无帮助。做规划不能只盯着网损这一个数。改进灵敏度要做的就是把容量特性和电压安全一起纳入评估而不是在网损最优的位置上硬装一个不安全、不合理的容量。4. 改进灵敏度算法容量扫描与电压安全联合评估4.1 核心思想从一条切线到一整条曲线改进灵敏度最直接的落地方式就是放弃“单点线性化”的思路改成对每个候选节点扫描一整条“容量-网损”曲线。具体做法是每个候选节点从 0 开始按固定步长逐步增加 DG 有功出力每加一档就重新算一次潮流记录网损和全网最低电压直到达到预设的最大容量或者触发电压越限或者潮流不收敛为止。这样每个节点都会得到一条完整的 Ploss-P 曲线和 Vmin-P 曲线。从曲线上能提取的信息远比一个斜率丰富最优容量在哪、收益区间有多大、容量超过多少会开始反向恶化、接入过程中电压是否安全。这些信息对规划决策特别重要。计算量在 IEEE33 上完全不是问题。33 个候选节点、每个节点扫 21 个容量点0~1MW、步长 50kW每个容量点一次前推回代总共也就几百次潮流计算Matlab 跑完在十几秒量级。对于规划研究来说这个代价完全可以接受。4.2 三个改进指标的数学定义与加权策略对候选节点 k定义以下三个指标平均灵敏度S_avg,k (Ploss(0) - min(Ploss_k(P))) / P*其中P*是最优网损对应的接入容量。这个指标反映“单位容量带来的平均降损收益”偏向小容量高收益节点。面积收益A_k ∫(Ploss(0) - Ploss_k(P)) dP积分区间从 0 到最大扫描容量。这个指标把整个收益区间都算进来更青睐容量消纳空间大、总收益高的节点。电压提升面积SV_k ∫(Vmin_k(P) - Vmin(0)) dP反映接入 DG 后全网最低电压的整体抬升幅度。由于三个指标量纲不同直接相加没有意义。我习惯先各自归一化到 [0,1]再做加权score w1*S_avg_norm w2*A_norm w3*SV_norm。权重按工程诉求调比如更看重降损的场合用[0.5, 0.3, 0.2]更看重调压的场合可以调成[0.3, 0.3, 0.4]。这个加权策略本身也是改进灵敏度里可以灵活扩展的一部分。4.3 Matlab核心实现容量扫描主循环下面是改进灵敏度的核心主循环直接在 IEEE33 数据上就能跑通。代码里把电压约束和潮流保护都包进去了。function result improvedSens(branch, Sload, candNodes, Pstep, Pmax, VminLim, VmaxLim) % 改进灵敏度容量扫描 电压安全评估 % candNodes: 候选节点列表 % Pstep: 容量扫描步长标幺 % Pmax: 最大扫描容量标幺 % VminLim, VmaxLim: 电压上下限标幺 [~, Ploss0] bfpowerflow(branch, Sload); Vmin0 min(abs(bfpowerflow(branch, Sload))); nCand length(candNodes); S_avg zeros(nCand,1); A_area zeros(nCand,1); SV_area zeros(nCand,1); for idx 1:nCand nd candNodes(idx); Pvals []; Ploss_vals []; Vmin_vals []; P 0; while P Pmax 1e-12 Sload2 Sload; Sload2(nd) Sload2(nd) - P; % 纯有功DG接入 try [V2, Ploss2] bfpowerflow(branch, Sload2); catch break; end % 电压安全校验越限立即终止扫描 if min(abs(V2)) VminLim || max(abs(V2)) VmaxLim break; end Pvals(end1) P; Ploss_vals(end1) Ploss2; Vmin_vals(end1) min(abs(V2)); P P Pstep; end if isempty(Pvals) continue; end [bestPloss, bestId] min(Ploss_vals); Pstar Pvals(bestId); S_avg(idx) (Ploss0 - bestPloss) / Pstar; A_area(idx) trapz(Pvals, Ploss0 - Ploss_vals); SV_area(idx) trapz(Pvals, Vmin_vals - Vmin0); result(idx).node nd; result(idx).Pvals Pvals; result(idx).Ploss Ploss_vals; result(idx).Vmin Vmin_vals; end % 归一化 加权 S_norm S_avg / max(S_avg); A_norm A_area / max(A_area); SV_norm SV_area / max(SV_area); score 0.5*S_norm 0.3*A_norm 0.2*SV_norm; % 按综合得分排序 [~, sortIdx] sort(score, descend); result(1).candNodes candNodes(sortIdx); result(1).score score(sortIdx); result(1).S_avg S_avg(sortIdx); result(1).A_area A_area(sortIdx); result(1).SV_area SV_area(sortIdx); result(1).Ploss0 Ploss0; result(1).Vmin0 Vmin0; end这个函数有几个刻意保留的设计。第一电压越限时直接终止扫描而不是跳过继续算因为工程上已经不安全了后面的容量点讨论价值不大。第二用trapz做积分避免了手写数值积分可能出现的端点误差。第三把原始指标和综合得分都返回出来方便后面只做排序对比而不被某一个加权方案绑死。5. IEEE33实测对比排序差异、曲线形态与电压验证5.1 实验设置与你需要关注的参数我做对比实验时候选节点取所有负荷节点也就是节点 2~33排除根节点 1。容量扫描步长取 50kW最大容量取 1MW电压约束设为 0.95~1.05pu。DG 先按纯有功模型处理功率因数为 1.0不讨论无功等后面扩展到无功规划时再换模型。传统灵敏度用小扰动 dp10kW 计算改进灵敏度分别输出平均灵敏度、面积收益、电压提升面积和加权综合得分四套排序。加权权重按降损优先场景取[0.5, 0.3, 0.2]。5.2 传统灵敏度与改进灵敏度的排序对比下面是 IEEE33 上典型结果的示意排序我的本地数据跑出来基本是这个格局不同文献数据版本会有细微位移但趋势一致排名传统灵敏度(10kW)平均灵敏度S_avg面积收益A综合得分score118182525217172424316333333433321818532161732这个表非常直观地暴露了传统灵敏度的问题它把末端轻载节点全部顶到前面但真正适合大容量接入的重载节点24、25反而排在后面。原因前面讲过末端节点在小扰动下网损斜率非常陡但它们容量空间小装多了就倒送。面积收益指标则把 24、25 这种“容量空间大、总收益高”的节点拉到了前面。综合得分是几个指标的折中但已经把 24、25 放进了前两名。5.3 三种典型节点的网损-容量曲线形态扫描过程中最值得看的是不同节点的 Ploss-P 曲线形态差异。我归纳为三类第一类节点 18 这种轻载末端节点。曲线非常陡地下降最佳容量小随后快速反弹整体像“V 型”。它的平均灵敏度极高但面积收益有限属于“窄带宽高增益”节点适合小容量分布式电源。第二类节点 25 这种重载分支末端节点。曲线下降平缓但持续区间很大最佳容量深整体像“U 型”面积收益很高属于“大容量稳健型”节点。大容量 DG 优先考虑这类位置。第三类节点 2 这种靠近根节点的节点。曲线几乎平着走接入 DG 对网损影响很小属于“低灵敏度型”。只在有特殊消纳需求时才会考虑。做规划时不能只看排名第一一定要把曲线形态一起看。否则很容易出现“选了最佳位置却配了不合适容量”的尴尬。5.4 电压安全验证改进到底改了什么为了直观展示改进的价值我在两组方案里做了电压对比。一组按传统灵敏度排名选择节点 18接入 500kW另一组按综合得分排名选择节点 25接入同样 500kW。结果趋势如下方案接入节点DG容量全网最低电压网损变化基态无0偏低基准传统方案18500kW抬升明显可能不降反升改进方案25500kW抬升平稳显著下降节点 18 接入 500kW 已经远超它的本地负荷多余功率沿馈线倒送网损反而可能恶化同时该节点电压被抬得很高靠近甚至超过上限。节点 25 本身有 420kWj200kvar 的负荷500kW 基本被本地消纳网损下降明显电压也相对安全。这个例子说明改进灵敏度不是“更精确地算同一个数”而是把“网损”和“电压安全”以及“容量适应性”放在同一个评估框架下避免了单一指标带来的决策偏差。6. 灵敏度计算的实现细节与常见坑6.1 DG模型、功率因数不同排序结论可能反转我在正文里默认了纯有功 DG也就是功率因数为 1。但实际工程项目中光伏逆变器和风机往往有功率因数要求常见的有 0.95 滞后、0.9 超前等。一旦加入无功出力DG 接入后的电流分布会发生改变网损变化和电压变化也会跟着变排序结果很可能整体变化。如果做规划研究我建议至少跑三组模型纯有功、功率因数 0.95 滞后、功率因数 0.95 超前看排序稳定性。如果某个节点在三种模型下都排在前面那才是真·优质节点。单组模型下的“第一名”有时候只是模型假设下的第一名。6.2 潮流不收敛保护容量扫描必须做的防御容量扫描最容易被忽略的坑是潮流不收敛。当某节点 DG 容量过大电压被抬得很高或者部分节点电压过低前推回代就可能震荡或发散。没有保护的话Matlab 会直接报错中断整个循环白跑。我在improvedSens函数里用了两层保护外面套try...catch一旦潮流函数抛错就终止当前节点扫描循环里加电压越限检查不满足安全约束也立刻终止。这两层防御在实际运行中非常管用。我在某个版本里把某个轻载末端节点的最大容量设到 1.5MW结果潮流直接发散就是靠这个保护兜住的。6.3 扫描步长与容量上限的确定思路容量扫描步长不是越大越好也不是越小越好。步长太粗最优容量定位不准步长太细计算量成倍增加而且相邻容量点的结果差异小到没有决策意义。我通常的做法是先按总负荷的 5%~10% 定一个粗步长比如 100kW初扫一遍找到最优容量的大致区间再以 10~20kW 步长细扫这个区间效率和精度都能兼顾。容量上限的设计要看研究目的。如果只做分布式电源选址上限取系统总负荷的一半左右足够观察到“过容量恶化”现象如果做高渗透率分析可以取到总负荷的 1~1.5 倍。但要注意上限越大潮流发散风险也越大电压越限保护必须跟上。6.4 负荷水平与数据版本对结果的敏感性还有一点容易被忽略灵敏度排序会随负荷水平变化。我在 IEEE33 上分别用 0.7 倍、1.0 倍、1.3 倍负荷做过测试同一节点的灵敏度排名会有明显移动。原因是负荷水平改变了基准运行点而灵敏度本质上是运行点的局部性质。所以做规划时最好不要只算一个负荷水平。一个稍微稳妥的做法是取几个典型负荷水平分别算灵敏度再做加权平均或者直接看每个节点在不同负荷水平下的排序稳定性。数据版本也一样不同文献里的 IEEE33 负荷数据有细微差异只要总负荷量级一致方法结论不会翻盘但具体排序会有小位移。汇报结果时把数据和权重说清楚比单纯报一个排名更有价值。7. 把改进灵敏度用起来多场景加权与算法配合7.1 多负荷场景加权灵敏度刚才提到灵敏度对负荷水平敏感对应的解法就是多场景加权。具体做法是在 0.7、1.0、1.3 倍负荷下分别做一次容量扫描得到每个场景的综合得分再按场景出现概率加权得到一个“全年等效”的灵敏度排序。这个思路在工程上很实用。比如某个区域峰谷差大重负荷时段短但重要就可以给高峰负荷场景更高的权重如果 DG 主要在白天出力而白天恰好是轻负荷时段那轻负荷场景的权重也要相应提高。改进灵敏度的框架天然支持这种扩展因为所有指标都是基于曲线积分得到的换场景只是多跑几轮循环的事。7.2 与群智能优化算法的搭配思路改进灵敏度除了直接给排序还能作为智能优化算法的预处理工具。粒子群、遗传算法这类方法在 DG 选址定容问题上很常用但如果直接在 33 个节点上随机搜索收敛慢不说还容易困在局部最优。我试过一种搭配方式先用改进灵敏度把所有节点排个序取前 10 个节点作为候选集再在候选集上用粒子群精确搜索容量配置。这样搜索空间一下子缩小一大半算法的收敛速度和稳定性都有明显改善。本质上是把专家经验灵敏度排序和全局搜索能力结合起来属于工程上很划算的取舍。最后说一点我个人的体会。改进灵敏度并不是要把传统灵敏度彻底否定。传统灵敏度计算快、实现简单、适合批量初筛在日常方案讨论里已经够用了但当 DG 容量越装越大运行方式越来越复杂时单点线性化的局限性就会暴露。容量扫描的思路虽然多算了几百次潮流换来的是对“装哪里”和“装多少”这两个问题的联合回答这才是规划决策真正需要的信息。我在实际项目里越用越觉得这类“多算一点、信息完整一点”的改进往往比追求更高深的数学方法更接近工程本质。如果你也在做配电网 DG 选址或者灵敏度分析相关的研究建议直接把文中的代码拿回去跑一遍再根据你的算例数据和工程目标调整指标权重这个过程本身就会让你对灵敏度理解得更深。