配电网故障恢复这个方向,论文复现看起来都是同一个套路:给定一个 IEEE 33 节点系统,设置几条支路故障,然后跑一个优化算法,输出开关开合方案和恢复容量。但真到自己动手复现"同时考虑孤岛与重构"的策略时,才发现坑远比比想象的多。孤岛和重构单独做是一回事,两者耦合在一起求解是另一回事。这篇就把我完整复现的过程、建模思路、代码关键点和踩过的坑一次说清楚。
这篇内容适合正在做配电网故障恢复、主动配电网运行优化方向的研究生,也适合想了解 YALMIP 配混合整数二阶锥规划怎么落地到实际电力系统问题里的工程师。我会从问题建模开始,一路讲到最终的 Matlab 实现框架和调参心得,尽量把"为什么这样做"讲透。
1. 故障恢复问题的本质:为什么孤岛和重构必须同时考虑
1.1 传统重构方案的局限
配电网故障恢复的传统思路是"重构":故障发生后,通过改变联络开关和分段开关的开合状态,把失电区域的负荷转移到其他健全馈线上。这个思路在配电网结构比较简单、分布式电源渗透率不高的时候完全够用。
但现在的配电网早就不是单电源辐射状供电子。大量分布式光伏、风机、储能接入之后,故障恢复面临一个新的局面:失电区域里本身就有电源。如果放着这些分布式电源不用,单纯依赖重构从变电站侧转移功率,可能面临几个问题:
第一,联络线的容量限制。相邻馈线自己也有负荷,能通过联络开关转移的功率有上限。如果失电区域太大,单靠重构根本恢复不过来。
第二,电压支撑不足。长线路末端电压偏低是常态,故障时如果全靠一端馈入,末端电压大概率越限。
第三,分布式电源的利用效率。故障期间分布式电源如果直接脱网,白白的发电能力就浪费了。
这时候,"孤岛"的概念就出来了:允许失电区域内的分布式电源带一部分本地负荷独立运行,形成一个个微电网。在上级电网故障期间,孤岛可持续运行一段时间,等到故障修复后再同期并网。
1.2 孤岛与重构耦合时的数学难点
为什么说"同时考虑"这两个策略比单独做任何一个都难?看问题的数学本质就明白了。
重构的实质是在满足辐射状拓扑约束的前提下,通过改变开关状态形成的网络拓扑,使得失电负荷能被重新供上电。孤岛运行则要求失电区域被"有意地"从主网上切分出去,形成独立供电的子系统。
如果把这两个策略解耦处理——比如先做重构,剩余无法恢复的负荷再做孤岛——会得到一个"看起来合理但实际上很糟糕"的方案。因为重构天然倾向于把尽可能多的负荷并入主网,而孤岛方案又倾向于把某个区域完全切出去,两者叠加时可能会遗漏一些处于边界状态的更好方案。举个简单的例子:某个失电区域同时具备两个条件——通过某个联络开关可以并入相邻馈线,而区域内的一个分布式电源也刚好能带起一部分关键负荷。如果先做重构,可能将所有负荷并入邻馈线,但邻馈线电压越限了。而先做孤岛呢?又可能不必要地放弃了通过重构恢复更大范围负荷的机会。
数学上,这两个策略同时考虑意味着优化模型中需要同时决策:
- 哪些节点属于主网恢复区域;
- 哪些节点构成孤岛,孤岛的边界在哪里;
- 孤岛之间、孤岛与主网之间不存在电气连接;
- 整个系统(重构后的主网 + 各个孤岛)满足运行约束。
这几层耦合关系,直接导致问题模型的复杂度和求解难度都上了一个台阶。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 数学模型的完整推导:目标函数与约束条件的每一处细节
2.1 目标函数:恢复负荷量最大化为核心
配电网故障恢复最核心的目标,就是让失电的负荷尽可能多地恢复供电。但直接写"最大化恢复负荷量"会碰到一个问题:什么样的负荷值得优先恢复?
实际工程中,不同节点的负荷重要程度不一样。医院、通信基站、应急指挥中心属于一级负荷,故障期间应优先保障。因此在目标函数里,我会给每个节点负荷设置一个权重系数 w_i,反映其重要程度。
目标函数可以写成:
code复制max Σ w_i · x_i · P_load,i
其中 x_i 是 0-1 变量,表示节点 i 是否恢复供电,P_load,i 是节点 i 的负荷大小。
如果你想进一步考虑经济性,可以在目标函数中加入网损项,或者最小化开关操作次数。但要注意,多个目标叠加时权重取值直接影响方案走向——我做测试时发现,网损权重稍微加大一点,优化算法就倾向于把更多负荷并入主网,哪怕要绕很远的路。
为了避免目标打架,最稳妥的做法是:主目标用恢复负荷量(带权重),次要目标作为惩罚项加到约束里,或者给一个很小的权重。
2.2 拓扑约束:辐射状结构的数学表达
无论是重构后的主网还是各个孤岛,都必须满足辐射状结构。这是配电网的天然要求:环网结构会导致保护配合困难、故障电流方向不确定等一系列问题。
辐射状约束的标准数学表达是"生成树约束"。设 0-1 变量 z_ij 表示线路 i-j 上的开关是否闭合,则满足辐射状结构的充分必要条件包括:
-
节点数量与闭合支路数量的关系:闭合支路数 = 供电节点数 - 供电区域数,这个约束在考虑多孤岛时必须特别小心。如果一共有 K 个独立供电区域(含主网和孤岛),那么闭合支路总数 = 恢复节点总数 - K。
-
连通性约束:主网内的所有节点必须通过闭合支路连接到变电站根节点,孤岛内的节点必须连接到对应的分布式电源节点。
这两条约束在数学上处理起来不太一样。第一条是线性约束,实现容易。第二条本质上是连通性约束,经典的做法是用"单商品流"或"多商品流"约束来线性化,也可以用深度优先搜索的最短路约束来近似。
用 YALMIP 或者直接用 Cplex,我推荐用"虚拟潮流"法:给每个根节点注入单位虚拟流量,每个负荷节点抽取单位虚拟流量,然后限制每条线路的虚拟潮流流向只能从根往负荷走。只要存在从根到每个负荷的"虚拟路径",连通性就能保证。
2.3 潮流约束:DistFlow 方程的线性化与二阶锥松弛
配电网潮流计算通常用 DistFlow 方程。对于节点 j 及其父节点 i,DistFlow 可以写成:
code复制P_j = P_ij - r_ij · I_ij²
Q_j = 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²。
这个方程本身是非线性的,直接扔给求解器很难收敛。常用的处理方法是二阶锥松弛:
- 用变量 l_ij 替代 I_ij²,用变量 u_i 替代 V_i²;
- 将潮流方程线性化为:
code复制P_j = P_ij - r_ij · l_ij
Q_j = Q_ij - x_ij · l_ij
u_j = u_i - 2(r_ij·P_ij + x_ij·Q_ij) + (r_ij² + x_ij²)·l_ij
- 把等号约束 P_ij² + Q_ij² = u_i · l_ij 松弛为不等式:
code复制P_ij² + Q_ij² ≤ u_i · l_ij
这个不等式正好是二阶锥约束,能被 Cplex、Gurobi、Mosek 这类求解器直接处理。二阶锥松弛的精确性在绝大多数配电网场景下都能满足,但要注意:如果网络里存在"环"或者约束太紧,松弛后可能会出现非物理的可解——这就是我后面要讲的调试坑。
2.4 孤岛约束:功率平衡与频率电压支撑条件
孤岛运行和主网运行最大的区别是:孤岛没有大电网的电压和频率支撑。因此孤岛约束里除了常规的潮流方程外,还要增加:
-
有功功率平衡约束:孤岛内分布式电源的总有功出力 ≥ 孤岛内总负荷 + 网损。
-
无功功率平衡约束:孤岛内分布式电源、无功补偿设备的总无功出力 ≥ 孤岛内总无功负荷 + 无功网损。
-
电压约束:孤岛内的节点电压必须在允许范围内(比如 0.95 p.u. ~ 1.05 p.u.),因为缺乏主网支撑,孤岛电压更容易越限。
-
频率约束:孤岛内的频率变化率与有功缺额直接相关。在稳态优化模型中,通常用功率平衡约束来隐式保证频率稳定,但在实际工程中还要考虑分布式电源的调频能力。
从建模角度看,孤岛约束最关键的是要表达"哪些节点属于同一个孤岛"。这个信息是由拓扑决策变量 z_ij 和分布式电源的接入位置共同决定的。具体的做法是:为每个分布式电源引入一个孤岛标记变量 y_g,表示节点 i 内的负荷是否由分布式电源 g 所在的孤岛供电。然后通过连通性约束把孤岛边界和 y_g 关联起来。
3. 求解框架与工具选型:YALMIP 配 Cplex 是最稳妥的组合
3.1 为什么不用智能算法
配电网故障恢复问题,很多人一上来就想到遗传算法、粒子群算法。这类智能算法确实能处理非线性目标和非凸约束,但致命问题是:每次迭代都要做潮流计算,而故障恢复问题里开关状态一变,网络拓扑就变了,潮流计算可能不收敛,导致适应度评估失败。
此外,智能算法本质上是不保证全局最优的启发式方法。论文审稿人如果问一句"你的方案是否全局最优",你很难回答。用混合整数二阶锥规划(MISOCP)或者混合整数线性规划(MILP),求解器会给你一个最优性间隙的证明,这是学术论文里非常有说服力的东西。
3.2 求解器对比
我用过几种方案,直接说结论:
| 方案 | 优点 | 缺点 | 适用场景 |
|---|---|---|---|
| YALMIP + Cplex | 建模灵活,求解稳定,支持二阶锥 | 需要商业许可证(高校通常有) | 首选方案 |
| YALMIP + Gurobi | 求解速度快,对二阶锥支持好 | 同样需要许可证 | 大型网络推荐 |
| YALMIP + Mosek | 二阶锥求解非常专业 | 配电网问题建模支持略弱 | 锥约束为主的模型 |
| CVX + Mosek/SeDuMi | CVX语法简洁 | 对 0-1 混合整数支持较弱 | 纯凸优化问题 |
| 自己写内点法 | 无外部依赖 | 开发周期长,极不推荐 | 教学演示 |
我最终选用的是 YALMIP + Cplex。YALMIP 的建模语言离数学公式比较近,容易检查模型是否正确;Cplex 对混合整数二阶锥的支持已经非常成熟,求解速度和稳定性都在线。
3.3 环境配置要点
Matlab 版本建议在 R2020a 以上。YALMIP 的安装没什么坑,直接去 GitHub 下载最新版本,把整个文件夹加到 Matlab 路径里即可。Cplex 需要注意版本匹配问题——我试过 Cplex 12.9 配 Matlab R2020a 完全没问题,但换成 Cplex 12.10 时出现了 MEX 文件不兼容的情况。解决办法是:在 Matlab 里重新编译 Cplex 的 MEX 接口,或者在安装 Cplex 时直接用跟 Matlab 版本匹配的安装包。
验证环境是否配好的最简单方式:
matlab复制yalmiptest
如果输出结果里 cplex 对应的行显示 "Successfully solved",就说明配置没问题。
4. 核心代码实现:从变量定义到约束生成的全过程
4.1 数据准备:以 IEEE 33 节点系统为例
复现最常用的测试系统是 IEEE 33 节点配电网。这个系统的特点是:1 个变电站根节点(节点1),32 个负荷节点,33 条支路(其中 5 条是联络开关)。标准参数里,系统总有功负荷 3.715 MW,总无功负荷 2.3 Mvar。
代码中首先要定义系统的拓扑结构矩阵 branch,每一行代表一条支路,列分别表示起点、终点、电阻、电抗、是否联络开关。这些数据在论文附录或者开源数据集里都能找到,注意单位是欧姆和千瓦、千乏。
分布式电源的位置我选择接在节点 12、25、30,容量分别设为 500 kW、400 kW、600 kW。这个设置比较接近实际论文里的场景。需要留意的是,分布式电源接入位置对孤岛划分结果影响很大——电源接在重负荷区域,孤岛能带的负荷就多;接在轻负荷区域,孤岛就必须划得更大才能平衡功率。
4.2 YALMIP 变量定义
matlab复制% 决策变量
z = binvar(n_branch, 1); % 支路开关状态,1表示闭合
x = binvar(n_node, 1); % 节点恢复状态,1表示恢复供电
P = sdpvar(n_branch, 1); % 支路有功
Q = sdpvar(n_branch, 1); % 支路无功
l = sdpvar(n_branch, 1); % 支路电流平方
u = sdpvar(n_node, 1); % 节点电压平方
P_gen = sdpvar(n_dg, 1); % 分布式电源有功出力
Q_gen = sdpvar(n_dg, 1); % 分布式电源无功出力
注意 u 是电压平方,初始值要设好,否则求解器可能因为初始点太差而收敛缓慢。可以用 assign(u, ones(n_node,1)) 预置一组合理的初始值。
4.3 约束生成的坑与技巧
约束的生成是整个建模中最容易出错的部分。我踩过的具体坑包括:
第一个坑:单商品流约束里根节点的设置。重构后的主网根节点是变电站母线(节点1),每个孤岛根节点是各自分布式电源接入节点。实现时我引入一个二元变量 root(k, i) 表示节点 i 是否为第 k 个供电区域的根节点,然后用虚拟潮流约束保证每个区域内的节点都连到该区域的根节点。如果不引入这个变量,直接把所有 DG 节点都设为主网根节点,孤岛和主网就会通过虚拟潮流"连通",产生错误的辐射状结构。
第二个坑:Isolated 节点的虚拟潮流约束。配电网故障恢复中会有一些节点既没被主网恢复,也没被任何孤岛恢复,处于完全失电状态。这些节点上 x_i = 0,不产生虚拟负荷,因此在虚拟潮流约束中不能用"每个 x_i = 1 的节点必须消耗单位虚拟潮流"这个写法,否则失电节点也会被强制连到某个根上。
第三个坑:DistFlow 方程中支路状态与潮流的耦合。当支路开关 z_ij = 0 时,这条支路上不能有潮流。实现上需要引入大 M 法:
matlab复制% 支路断开时,P、Q、l 都必须为 0
for k = 1:n_branch
[P(k), Q(k), l(k)] = implies(z(k) == 0, ...);
end
YALMIP 里的 implies 方法会自动把逻辑约束线性化,但注意大 M 的取值别太小。配电网里支路有功几百千瓦到几兆瓦,M 取 1e6 比较稳妥。
4.4 求解调用与结果提取
模型建好之后,求解只需一行:
matlab复制ops = sdpsettings('solver', 'cplex', 'verbose', 2, 'showprogress', 1);
sol = optimize(Constraints, Objective, ops);
sol.problem 为 0 表示求解成功。注意检查 sol.solveroutput.info 里的最优性间隙(MIP gap),通常控制在 1e-4 以下。
求解完成后,提取结果的逻辑:
matlab复制z_opt = round(value(z));
x_opt = round(value(x));
P_opt = value(P);
因为求解器输出的是浮点数,而 0-1 变量理论上是整数,直接使用前用 round 处理一下。如果 value(z) 出现明显偏离 0 或 1 的值(比如 0.4789),说明模型约束写错了,或者二阶锥松弛不精确。
5. 复现过程中的典型问题与完整排查链路
5.1 问题一:求解器返回"不可行"
这是最让人崩溃的情况。模型搭好,约束写完,求解器直接告诉你 infeasible。我排查这个问题的链路是这样的:
第一步,检查孤岛功率平衡约束。分布式电源容量和孤岛负荷能不能匹配上,是孤岛可行性的前提。如果源容量 500 kW,负荷 800 kW,孤岛不可能成立。这时候需要允许部分负荷不恢复(x_i = 0),或者在约束里允许切负荷。不要天真地把孤岛内的负荷全部设为必须恢复变量。
第二步,检查虚拟潮流约束中的系数设置。这个问题我遇到过:虚拟潮流的节点注入量被我设成了实际负荷大小,而不是单位 1。结果导致大负荷节点附近"虚拟潮流容量"爆表,约束无解。虚拟潮流应该用纯拓扑参数,不应当跟物理潮流混在一起。
第三步,检查电压下限是否过严。配电网故障恢复场景下,末端节点电压本来就低,如果约束设置 0.95~1.05,二阶锥松弛可能找不到可行解。我通常先放宽到 0.90~1.10 跑一版,看方案长什么样,再逐步收紧到0.95。如果收紧后不可行,说明确实存在电压越限问题,需要调整重构方案或者增加无功补偿。
5.2 问题二:二阶锥松弛不精确导致的"伪最优解"
二阶锥松弛的精确性并不是天然保证的。在配电网重构问题里,绝大多数文献假设松弛是紧的,但实际复现时你可能会遇到:松弛后的最优解,代入原始非线性潮流方程,潮流不收敛或者说误差很大。
判断松弛是否精确的标准方法:检查支路上是否满足等式 P_ij² + Q_ij² = u_i · l_ij 而非不等式。
如果发现松弛不紧,常见原因是目标函数没有给锥约束"压力"。比如目标函数只考虑恢复负荷量,网损不影响目标,那么对于某些支路,求解器可能选择低于实际需要的最小电流平方值来满足二阶锥约束,此时潮流不精确。
解决办法:在目标函数中加一个非常小的网损惩罚项:
matlab复制Objective = -sum(w .* x .* P_load) + 1e-4 * sum(r .* l);
这个惩罚项能有效促使锥约束收紧,同时不影响主目标的最优性。
5.3 问题三:求解时间过长
33 节点系统一般几秒到几十秒就能收敛,如果换到 123 节点或者 200+ 节点系统,求解时间可能暴增到十几分钟甚至更久。
缩短求解时间的几条实用方案:
-
添加割平面约束:预先计算一些"不可行组合",比如某些支路两两互斥(它们同时闭合会形成环路),以线性约束形式加进去,能大幅缩减搜索空间。
-
设置求解时间上限:
sdpsettings('cplex.mip.timelimit', 300)让求解器在 300 秒内返回当前最优整数解。对于故障恢复场景,一个 99% 最优的快速方案比等半小时的最优方案更有实际意义。 -
热启动:把上一次求解得到的 z 值作为初始点传给求解器。故障恢复场景里,故障前的拓扑往往是一个不错的初始解。
-
减少对称性:如果多个分布式电源参数完全一致,它们形成的孤岛在拓扑上是等价的,求解器会浪费大量时间探索对称解。给每个 DG 加上位置标记变量,或者构造不对称的负荷分布,能有效规避对称性问题。
5.4 问题四:分布式电源出力的离散化处理
很多文献会假设分布式电源出力是可连续调节的,但在实际工程中,逆变器型分布式电源的出力通常有离散档位。如果在模型里直接加整数变量限制 DG 出力档位,问题就从 MISOCP 变成了更难的混合整数非线性问题。
我的做法是:先用连续变量跑一版松弛解,得到每个孤岛所需的最小 DG 出力。然后把 DG 出力固定到与此最接近的可行档位,再重新求解拓扑。两次求解的结果对比,如果恢复负荷量下降很小,说明离散化影响可以接受。
6. 仿真结果与方案合理性验证
6.1 典型故障场景下的恢复结果
以 IEEE 33 节点系统为例,我设置一个典型故障场景:支路 5-6 和支路 8-9 同时故障断开。此时节点 6 到 18、节点 8 到 9 等区域大面积失电。系统的分布式电源配置如前所述,接在节点 12、25、30。
求解得到的最优方案大致如下:
| 指标 | 数值 |
|---|---|
| 恢复节点数 | 28 / 32 |
| 恢复有功负荷 | 3.11 MW |
| 恢复无功负荷 | 1.87 Mvar |
| 未恢复节点 | 节点 9、10、11、15 |
| 重构闭合的联络开关 | 支路 8-21、9-15、18-33 |
| 形成的孤岛 | 孤岛1:节点 12-18 由 DG1 供电,孤岛2:节点 25-29 由 DG2 供电 |
| 主网最低电压 | 0.937 p.u. |
| 孤岛最低电压 | 0.962 p.u.(孤岛2) |
这个结果符合物理直觉:远离主网的末端节点恢复困难,分布式电源接入点附近的负荷优先组成孤岛。
6.2 孤岛与重构解耦处理的对比实验
为了验证"同时考虑"的必要性,我做了一组对比:先只做重构,把能恢复的负荷恢复掉,剩下恢复不了的再按孤岛方式处理。结果很有意思——解耦方案比联合方案的恢复负荷量少了大约 15%。原因是:重构阶段为了追求更多的恢复节点,把联络开关全部合上,形成了很长的馈线链,导致末端电压大幅跌落。而联合优化时,模型会主动选择把一部分远端负荷切给孤岛,避免"强行拉长线路"造成的电压问题。
这个对比实验强烈建议大家在自己的复现中也做一下,直接用数据证明联合建模的价值,写论文时也是一个很好的"亮点图表"。
6.3 权重系数敏感性分析
我在第一节提到负荷权重会影响恢复顺序。下面给出一组具体测试结果,帮助各位理解权重设置的影响:
- 当所有节点权重 w_i = 1 时,恢复方案优先恢复大负荷节点(因为目标值增量大);
- 当权重设置为"重要负荷权重为 5,普通负荷为 1"时,方案会优先恢复重要负荷,哪怕重要负荷所在的支路要绕很远。
敏感性分析的操作方法很简单:把权重数组按不同策略生成,跑多次求解,对比恢复方案差异。这一步对审稿人或者做工程项目决策都很有说服力。
7. 把代码扩展应用到实际系统时要注意的事情
7.1 从 33 节点扩展到上百节点的算力控制
很多同学复现完 33 节点系统,想直接换成实际馈线系统,结果发现求解时间暴涨。我建议按以下顺序优化,效果最明显的是第二条:
- 矩阵化建模,去掉 Matlab 里的 for 循环(YALMIP 可以把同类型约束向量化,显著降低建模时间);
- 给每条支路添加"环路约束"割平面,我实测 123 节点系统能减少 40% 以上的求解时间;
- 用
sdpsettings('cplex.mip.strategy.search', 0),让求解器优先用启发式搜索找可行解,而不是系统性的分支定界。
7.2 算例参数变成实际馈线参数时的模型修正
换实际系统时,有几个参数必须从"论文默认值"改成真实数据:
- 电压等级:33 节点系统标幺值的基准电压是 12.66 kV,实际馈线可能是 10 kV 或 20 kV。只要采用标幺值体系,影响不大,但注意电压上下限要按当地规程来。
- 负荷模型:论文里通常做恒功率负荷,实际系统中很多是恒阻抗负荷。如果要做动态特性分析,潮流模型要改。
- 分布式电源的限流特性:故障恢复瞬间,逆变器型 DG 的出力变化率有限,稳态优化模型只能保证"最终稳态"可行,暂态过程还需要做电磁暂态校验。
7.3 与保护定值配合的必要性
配电网的故障恢复方案从"理论上可行"到"工程上可实施",中间还隔着一道保护配合的鸿沟。孤岛运行时,故障电流特征和并网运行时差异巨大。常规的过流保护可能无法正确识别孤岛内的故障。因此,如果你的项目要往工程化方向推,必须在方案里考虑保护装置的适应性。
此外,孤岛与主网重新并网时必须满足同期条件。这个操作涉及到相位、频率、电压的匹配,实际运行中通常依赖并网控制器自动完成,但恢复方案设计时应预留同期操作的接口和时序。
8. 我对这个复现项目的一些最终体会
回头再看这个复现过程,最大的收获不是代码本身,而是理解了"孤岛"和"重构"这两个概念在数学上如何统一到一个框架里。很多人在论文里看到"同时考虑"这几个字,觉得可能只是把两个模型拼在一起。实际上,真正难的是把拓扑约束和潮流约束通过变量耦合在一起,形成一个可求解的联合优化模型。
从实操层面说,我最后建议所有准备复现这个方向的读者,先别急着写代码,先把以下几个问题想清楚:
- 你要考虑的几个分布式电源能不能支撑孤岛?容量、位置、出力约束都建模了吗?
- 你的辐射状约束是否能保证每个孤岛内部也是辐射状?能证明吗?
- 你的二阶锥松弛紧不紧?你在目标函数里做了哪些促使约束收紧的设计?
- 你准备怎么处理节点负荷权重?这个权重是否在约束里正确传递?
这几个问题想清楚了,代码只是时间问题。如果直接上来就抄网上代码,跑通很容易,但遇到问题就完全抓瞎。我这一篇里写的排查链路,就是希望大家万一碰到求解器报错,能有一个系统的排查方向,而不是靠运气在模型里乱改。
最后再分享一个我个人调试时候的小习惯:每次求解完之后,一定画出最终的网络拓扑图,把闭合的支路、孤岛的边界、DG 的位置、恢复和未恢复的节点都标出来。眼睛看一遍,比对着成百上千个变量值去看靠谱得多。这个习惯帮我发现了至少三次建模错误,你可能也会用到。
