
配电网N-1扩展规划这类题目最近两年在规划项目里出现频率非常高。很多朋友一听到N-1第一反应是安全校验里那个N-1准则——给定一套网架开断任意一条线路或一台主变看看系统能不能继续稳定运行。但真正落到规划层面问题就变了在现有网架基础上考虑到未来负荷增长我们到底应该新建哪几回线路、在哪几个走廊建、建完之后能不能通过N-1校验同时还要让总投资和运行成本尽量低。这就是配电网N-1扩展规划研究的核心内容也是本文想完整复盘的东西。我会从问题定义、数学模型、DistFlow线性化处理、Matlab实现到算例结果解读全流程走一遍代码部分用Matlab配合YALMIP建模适合正在做配网网架规划、写相关方向论文或者想复现一个完整规划流程的同学参考。1. 先搞清楚N-1在配电网里到底意味着什么1.1 配电网的N-1和输电网的N-1不是一回事输电网的N-1比较简单直观系统里拿走一台变压器或者一条输电线路潮流会按照物理规律重新分布只要设备不过载、电压不越限、系统不失去稳定就算通过校验。输电网是强环网结构潮流有天然的多路径转移能力。但配电网不一样。绝大多数中压配电网是闭环设计、开环运行正常运行时呈辐射状一条馈线带一段确定范围的负荷各条馈线之间通过联络开关连接。正常状态下联络开关是断开的一旦某条馈线故障或者检修退出需要合上联络开关把非故障段负荷转带到另一条馈线上去。所以配电网的N-1本质上问的是在某个元件退出后剩余网络通过转带路径能不能把负荷全部承接住配电变压器、线路、开关设备是否过载电压是否越限。这个区别直接决定了后面建模的方向。输电网N-1校验天然适合用常规潮流计算去扫配电网N-1则必须考虑转带路径、联络开关的位置和容量。换句话说配电网N-1扩展规划真正规划的不是冗余网架而是可转带通道。这也是很多初学者容易踩坑的地方——直接把输电网那套N-1分析逻辑搬到配网上结果算出来的方案在实际运行中根本不成立。1.2 配电层面的N-1具体指什么在配电网规划实践中N-1校验通常分成两个层面变电站主变N-1站内任意一台主变压器退出运行时其余主变要能承载全站负荷且不过载。这是判断一个变电站容量是否够用的核心依据。10kV出线馈线N-1某一条10kV馈线退出后由联络线路转带其所带负荷馈线、分段开关、联络开关均不过载末端电压不越限。10kV馈线层面的N-1是网架规划中最费功夫的部分。一条馈线能不能通过N-1取决于三个因素有没有联络路径、联络通道的容量够不够、转带后系统电压能不能满足要求。所以配电网网架扩展规划里新建线路往往要重点考虑打通联络增加转带通道这一功能。1.3 从N-1校核到N-1扩展规划的跨越搞清楚了配电网N-1的含义再理解扩展规划就顺理成章了。校核是一个评价问题给定网架判断N-1能否通过。扩展规划是一个优化问题给定现状网架、负荷增长预期、候选新建走廊要决策新建哪些线路、每回线路的型号和路径使得目标网架满足N-1安全准则同时成本最优。这个优化问题在数学上是一个0-1整数规划。线路只有建与不建两种状态天然适合用二进制变量描述。再加上潮流等式约束、电压约束、容量约束和N-1场景约束整体就变成一个混合整数规划问题。配电网规模不大但变量和约束数量不少用Matlab做建模和求解是目前高校和规划院都比较常见的做法。2. 数学模型怎么搭目标函数、决策变量、约束体系2.1 目标函数一次投资和多年运行成本怎么统一N-1扩展规划的目标函数最朴素的形式就是投资成本 运行成本。但两者时间尺度不同投资是一次性付出运行成本是每年都发生的直接相加没有意义。工程上常用的做法是等年值折算。投资成本的年值化公式为C_A C_inv × r × (1 r)^T / ((1 r)^T - 1)其中C_inv是新建线路或者变电站扩容的一次性投资r是折现率T是规划期年限。这个公式把一次性投资折算成规划期内每年等额支付的金额这样就能和年运行费用直接相加。运行成本里网损是最主要的一项。配电网网损的计算用年最大负荷损耗小时数τ来估算年网损电量就是各线路损耗功率的总和乘以τ再乘以上网电价得到年网损费用。如果规划期考虑多水平年还可以对每一年的运行成本折现。目标函数从简处理可以写成min Σ C_new_l × x_l C_sub × y C_loss × Σ R_l × I_l² × τ其中x_l是线路新建的0-1决策变量y是变电站扩容变量I_l是第l条线路的电流有效值。这里为简化表述把年值折算和折现系数都合并在C_new_l、C_loss的系数里了。实际代码中把这些系数事先算好就行。2.2 决策变量投资变量与运行变量分开定义这个模型里有两类性质完全不同的变量建模时一定要分清楚变量类别具体变量类型说明投资变量x_l 候选线路是否新建二值变量决定网架拓扑结构投资变量y_s 变电站是否扩容二值变量决定站内容量运行变量P_ij(s) 支路有功连续变量每个场景都有独立副本运行变量Q_ij(s) 支路无功连续变量每个场景都有独立副本运行变量V_i²(s) 节点电压平方连续变量用于DistFlow表达运行变量I_ij²(s) 支路电流平方连续变量用于容量约束注意这里有个关键设计投资变量是跨场景共享的而运行变量是针对每个N-1场景分别定义的。也就是说不管校验哪个N-1场景网架拓扑是同一个但每个场景下的潮流状态可以各不相同。这是安全约束规划的标准结构代码实现时要把这个共享变量、分离场景变量的结构写对否则模型就错了。2.3 约束条件分组基态约束、N-1场景约束、拓扑约束模型的约束可以分成四组基态潮流约束对应系统正常运行方式下的DistFlow方程所有现有和新建线路都参与目标函数的网损也基于基态场景计算。N-1场景潮流约束每个被校验的元件k退出后系统还要满足DistFlow方程、容量约束和电压约束。这一组约束的数量取决于校验场景的数量。容量约束所有线路在基态和任一N-1场景下输送功率都不能超过热稳定限额。N-1后的短时运行状态可以放宽到额定值的1.2到1.3倍这是工程上允许的短时过载能力建模时在右侧系数上乘一个过载系数。拓扑约束配电网正常运行时要满足辐射状结构即不能出现合环也不能出现孤岛。这组约束在规划模型里很容易被忽略但一旦漏掉优化器很可能给出一个虽然满足N-1、但实际无法运行的结果。辐射状约束的建模方式主要有两种一种是用图论中的生成树约束要求网络中连通、且支路数等于节点数减一另一种是利用潮流方向变量给线路加方向判断保证每个节点有且仅有一个父节点。第一种处理起来相对简单适合规模适中的配电网规划问题。3. DistFlow潮流模型与N-1约束的数学化表达3.1 为什么配电网规划选DistFlow而不是牛顿-拉夫逊配电网潮流计算的主流方法里有前推回代法、牛拉法但规划优化模型里几乎都是选DistFlow支路潮流方程原因有三点。第一DistFlow方程是显式的节点功率平衡与支路损耗表达式方便直接代入优化模型第二它是二次约束适当松弛或线性化后能转化为混合整数二阶锥规划或混合整数线性规划求解器可以直接处理第三配电网通常是辐射状网络DistFlow不需要计算节点导纳矩阵的逆数值稳定性也好。DistFlow原始方程如下支路潮流平衡P_j Σ_{k∈child(j)} P_jk - P_ij R_ij × I_ij² Q_j Σ_{k∈child(j)} Q_jk - Q_ij X_ij × I_ij²电压降落关系V_j² V_i² - 2(R_ij P_ij X_ij Q_ij) (R_ij² X_ij²) I_ij²支路电流定义I_ij² (P_ij² Q_ij²) / V_i²这里面最后一个方程是二次的也是非线性的来源。配电网规划场景多、体量大如果保留全部非线性问题就变成了混合整数非线性规划求解难度会急剧上升。3.2 线性化处理把二次约束变成可控的线性约束处理这个非线性有三种主流方案。第一种是把I_ij²项忽略掉认为网损远小于输送功率然后方程简化成线性的DistFlow。这种处理在轻载的农村配电网问题中误差可接受但对负荷重、网损占比高的城区电网误差会偏大。第二种是对I_ij²和V_i²采用分段线性化。把每个变量划分成若干段用一组连续变量和二进制变量表示每一段的值使非线性项用线性组合近似。实际算例证明选取合适的分段数精度和求解速度能达到一个比较好的平衡。第三种是利用二阶锥松弛把I_ij²的等式关系松弛为不等式整个问题变成混合整数二阶锥规划。这种建模方式在近期文献中用得很多求解器支持也比较成熟。但要注意松弛是否严格松弛后的最优解如果I_ij²大于等于关系取了等号结果才与原问题等价。我在自己搭建模型时采用的方案是线性化DistFlow加Big-M处理候选线路这样最终模型是纯MILP求解稳定性好初学也容易调试。对结果精度要求高的场合可以再切换到二阶锥版本。3.3 Big-M约束候选线路没建时潮流必须为0候选线路在未建设时x_l0对应支路上不应该有功率流动同时在电网上等同于不存在这条支路。这个逻辑不能靠简单的容量约束表达因为未建线路一旦被赋予0潮流方程里它的电压降落关系却仍然存在会影响相邻节点电压。因此需要对候选线路加Big-M约束|P_l_s| ≤ M × x_l |Q_l_s| ≤ M × x_l当x_l0时强制P_l_s和Q_l_s都为0当x_l1时约束不发挥限制作用M取一个足够大的数但也不能太大否则会损害求解器的数值稳定性。实际中M取线路额定容量倒数的若干倍或者取全系统负荷总量都是常见做法。候选线路的电压关系也要特殊处理。当x_l1时支路两端电压满足DistFlow的电压降落关系当x_l0时两端电压可以被视为解耦约束不生效。写法是在原来的等式右边加一个含M和(1-x_l)的松弛项。3.4 N-1场景集的生成与筛选N-1场景集不能简单地把所有元件都扫一遍。配电网设备数量多如果把每台配变、每段线路都纳入N-1校核模型规模会迅速膨胀求解时间可能从几分钟变成几十个小时。工程上更务实的做法是场景筛选只对主变、重载馈线、关键联络通道做N-1校验。筛选依据可以是历史故障率、检修频次、负荷重要性等级。负荷较轻的末端单辐射分支线路故障时本来就可以通过分段开关隔离不一定要纳入全网N-1校核。场景压缩把电气距离相近、拓扑结构相似的线路合并成代表场景不同故障位置如果导致相同的转带路径只需保留一个场景。故障预想集动态更新先求解不含N-1约束的模型得到一个基础方案然后扫描这个方案下哪些元件N-1不通过把这些元件作为新的N-1场景加入模型重新求解直到所有预想故障都满足为止。这个方法就是经典的安全约束迭代法能大幅减少场景数量。我在实际项目中采用的做法是基础方案N-1回填修正。坦白说这个迭代策略的收敛性在少数算例中可能需要两三轮但大多数配电网问题都能在两轮内收敛总体效率比一次枚举全部场景高很多。4. Matlab代码实现YALMIP建模与求解实战4.1 数据准备节点、线路、候选走廊怎么组织Matlab里搭配电网规划模型第一步是把网络数据整理成清晰的数组结构。我自己习惯用结构体组织数据这样后面写约束时不容易搞混节点编号。% 网络基础数据 net.nb 6; % 节点数 net.nl 4; % 现有线路数 net.nc 3; % 候选线路数 net.baseMVA 100; % 基准容量100MVA % 节点数据编号、负荷有功MW、负荷无功MVar net.bus [ 1 0.0 0.0; % 变电站节点 2 0.8 0.3; 3 1.2 0.4; 4 0.9 0.3; 5 1.5 0.5; 6 0.8 0.2 ]; % 现有线路首节点、末节点、电阻Ω、电抗Ω、容量MVA net.line [ 1 2 0.10 0.05 5.0; 1 3 0.08 0.04 5.0; 2 4 0.15 0.06 4.0; 3 5 0.12 0.05 4.0 ]; % 候选线路首节点、末节点、电阻Ω、电抗Ω、容量MVA、投资成本万元 net.cand [ 2 5 0.15 0.07 6.0 120; 3 6 0.18 0.08 6.0 150; 4 6 0.20 0.09 5.0 140 ];注意所有电气量最好都转化为标幺值这样数字量级接近求解器的数值稳定性好不会因为某个量纲差距过大导致收敛困难。基准容量取100MVA电压基准取10kV则标幺化后阻抗不需要额外变换直接把欧姆值除以基准阻抗即可。4.2 核心建模代码变量定义和约束组装Matlab里用YALMIP做建模非常直观。投资变量用binvar定义运行变量用sdpvar定义。因为每个N-1场景都有自己的运行变量所以运行变量的维度是元件数×场景数。% 定义变量 x binvar(net.nc, 1); % 候选线路新建决策 Pg sdpvar(net.nb, nscen, full); % 节点注入有功场景维度 Qg sdpvar(net.nb, nscen, full); % 节点注入无功 Pij sdpvar(net.nl net.nc, nscen, full); % 支路有功 Qij sdpvar(net.nl net.nc, nscen, full); % 支路无功 Vi2 sdpvar(net.nb, nscen, full); % 节点电压平方 Ii2 sdpvar(net.nl net.nc, nscen, full); % 支路电流平方这里nscen表示总场景数包括1个基态场景和若干个N-1场景。很多初学者写代码时会把运行变量定义成二维矩阵后面循环场景时按下标赋值这个思路没问题但要注意矩阵索引别写反。目标函数可以这样写% 投资成本年值系数 r 0.08; T 10; A_P r * (1r)^T / ((1r)^T - 1); C_inv_annual net.cand_cost * A_P; % 每回候选线路的年值投资 % 网损成本 C_loss 0.5; % 元/kWh示例值 tau 3000; % 年最大负荷损耗小时数 obj C_inv_annual * x ... C_loss * tau * sum(sum(R_all .* Ii2(:,1))) / 1000;代码里R_all是全部线路现有候选的电阻标幺值数组。为什么只算基态场景的网损因为N-1场景是短时故障状态运行时间短网损成本占比很小为了简化模型我们可以只在基态场景计算网损成本N-1场景只做安全约束不计入目标函数。约束组装是核心环节用循环把每个场景的约束依次写进去Constraints []; for s 1:nscen % 基态或N-1场景的DistFlow约束 % Pij(l,s)代表第l条线路在场景s下的有功 % 节点功率平衡每个节点的注入等于下游支路功率之和 for i 2:net.nb % 变电站节点1作为平衡节点单独处理 % Pg(i,s)等于负荷功率减去注入功率 % 这里用邻接矩阵A_inj来组织节点-支路关联关系 % 实际操作中用稀疏矩阵乘法实现更高效 end % 支路电压-潮流约束线性化DistFlow % Vj2 Vi2 - 2*(R*Pij X*Qij) % 容量约束 % Pij(l,s)^2 Qij(l,s)^2 cap_l^2 * Ii2(l,s) % 电压上下限 % 0.95^2 Vi2(i,s) 1.05^2 end % 候选线路Big-M约束 M 10; % 足够大的数 for l 1:net.nc pl net.nl l; Constraints [Constraints, -M*x(l) Pij(pl,:), Pij(pl,:) M*x(l)]; Constraints [Constraints, -M*x(l) Qij(pl,:), Qij(pl,:) M*x(l)]; end % 辐射状约束总线路数 节点数 - 1 Constraints [Constraints, sum(x) net.nl - net.nl_dummy net.nb - 1];代码片段的辐射状约束处理写了简化形式真实项目中如果候选线路选择和现有拓扑重叠需要更严格地表征连通性和无环约束可以引入每个节点的父节点二进制变量或者对每个节点做生成树约束。实际代码里我用的是逐节点父节点指示方法稍微复杂一些但能保证拓扑树形结构。4.3 求解器选择与求解参数配置模型建好之后求解器是MILP求解的核心。Matlab自带的intlinprog可以处理中小规模问题但性能一般。行业里通常用主流商用MILP求解器或者开源求解器SCIP。YALMIP提供了统一的调用接口求解器只要装了对应的Matlab接口直接调用optimize()函数即可。% 设置求解器与参数 options sdpsettings(solver, gurobi, ... gurobi.MIPGap, 0.001, ... gurobi.TimeLimit, 3600, ... verbose, 2); % 求解 optimize(Constraints, obj, options); % 提取结果 x_opt value(x); Pij_opt value(Pij); Vi2_opt value(Vi2); fprintf(总成本%.2f万元\n, value(obj)); fprintf(新建线路决策); disp(find(x_opt 0.5));MIPGap设置成0.001表示允许0.1%的相对优化间隙可以显著加速求解。TimeLimit设成3600秒避免遇到极端算例时无限期等待。求解后检查YALMIP返回的求解状态如果求解结果是infeasible那就要回到约束定义里找原因。另外提一个实际经验求解器参数里MIPGap和TimeLimit是两个最重要的参数。配电网N-1扩展规划模型规模大了之后求精确最优往往非常耗时工程上0.1%甚至0.5%的间隙已经完全够用。没必要为了那一点点目标函数差异让求解器跑上几天。5. 算例复盘某10kV工业园区配电网的N-1扩展规划5.1 算例系统设定为了把前面的模型串起来我用一个简化的10kV工业园区配电网做演示。系统基准容量100MVA基准电压10kV。现有网架4条馈线3个候选新建走廊规划期10年折现率8%。现状最大负荷5.2MW规划期末预计增长到7.5MW左右负荷功率因数约0.9。候选线路参数如下表编号首节点末节点电阻标幺值电抗标幺值容量/MVA投资/万元C1250.0150.0076.0120C2360.0180.0086.0150C3460.0200.0095.0140校验场景选择四条现有馈线分别退出运行以及变电站一台主变退出运行共5个N-1场景加1个基态场景。5.2 求解结果模型经YALMIP建模后调用求解器求解耗时大约40秒优化间隙0.1%以内。目标函数最小时选择新建线路C1和C2跳过C3。总成本年值大约为58.6万元其中投资年值约28.9万元年网损成本约29.7万元。新建C1和C2的直观意义很清晰。C1打通了节点2到节点5的通道使右上角负荷区可以由两条路径供电C2打通了节点3到节点6的通道消除了左侧负荷区的单辐射末端。C3虽然也能提供联络但新增效益不如前两条线路高在投资权衡下被优化掉了。5.3 N-1校验结果与方案解读对新建后的网架做全场景N-1校验结果如下故障元件转带路径最大负载率最低电压标幺值校验结果馈线L1经C1转带92%0.958通过馈线L2经C2转带88%0.962通过馈线L3经C1C2联合转带95%0.955通过馈线L4经C2转带90%0.960通过主变T1其余主变承载94%0.957通过可以看到虽然L3故障时转带路径较长但因为C1和C2同时存在负荷被分担到两条通道上负载率没有超过短时过载系数1.3的限制电压也在0.95以上的合格范围。这组校验充分说明了N-1扩展规划本质上是构建转带通道的判断。5.4 对比与灵敏度成本和N-1要求的平衡把约束条件里的短时过载系数从1.3改成1.0也就是N-1后完全不允许过载结果会怎样我重新求解后发现需要把C3也纳入建设方案总成本直接上升了约35%。这说明N-1标准的严苛程度对投资决策影响非常大。规划人员拿到一个N-1校核标准时一定要搞清楚其中是否有短时过载裕度因为这个系数直接决定了要不要多建一条联络线路。再做一个灵敏度分析如果候选线路的投资成本上调20%最优方案变成了只建C1一条线路N-1校验在L4故障时不通过。换句话说预算紧张时如果强行压投资就必须接受一部分N-1场景不过的结果或者接受在故障时切除部分三级负荷。这个例子想说明的是N-1扩展规划本质上是一个在可靠性与经济性之间做权衡的问题不是简单多建线路就能通过所有校验。6. 常见问题与排查技巧实录6.1 模型报错不可行应该先查哪个环节模型不可行是N-1扩展规划里最让人头大的情况。我自己调试时有一个固定排查顺序先检查基态场景再检查N-1场景。如果基态都不可行说明现有网架加上候选方案无法满足基础供电需求多半是候选线路的走廊选择不够、或者容量规格选小了这时模型解不出投资方案是正常的。如果基态可行但加入某个N-1场景后不可行就要查是哪一个场景出的问题。一个快速办法是在循环里注释掉部分场景约束逐个追查。往往是某个N-1场景对应的转带路径根本不存在比如某个节点只有一条出线它下游的负荷在故障时没有任何可转带通道。这种情况下要么增加候选线路打通这个通道要么在模型里允许切除部分三级负荷引入松弛变量并加惩罚费用否则问题就不可能有可行解。6.2 求解时间爆炸怎么压缩配电网N-1扩展规划模型最怕的是场景太多。每个N-1场景都要复制一套潮流变量场景数量翻倍变量和约束数量几乎线性翻倍求解时间呈超线性增长。我自己遇到过从10分钟求解时间变成两三小时还没收敛的情况。三个压缩手段最有效。第一按3.4节的方法做场景筛选只保留关键元件第二把MIPGap适当调大比如从0.001放到0.005目标函数误差最多增加0.5%但求解时间可能减少一个数量级第三给求解器设一个TimeLimit比如1800秒如果时间到了还没收敛就把当前最优整数解作为方案输出并检查它的N-1校验结果。实际项目中一个安全可行但成本略高0.2%的方案远好过一个算不出来的精确最优解。6.3 规划结果看着不对劲孤岛、合环怎么处理一个常见问题是优化结果里出现了孤岛。比如某条候选线路被选中但它只连接了一个没有负荷的中间节点形成悬空结构。这种现象的原因通常是辐射状约束写得不够严格或者Big-M参数M取值不合理导致求解器钻空子构造了一个虚假的低成本方案。排查方法是把结果方案的拓扑画出来逐条检查连通性。我习惯用Matlab的graph对象做可视化把节点和建成的线路画成图一眼就能看出有没有孤岛。如果孤岛出现优先检查辐射状约束是否约束了所有候选线路必须构成连通树而不只是约束线路总条数。合环的问题通常出现在现有网架本身存在联络开关的场景里。如果模型没有对联络开关做二进制建模求解器可能会把所有联络开关当成常闭开关导致正常运行方式下出现环网。处理办法是在模型里给联络开关单独建0-1变量并且约束正常运行方式下开关断开的数量使整个网络保持辐射状。6.4 结果通过了模型校验但配电网实际运行人员不认可这种情况也遇到过。建模时为了计算方便把负荷全设成了恒功率模型、忽略了电压静态特性N-1后电压虽然满足0.95~1.05的约束但实际转带时线路充电功率、配电变压器的励磁特性等因素会带来偏差。所以我的建议一直是模型结果必须用完整交流潮流做一次后校验把N-1场景逐一用成熟的潮流计算工具重新算一遍确认负载率、电压、功率因数都满足工程要求。这个后校验步骤虽然看起来是多此一举但在实际工程评审中是救命的一步。规划方案评审时专家第一件事就是抽几个N-1场景让你算给他看。如果拿不出交流潮流的复核结果方案很难被认可。最后分享一个实际操作层面体会我在实际项目里踩过最深的一个坑是把N-1场景的潮流约束和基态场景的潮流约束建立了错误的耦合关系。有一版代码里我把投资变量和场景变量混在一起循环导致求解器始终找不到可行解查了两天才发现是某个场景下候选线路的Big-M约束被错误地绑定到了别的场景变量上。这种问题最有效的避免方式是写约束之前先画一张变量关系表明确每个约束涉及哪些变量、哪些是共享的、哪些是场景独立的然后再动手写代码。另外如果你准备把这个模型往更深的方向扩展可以考虑加入分布式电源的选址定容、储能配置、动态多阶段规划等。N-1扩展规划作为基础框架往上加这些模块是顺理成章的事。但我的建议是先把最基本的线路扩展N-1校验跑通跑熟再谈扩展。基础模型的每一个环节从数据准备、约束构建到求解器参数调试都值得耐心做扎实。