尧图网站设计 尧图网站设计YAOTU DESIGN
ARTICLE DETAIL

资讯详情

深耕网站设计与一线实操的经验洞察。

配电网N-1扩展规划:从数学模型到Matlab工程实践全解析

配电网N-1扩展规划:从数学模型到Matlab工程实践全解析 配电网N-1扩展规划这个课题我前后做过好几个版本从最开始照着论文抄模型、三天两头求解器报错到后来能把整个建模、求解、校验流程跑顺中间踩过的坑确实不少。这项目核心说穿了就一句话在现有配电网骨架上未来负荷涨了要在哪些走廊新建线路、新建设备花最少的钱同时保证任意一台变压器或一条馈线出故障退出运行后剩下的网还能把所有用户的电供上——后者就是N-1准则。这个准则看着简单真要把它揉进一个优化模型里约束怎么列、场景怎么枚举、求解怎么不炸每一步都有讲究。这篇文章我把整个项目的完整思路和Matlab实现方案从头到尾捋一遍包括数学建模、约束构建、代码框架、求解器选型、算例测试和常见坑点适合正在做配电网规划方向毕业设计的学生、刚接触电网规划的年轻工程师以及对电力系统优化建模感兴趣、想在Matlab里跑通一个完整规划案例的朋友。看完你至少能知道N-1扩展规划问题长什么样、怎么把它写成可求解的数学规划模型、代码怎么组织、以及模型解不出来的时候该往哪个方向排查。1. 项目概述与核心问题拆解1.1 配电网规划到底在规划什么配电网是电力系统里离用户最近的一环通常指从变电站低压侧到用户电表之间的网络电压等级一般是10kV、20kV或者35kV。跟输电网那种网状结构不同配电网在正常运行时基本都是辐射状结构——也就是从变电站出发一条馈线像树杈一样往各个方向分叉电能单向地从电源流向负荷。这种结构的好处是保护配置简单、故障隔离容易、短路电流小坏处是供电可靠性天然就比环形网弱一些。配电网规划要回答的问题本质上是未来若干年负荷涨了之后电网该往哪个方向扩建、怎么扩建。具体拆开看有几个层次变电站规划在哪儿新建变电站、主变容量选多大、什么时候投运。网架规划在哪些走廊新建线路、用什么截面导线、是否需要新增联络开关。无功规划在哪儿配置无功补偿装置保证电压质量。本文做的N-1扩展规划属于网架规划和变电站规划的交叉范畴。它的输入是现有网络拓扑、现有设备容量、未来负荷预测结果以及一组候选的扩建项目新建线路、新增主变等输出是一组最优的扩建决策。所谓“最优”在工程里从来不是单目标的。最直观的目标肯定是投资成本最小但只盯着投资又会出问题——你全都用细导线投资是省了线损大、电压降得厉害N-1校验也大概率过不了。所以实际项目中目标函数要同时考虑投资成本和运行成本主要是网损有时还会把停电损失折算进去。本文的方案以投资成本年网损费用为主要目标这也是国内配电网规划项目里最常用的口径。1.2 N-1准则的工程含义N-1准则我打个比方你就懂了。假设你办公室有4台打印机正常情况下4台同时工作。有一天其中1台坏了要维修剩下的3台还能正常完成打印任务不影响大家办公——这就叫满足“N-1”这里的N是设备总数4N-1就是任意坏了1台之后剩下的N-1台仍然能扛住所有需求。放到配电网里所谓N-1校验就是系统中的N个元件馈线、主变等中任意一个发生故障退出运行后在不采取任何额外操作或者仅通过备用电源自动投入的情况下系统仍能保持正常供电不造成负荷损失。这个校验是电网安全稳定运行的底线要求在配电网规划里通常要求规划方案通过所有的N-1预想故障校验。但这里有一个关键区别值得说清楚输电网的N-1更关注系统稳定性和潮流转移后不过载配电网的N-1更多关注的是能不能通过转供恢复供电。配电网本身是辐射状网一条馈线坏了下游负荷就失去电源了唯一的补救思路是通过联络线把负荷转移到相邻馈线上。所以配电网的N-1校验本质上是在问任意一条馈线或主变出故障之后剩下的网能不能通过合联络开关把失电负荷全部转出去同时转供路径上的线路和主变都不超过额定容量。这背后的工程含义是配电网要做N-1就不能是纯辐射状、纯“树”的结构必须预留联络通道形成“手拉手”供电模式。这也是为什么规划模型里除了新建线路本身还要考虑联络线、分段开关这类设备。很多初学者一开始不懂这个建模时只加线路容量约束结果解出来的方案N-1一校验就崩——我后面会专门讲这个问题。2. 数学建模把工程问题变成可求解的模型2.1 决策变量与目标函数配电网扩展规划问题可以建模为一个混合整数线性规划MILP问题。为什么是MILP因为里面既有连续变量潮流、电压又有整数变量线路投建的0-1决策变量、变压器扩容的0-1决策变量。MILP问题理论上可以用分支定界法精确求解工程上借助成熟的商业求解器Gurobi、CPLEX等在中小规模配电网规划问题上求解速度和稳定性都是可以接受的。先定义决策变量线路投建变量0-1表示候选走廊上是否新建线路。主变投建变量0-1表示候选主变是否新建。连续变量正常运行时各节点注入有功/无功功率、线路潮流、节点电压幅值或电压降。故障场景变量在N-1预想故障场景下各线路的转供潮流、各节点是否失电0-1。目标函数一般写成最小化总费用 新建线路投资年化费用 新建主变投资年化费用 年网损费用 可选停电损失费用投资费用为什么要“年化”因为新建设备的投资是一次性发生的但规划周期通常是多年比如规划水平年到第10年为了跟每年都发生的运行费用可比要把一次性投资按等年值法折算成每年分摊的费用。等年值公式是A P × r × (1r)^n / [(1r)^n - 1]其中P是设备投资现值r是折现率n是设备使用年限。举个例子一段新建线路投资200万元折现率8%使用年限30年那么年化分摊费用就是200 × 0.08 × 1.08^30 / (1.08^30 - 1) ≈ 17.76万元/年。这个数以后在目标函数里跟年网损费用一起相加才有意义。年网损费用的计算在规划问题里一般不用精确的潮流迭代而是用线性化网损或者固定网损率来近似。简化处理可以在DCOPF框架下把网损写成线路潮流的二次函数再做分段线性化更粗糙一点的工程做法直接按年最大负荷损耗小时数乘以峰值网损再折算电费。本文的案例用的是分段线性化近似精度足够又保持模型线性。2.2 约束条件的构建约束条件是这个项目里最繁重、也最考验建模功底的部分。缺一条约束解出来的方案可能在工程上根本没法用多一条约束求解时间又可能成倍增加。我按类别逐一说明。第一类是节点功率平衡约束。这个是所有电网优化模型的地基。对每个节点注入功率等于流出功率加上负荷。在辐射状配电网里如果采用DistFlow模型功率平衡可以写成递归形式。DistFlow模型的基本形式是P_j sum(P_jk) P_load_j Q_j sum(Q_jk) Q_load_j其中P_j是节点j的上游馈入功率P_jk是节点j流向子节点k的功率P_load_j是节点j处的负荷有功。这个模型天然适配配电网的辐射状结构而且可以通过线性化忽略网损项或者用近似值转成线性约束。第二类是线路容量约束。每条线路的潮流不能超过该线路的热稳定极限容量。对新建线路容量极限取决于选择的导线截面对已有线路容量极限是已知参数。这个约束要用到Big-M方法——如果某条候选线路没有投建决策变量为0那么它的潮流应该被强制置为0如果投建了决策变量为1则潮流可以在容量范围内自由。写成数学形式就是-P_max × x P_line P_max × x其中x是0-1投建变量P_max是线路容量上限。这个约束看着简单但Big-M值这里就是P_max如果选得不够大会把最优解的可行域给切掉选得太大又会松弛得太狠导致分支定界效率下降。经验取值是取线路容量的1.1到1.3倍。第三类是电压约束。配电网的电压质量是硬指标一般要求节点电压在额定值的±7%或者±5%以内具体看当地导则。在DistFlow线性模型里节点电压降与线路潮流的关系可以写成线性约束V_i - V_j (r_ij × P_ij x_ij × Q_ij) / V0这里V0是额定电压r_ij和x_ij是线路电阻和电抗。这个式子的物理含义很直观——电流流过线路阻抗产生压降电压降的大小跟有功、无功在阻抗上的分量有关。简化处理时把分母的V0当常数一般取10kV或20kV整个式子就是线性的。第四类是辐射状运行约束。这是配电网跟输电网最大的区别。输电网是环网运行配电网正常运行时必须保持辐射状——否则保护整定会乱套。在规划模型里要保证最终解出来的网络是一个树状结构。数学上最常用的办法是“单商品流约束”sum(y_ij) N_bus - N_substation其中y_ij是线路的“存在”状态变量包括已有线路和新建线路N_bus是节点总数N_substation是变电站节点数。这个约束的含义是对于N个节点的网络树结构恰好有N-1条边而变电站作为电源根节点不参与这个等式。这个约束单独还不足以保证辐射状因为有可能解出一个“带环的树”——边数对但存在子环。所以要再加一条无环约束常用的有方向性约束或者逐环破环法我代码里用的是基于节点-父节点关系的单商品流约束这个在后面代码部分细讲。第五类是N-1安全约束。这是本文的重头戏单独开一节说。2.3 N-1故障场景的处理N-1约束怎么建模是整个项目里最核心、也最容易出错的地方。先说思路N-1扩展规划意味着每一个预想故障场景下系统都得满足安全和供电约束。所以最朴素的做法是把每个故障场景当成一个独立的“运行状态”去建模所有场景共用一个投资决策变量但潮流变量、电压变量、转供路径变量都是场景独立的。具体展开是这样场景0正常运行状态所有设备都在。场景kk1,2,...,K第k个元件馈线或主变故障退出运行。对于每个场景k都要满足潮流约束、电压约束、容量约束和负荷供应约束。负荷供应约束的意思是sum(供电路径上的容量) 场景下的总负荷或者更精细一点用0-1变量表示每个节点在场景k下是否失电并且令这个失电变量在故障场景下尽可能为0通过目标函数惩罚或者硬约束。这个做法的好处是模型严密缺点也很明显——约束数量会随着故障场景数量线性增长求解规模急剧膨胀。一个33节点的系统如果候选故障集有50个场景每个场景的潮流约束又有一两百条总约束轻松上万。对MILP求解器来说规模大了之后分支定界树会爆炸求解时间让人抓狂。所以实操中我通常会做两个层面的简化第一个简化是“只校验、不优化”的分层迭代法。具体做法是先在不加N-1约束的情况下求一个基础规划方案然后对这个方案做N-1逐场景校验——把任意一条线路断开看剩下网络能否通过转供把负荷送出去、有没有线路过载。如果某个场景校验失败就把这个失败场景对应的约束这个场景下的转供潮流上下限约束加入主模型重新求解。如此循环直到所有场景都通过校验。这个思路相当于“割平面法”工程上非常好用因为大多数场景天然是能通过的你不需要一开始就把50个场景全塞进模型里通常两三轮迭代就能收敛。第二个简化是合理筛选预想故障集。不是所有元件都值得做N-1校验——一条末端只有两个用户的支路断开它对全网几乎没影响却要白白增加一组约束。一般做法是只对主干馈线、主变和关键联络线做N-1校验或者按元件所带负荷大小排序累计负荷占比超过90%的元件才纳入故障集。3. Matlab实现与技术选型3.1 为什么选择Matlab YALMIPMatlab在电力系统研究领域的地位不用多说高校的电力系统分析教材、科研论文里的算例十有八九都是Matlab写的。但单靠Matlab自带的功能做优化建模是不行的需要搭配建模工具箱。我这里用的是YALMIP一个由Lund大学开发的免费MATLAB建模工具箱它最大的价值在于把模型描述和求解器解耦——你用统一的语法定义变量、约束和目标函数然后选择底层求解器去算。YALMIP支持的求解器很多线性规划有linprog、Cplex、Gurobi、Mosek混合整数规划有Cplex、Gurobi、intlinprog等。我实际项目中Gurobi用的最多性能基本是业界标杆学生党没有Gurobi授权也可以用Cplex学术版或者直接用MATLAB自带的intlinprog顶一顶——后面我测试过33节点的小案例intlinprog也能跑只是速度慢一些。选YALMIP还有个好处是它对模型的表达可读性好。你可以直接用数学表达式的形式写约束比如“P_line P_max * x”就直接写成这样不用去自己拼矩阵稀疏结构。对于搞电力系统的人来说这一点太友好了因为约束里有很多下标、集合、条件判断用YALMIP这种代数方式描述不容易犯坐标错位的毛病。3.2 整体代码架构设计整个项目的Matlab代码我按四个模块来组织每个模块一个脚本或函数职责分离调试起来不会一头雾水数据输入模块input_data.m定义节点、线路、主变、负荷、候选走廊、成本参数、折现率等。模型构建模块build_model.m用YALMIP定义决策变量、目标函数、约束条件支持一次性构建全部N-1场景约束也支持分层迭代方式。求解与结果输出模块solve_and_report.m调用求解器求解整理结果输出规划方案、总费用、各项成本明细。校验与分析模块verify_n1.m对求解得到的规划方案做独立的N-1逐场景校验确认方案确实满足N-1要求。这种模块化的思路对调试特别有利。我一开始也是把所有代码堆在一个大脚本里后面模型一复杂参数一改跑出来的结果不对都不知道是数据错了还是模型错了。拆成模块之后每个环节可以单独验证——先检查数据合理性再检查模型规模最后才看求解结果。3.3 核心代码实现实战直接上代码。以下是最核心的模型构建部分我用YALMIP语法写。%% 数据定义示例IEEE 33节点简化系统 % 节点参数 bus_load [0; 100; 90; 120; 60; 60; 200; 200; 60; 60; 45; ... 60; 60; 120; 60; 60; 60; 90; 90; 90; 90; 90; ... 90; 420; 420; 420; 60; 60; 60; 120; 200; 200; 200]; % 各节点负荷(kW) % 已有线路 [起点 终点 阻抗R(ohm) 电抗X(ohm) 容量(kVA)] line_exist [ 1 2 0.0922 0.0470 400; 2 3 0.4930 0.2511 400; % ... 省略中间线路 ]; % 候选线路走廊 [起点 终点 单位阻抗 电价估算投资(万元/km) 可选截面容量] line_cand [ 6 7 0.3660 55 500; 15 16 0.3810 55 500; % ... ]; %% 模型构建 % 定义决策变量 x_new binvar(n_cand, 1); % 候选线路是否投建 (0-1) P_flow sdpvar(n_line, K1); % 各场景下线路有功潮流 Q_flow sdpvar(n_line, K1); % 各场景下线路无功潮流 V_sq sdpvar(n_bus, K1); % 各场景下节点电压平方 theta_s binvar(n_bus, K1); % 各场景下节点是否失电 (1失电) % n_line 已有线路数 候选线路数 % K 预想故障场景数1 表示正常运行场景 % 目标函数投资年值 网损年费用 inv_cost sum(x_new .* line_cand_cost_annual); % 各候选线路年化投资 loss_cost sum(sum(P_flow .^ 2 .* R_line)) * loss_price * hours_per_year; Objective inv_cost loss_cost; % 约束集 Constraints []; % 线路潮流-投建状态耦合约束含Big-M M 600; % Big-M值略大于线路容量上限 for k 1:K1 for i 1:n_line if is_candidate(i) Constraints [Constraints, -M*x_new(idx_new(i)) P_flow(i,k) M*x_new(idx_new(i))]; Constraints [Constraints, -M*x_new(idx_new(i)) Q_flow(i,k) M*x_new(idx_new(i))]; else Constraints [Constraints, -P_max_exist(i) P_flow(i,k) P_max_exist(i)]; Constraints [Constraints, -Q_max_exist(i) Q_flow(i,k) Q_max_exist(i)]; end end end % 节点功率平衡约束线性DistFlow近似 % 遍历每个节点父线路潮流 所有子线路潮流之和 该节点负荷若不失电 for k 1:K1 for i 1:n_bus parent_lines find(line_from i); child_lines find(line_to i); Constraints [Constraints, ... sum(P_flow(parent_lines, k)) - sum(P_flow(child_lines, k)) ... (1 - theta_s(i,k)) * bus_load(i) / 1000]; end end % 电压降约束线性化DistFlow V0_sq 10.5 * 10.5; % 额定电压平方 for k 1:K1 for l 1:n_line i line_from(l); j line_to(l); Constraints [Constraints, ... V_sq(i,k) - V_sq(j,k) (R(l)*P_flow(l,k) X(l)*Q_flow(l,k)) / V0 * 2 M*(1-y_line(l,k))]; Constraints [Constraints, ... V_sq(i,k) - V_sq(j,k) (R(l)*P_flow(l,k) X(l)*Q_flow(l,k)) / V0 * 2 - M*(1-y_line(l,k))]; end % 电压幅值限制 Constraints [Constraints, 9.5^2 V_sq(:,k) 10.7^2]; end这里有个细节要说明y_line(l,k)表示线路l在场景k下是否投运/可用。对于已有线路正常运行场景下y1故障场景下如果这条线路就是故障元件则y0如果故障的不是这条线路则y1。对于候选线路y就等于对应的投建决策变量x_new。这个逻辑初看绕却是N-1建模的枢纽——它把故障对网络拓扑的影响通过一个随场景变化的线路可用性变量传递进去。辐射状约束我用的是基于“单商品流”方法人为定义一个虚拟的“流”从变电站出发每个节点消耗单位流量线路的最大输送流量设一个极大值。如果网络不是连通的树状结构这个虚拟流就找不到可行解从而在数学上强制了辐射状。% 辐射状约束单商品流方法 f_aux sdpvar(n_line, 1); % 辅助流变量仅正常运行场景需要 M_aux 1e5; % 辅助流上限 % 节点流量平衡变电站注入N-1其他节点消耗1 for i 1:n_bus if is_substation(i) Constraints [Constraints, ... sum(f_aux(parent_lines_idx)) - sum(f_aux(child_lines_idx)) n_bus - n_sub]; else Constraints [Constraints, ... sum(f_aux(parent_lines_idx)) - sum(f_aux(child_lines_idx)) 1]; end end % 只有投运的线路才能承担辅助流 for l 1:n_line if is_candidate(l) Constraints [Constraints, -M_aux*x_new(idx_new(l)) f_aux(l) M_aux*x_new(idx_new(l))]; else Constraints [Constraints, -M_aux*y_exist(l) f_aux(l) M_aux*y_exist(l)]; end end这段代码的理解门槛主要在于“辅助流”不是真实的电流而是一个数学技巧它强制网络中每个非电源节点都有且仅有一条来自上游的“父线路”从而杜绝了环网的出现。你可以把它想象成给这个树形网络规定了一个“水流方向”——从变电站这个源头流向每个叶子节点中间不能有分叉合并成环的路。变压器扩容约束类似因为篇幅这里不展开思路跟线路投建约束一致。3.4 求解配置与性能调优模型构建好之后求解环节有几个重要参数值得写一下。我用的求解器是Gurobi通过YALMIP调用。常用的求解参数设置如下% 求解设置 ops sdpsettings(solver, gurobi, ... verbose, 2, ... gurobi.TimeLimit, 600, ... gurobi.MIPGap, 0.01, ... gurobi.Presolve, 1, ... gurobi.NumericFocus, 1, ... showprogress, 1); % 求解 sol optimize(Constraints, Objective, ops);这里TimeLimit设成600秒是防止模型太大时一跑几小时没法收敛用MIPGap控制求解精度——1%的Gap对于规划问题完全够用没必要死磕到0.001%那是浪费算力。NumericFocus1是为了让求解器多花点心思在数值稳定上配电网规划模型的系数矩阵经常跨越好几个数量级投资费用几十万电压约束里却是个位数数值病态是高发问题。一个很实用的调优技巧是“求解前先检查模型规模”。在调用optimize之前可以用YALMIP的length(Constraints)统计约束数量用size(Objective)看目标函数结构确认模型没建错。我见过太多人模型建完直接跑一报错就懵——其实报错信息里如果提示“无解”多半是约束本身矛盾不是求解器的锅。4. 算例测试与结果分析4.1 测试系统与参数设置算例我用的是修改后的IEEE 33节点配电网系统。原始33节点系统有32条支路、1个根节点是一个经典的辐射状配网测试系统。我在原始拓扑基础上做了扩展处理增加了3个候选新建线路走廊连接不同馈线之间用于形成联络、2台候选新增主变并把未来负荷按年均3%增长率外推到规划水平年形成了扩展规划的基础数据。具体参数设置如下参数项数值说明系统电压等级10 kV典型中压配电网节点数33IEEE 33节点系统已有线路数32构成初始辐射状网络候选新建线路3条两条联络线一条扩容线候选新增主变2台容量均为10 MVA负荷年增长率3%规划水平年10年折现率8%用于投资年化折算电价0.6 元/kWh用于网损费用计算线路投资55万元/km按架空线施工综合估算主变投资300万元/台10kV主变综合造价N-1故障集10个场景5条主干馈线2台主变3条联络线N-1故障集选了系统里最关键的10个元件包括带负荷量最大的5条馈线、2台变压器、3条候选联络线基本覆盖了工程上“重要元件逐个断开”的校验要求。4.2 关键结果解读模型求解时间在Gurobi下大约40秒收敛到1%精度以内这个结果对于33节点的规模来说中规中矩。优化得到的规划方案是投建联络线1连接馈线A和馈线B形成手拉手供电大幅提升转供能力。投建联络线2连接馈线C末端解决馈线C末端在N-1后无法转供的问题。扩容线投建数量为0线路容量在正常和N-1场景下都够用不需要额外扩容。新增主变1台现有主变在N-1场景下负载率超90%新增1台10MVA主变后最严重场景负载率降到68%。从成本结构看总投资年化费用约线路投资年化15.2万元主变年化35.8万元51万元/年年网损费用约86万元/年。你可能会觉得网损费用比投资年值还大——这是正常的配电网10kV线路电阻大、潮流大年损耗费用在规划模型里往往跟投资费用是一个量级不能忽略。这也是为什么很多规划案例里把网损费用权重调高一点方案会倾向于选更粗的导线用初始投资换长期运行经济性。这个方案最有意思的一点是如果不加N-1约束最优方案只投建扩容线不投联络线——因为从纯投资网损的角度扩容主干线比新增联络线的降损效果更直接而且联络线本身不承带负荷只起备用作用平时它就是闲置资产。但一旦加了N-1约束联络线的价值就体现出来了——它是故障后负荷转移的“生命通道”。这个对比恰好说明了N-1约束在规划模型里不可替代的作用它不是锦上添花而是直接改变了最优解的结构。4.3 灵敏度分析的几个观察做完主算例之后我又做了几组灵敏度分析结论对实际项目有参考价值第一负荷增长率的影响。把年增长率从3%调到5%最优方案立刻变成要投建两条联络线和两台主变投资年值翻倍。这说明N-1方案对负荷预测的敏感度非常高规划人员做负荷预测时一定不能拍脑袋宁可留点冗余。第二折现率的影响。折现率从5%调到10%投资年化费用增加模型会更偏向网损较小的方案——因为网损是每年都发生的费用折现率越高未来费用的现值占比反而在年化对比中更突出。这个反直觉的现象是规划模型里常见的“费用时间价值”效应投标时需要注意。第三N-1故障集的选取对结果影响很大。如果把故障集从10个缩减到4个只包含主变最优方案不投联结线主变多投一台。这说明如果你做N-1校验时漏掉了关键的馈线故障场景规划方案很可能在工程上不满足安全要求——故障集选取不是可以随意拍脑袋的要有依据。5. 常见问题与排查技巧实录5.1 模型无解先检查这几处MILP模型报“infeasible problem”是初学者遇到最多的问题。根据我的经验出现无解十有八九是下面几类原因原因一约束自相矛盾。最常见是把电压下限设得太高、又把负荷设得太大在现有候选线路全部投建的情况下也满足不了电压约束。检查方法很简单人为放开所有候选线路的投建变量令x_new1把整数变量固定重新求解看是否有可行解。如果固定后还是无解说明是连续约束之间矛盾去查潮流约束、电压约束的系数如果固定后有解说明是整数变量组合导致不可行——那就是候选项目不够或者约束太紧。原因二辐射状约束写错了。单商品流约束对网络结构的要求很严格——所有节点必须从变电站可达同时不能有环。如果节点编号有跳号、某些线路的起点终点方向标反了辅助流就可能找不到可行解。排查方法是对比求解出的拓扑画出来看是否有孤立节点或者环。我建议在初版代码里把辐射状约束单独拎出来在一个简化的小网络上验证正确了再接进主模型。原因三Big-M取值问题。Big-M如果设置过小会把可行域切掉——线路容量明明是600你Big-M取400那投建后潮流也只能跑到400限制了可行解Big-M如果过大又容易引发数值问题。我实践中一般取线路容量上限的1.2倍左右不要为了保险给一个天大的值。5.2 求解太慢怎么办当故障集场景多、网络规模到几百个节点时MILP求解时间确实可能从分钟级涨到小时级。我总结了几条实用的加速经验第一善用分层迭代。先不加N-1约束求基础方案再逐场景校验、按需添加约束。这个方法我前面详细讲过它的效果极其显著——大部分场景其实天然就满足N-1你不需要在初始模型里就把它们全部塞进去。实测中33节点算例10个场景用一次性全场景建模求解约40秒用分层迭代第一轮只需要5秒验证10秒基本秒级收敛。第二给模型增加对称性破缺约束。如果两个候选走廊的参数几乎一样同样的长度、同样的容量MILP求解器会在对称解之间反复切换分支定界效率极差。这种情况可以用一个简单约束强制优先级x_1 x_2打破对称性。工程里两个走廊即使参数相近也可以按优先级区分——比如A走廊通行条件更好那就让A优先于B。第三合理缩小故障集。前面说过把占累计负荷95%以上的元件纳入故障集即可不必追求所有元件都做N-1末端小分支对结果没影响只会拖慢求解速度。5.3 N-1校验过不了怎么定位和补救有时候模型解出来了也声称“满足N-1”但独立校验程序一跑就发现某个场景过不了。这种问题通常出在“模型里的N-1约束”和“独立校验程序”对N-1的定义不一致。比如模型里你只让故障元件退出但实际转供时还要考虑联络开关操作顺序、备用电源容量这些没有建模进去就会导致模型认为可行的方案其实在物理上不可行。排查思路是这样对失败的场景先看是哪条线路过载或者哪个节点失电。然后用潮流计算比如直接用MATPOWER或自己写的DistFlow迭代复现这个场景确认故障后各线路的潮流分布。一般来说故障集处理时漏掉了“故障元件的下游负荷需要转供到邻近馈线”这个要求是常见的失策——辐射状配网一条馈线故障下游负荷的电源没了模型如果允许它失电目标函数里没有惩罚那求解器当然会选择直接甩负荷因为这样成本最低所以N-1约束至少要保证“任意元件退出后负荷损失为0”这可以在目标函数里加上一个足够大的惩罚系数也可以直接加硬约束。补救方向上如果某条馈线N-1后过载常规做法是1增加一条与相邻馈线的联络线分担转供负荷2把这条馈线的导线截面加大提高传输容量3调整分段开关位置减少故障后的转供范围。在规划模型里前两类对应“增加候选项目”第三类需要引入开关优化模型会更复杂一般规划阶段不直接优化。5.4 几个容易被忽略的工程细节最后补充几个我在项目中总结的、常规代码教程里基本不会提到的细节第一规划模型里“潮流方向”的变量定义要留足自由度。配电网正常是辐射状单向潮流但N-1转供时负荷可能从反方向送来所以线路潮流变量必须定义成双向的即允许为正也允许为负不要默认“电源-负荷”的方向否则N-1场景下转供路径会被模型砍掉。第二投资费用的年化折算起始年份要统一。不同设备投资年限和建设周期不同主变能用25年线路30年折算到统一的基准年时要注意规划水平年的对齐。我的做法是把所有费用统一折算到规划基准年第0年的等年值这样后续做多阶段规划时才能做增量比较。第三结果可视化其实占用整个项目近三分之一的时间。我最终用Matlab把规划后的网络拓扑画出来节点颜色表示电压高低线路粗细表示负载率N-1校验结果一目了然。很多人忽视这部分但写论文或者汇报时一张清晰的网络图比几百行结果数据有说服力得多——绘图代码不复杂用Matlab的plot加几组坐标数据就能搞定关键是交互式地逐场景放映故障情况非常直观。我在实际项目里最深的一个体会是配电网N-1扩展规划这个题目数学上看似高深本质上还是一个工程决策问题。模型编得再漂亮解出来的方案如果不能通过实际的N-1校验、不能在真实网架结构上落地就没有意义。所以做这个项目不要一头扎进代码里先把网络结构、负荷分布、转供路径这些工程逻辑吃透再用数学模型去精确描述它们最后才是Matlab实现和调参。按照这条路径走下来你不仅能跑通代码更是真正理解了一个电网规划项目从需求到落地的全过程。
返回列表