1. 故障重构到底在解决什么问题
1.1 停电场景下的网络转供
去年夏天一个雷雨夜,某条10kV馈线遭外力破坏跳闸,非故障段用户停电接近三个小时。问题不在故障点本身,而在故障点隔离之后,下游一大片区域的负荷没有任何供电路径。值班调度能做的只是拉开故障两侧的隔离开关,然后等抢修。整个过程里真正影响停电时长的,不是修线路的时间,而是"如何让失电用户尽快恢复供电"这件事。
配电网故障重构,说白了就是在故障区段被隔离之后,通过改变分段开关和联络开关的开合状态,把还完好的非故障失电区域重新接到别的带电馈线上。这是配电自动化里FLISR(故障定位、隔离与供电恢复)的最后一步,也是决定恢复效果的关键一步。
这个问题的难点在于:开关组合数量巨大。一个中等规模的配电馈线组可能有几十个开关,每个开关只有开和合两种状态,穷举所有拓扑组合在计算上完全不现实。而且"能恢复供电"只是底线,工程上还要考虑恢复之后的电压是否合格、线路是否过载、网损是否过高、开关动作次数是否在合理范围内。这就把问题从"找一组可行开关组合"升级成了一个优化问题。
1.2 为什么必须写成优化问题
有朋友问过我:配电网那么多规则,用专家系统或者查表不也能给出一个恢复方案吗?确实,简单场景下规则是可以的。比如"某条馈线故障,合上特定的联络开关"这种固定预案。但实际故障发生后,负荷分布、分布式电源出力、联络开关的可用状态都是变化的,固定预案经常不是最优解,甚至在某些组合故障场景下根本没有可行解。
把重构写成优化问题的意义在于:它能在一个统一的数学框架里同时处理拓扑选择、潮流约束、电压约束、设备容量约束和操作次数约束,自动找出满足所有约束的解里目标最优的那个。这个"目标"可以由运行人员自己定义,可以是最小化失电负荷、最小化网损、最小化开关动作次数,或它们的加权组合。
配电网重构问题本质上是一个混合整数非线性规划(MINLP)。二进制变量表示开关开合状态,潮流约束是非线性等式。这是这类问题难解的根源。早些年大家用遗传算法、粒子群这类启发式算法直接硬搜,速度快但没法保证找到全局最优。直到DistFlow方程和二阶锥松弛这套组合被引入,情况才好起来——它能把原问题松弛成一个混合整数二阶锥规划(MI-SOCP),在多项式时间内求到全局最优解或带最优性边界的近似解。这也是Matlab+二阶锥这条技术路线近年来在配电网重构研究里几乎成为标配的原因。
1.3 重构与常规网架规划的区别
很多刚接触这个方向的同学会把故障重构和网架优化规划混在一起。两者确实共享大量数学模型,但出发点完全不同。
网架规划是"在现有或未来网架基础上,通过新建线路和开关,确定最优的运行结构",它考虑的是长期投资和全生命周期成本,时间尺度以年为单位。而故障重构发生在故障隔离后的短时间窗口内,时间尺度以分钟甚至秒为单位,目标是在不新增设备的前提下,通过切换现有开关来改变运行拓扑,快速恢复供电。
这个区别直接决定了建模细节。规划问题可以不关心重构时间,但故障重构必须考虑开关动作次数限制——每多动作一个开关,就多一分操作风险和执行时间。规划问题允许把整个网络状态当成一个静态优化来处理,而故障重构往往需要分阶段考虑:先快速恢复关键负荷,再优化运行状态。这些差异最终都会体现在目标函数和约束的形式上。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 数学模型:从DistFlow到二阶锥是关键一步
2.1 DistFlow潮流方程的前提与形式
配电网和输电网在电气特性上有明显区别:辐射状结构、线路电阻与电抗的比值(R/X)偏高、线路对地电容小、三相不平衡明显。如果用输电网那套牛顿-拉夫逊潮流来建模,在配电网里计算效率不高且容易不收敛,更麻烦的是它无法直接嵌入整数优化模型——你没法让优化器在求解开关状态的过程中反复调用一个牛拉潮流求解器,这在数学上是行不通的。
DistFlow方程就是为了避开这个问题而提出的配电网专用潮流模型。它把潮流约束写成一组关于支路有功、无功、电流平方和节点电压平方的代数方程,形式如下:
对于每条支路(i, j),记从节点i流向节点j的支路功率为P_ij + jQ_ij,电阻为r_ij,电抗为x_ij,那么:
- 节点j的有功平衡:Σ_{k:(j,k)∈E} P_jk = P_ij - r_ij·l_ij - p_j
- 节点j的无功平衡:Σ_{k:(j,k)∈E} Q_jk = Q_ij - x_ij·l_ij - q_j
- 电压降方程:V_j² = V_i² - 2(r_ij·P_ij + x_ij·Q_ij) + (r_ij² + x_ij²)·l_ij
- 电流平方约束:l_ij ≥ (P_ij² + Q_ij²) / V_i²
其中l_ij表示支路电流的平方,V_i²表示节点电压的平方。
注意这里用电流平方和电压平方作为状态变量,是为了把约束写成关于这些变量的线性或二次形式,方便后面的凸松弛操作。如果直接用电流、电压的幅值,约束会变成带根号的复杂非线性函数,求解器处理起来会很吃力。
还有一个细节:精确版DistFlow第一步是线性的(功率平衡和电压降方程),唯一非凸的是"电流平方 ≥ 功率平方和/电压平方"这个二次约束。这正是后面可以做二阶锥松弛的空间。
2.2 开关状态与潮流约束的耦合处理
拓扑重构和潮流约束的耦合是建模的第一个坎。开关状态z_ij是个二进制变量,z_ij=1表示支路闭合,z_ij=0表示支路断开。问题在于:DistFlow方程在支路断开时没有物理意义——断开支路上不应该有潮流量,但方程本身并不认识这个开关变量。
最常用的处理手段是Big-M法。核心思想是:在支路断开的条件下,把原本必须严格满足的等式约束"放宽"成一个不产生实际限制的无效约束。以支路功率P_ij为例:
- M·z_ij ≤ P_ij ≤ M·z_ij
当z_ij=1时,这个约束变成 -M ≤ P_ij ≤ M,相当于没有约束(前提是M足够大);当z_ij=0时,强制P_ij=0。这是把逻辑关系翻译成线性约束的标准技巧。
电压降方程的处理稍微复杂一点,我用到了不等式形式:
V_j² ≥ V_i² - 2(r_ij·P_ij + x_ij·Q_ij) + (r_ij² + x_ij²)·l_ij - M·(1 - z_ij)
当z_ij=1时,不等式还原成等式约束的实际数值关系;当z_ij=0时,右侧减去一个大的M项,让约束自动失效。
这里有一个新手很容易踩的坑:Big-M里的M不是越大越好。M太大会导致线性松弛质量变差,让求解器在分支定界时碰到大量数值问题,甚至出现假整数解。我一般会把M取成该物理量的量纲上限的1.1到1.5倍。比如电压平方的单位是kV²,配电网正常允许范围是0.9到1.1倍额定电压,那V_i²的最大可能值不会超过1.21倍额定电压平方,M取这个量级就足够了。这个经验后面会详细展开。
2.3 辐射状约束:容易被低估的难点
配电网闭环设计、开环运行,正常运行必须保持辐射状结构。这不仅是运行习惯,更是继电保护配合的基本要求——一旦形成环网,短路电流水平、保护定值配合全部要重新核算,现场根本做不到。
辐射状约束包含两层含义:第一,网络不能有环;第二,网络必须连通,不能有孤岛。很多初学者只写了"支路数 = 节点数 - 1"这一个约束,然后发现解出来的拓扑居然既有环又有孤岛,因为孤岛内部也可以满足节点数减一支路数的关系。
正确的做法是引入一个辅助的"虚拟潮流"变量F_ij,模拟从根节点向每个非根节点发送单位流量的过程:
- 支路数约束:Σ z_ij = n - 1
- 虚拟流平衡(对每个非根节点):Σ F_ij(流入) - Σ F_ij(流出) = 1
- 虚拟流与开关状态的耦合:-M_z·z_ij ≤ F_ij ≤ M_z·z_ij
只要虚拟流平衡有解,就说明网络是连通的;配合支路数约束,就能同时排除环网和孤岛。这里的M_z取值不需要太大,节点数就是它的自然上界。
我在项目中还试过用生成树约束(Spanning Tree Constraints)来做这一步,公式上更严格,但约束数量明显增多,小算例里性能差距不大,一到大规模系统,虚拟潮流法的求解速度优势就体现出来了。
2.4 目标函数设计与权重取舍
目标函数的设计直接决定重构方案会偏向什么方向。故障重构的目标函数一般有三个候选:最小化失电负荷、最小化网损、最小化开关动作次数。
我的做法是分层设计。优先目标是恢复尽可能多的负荷,然后用网损作为次级目标。注意恢复负荷的优先级通常比网损高得多——在故障场景下,少停一度电的价值远大于降低一点线损的经济效益。实际操作中,我会引入一组二进制变量y_i表示节点i是否恢复供电,目标函数写成:
min Σ r_ij·l_ij + λ·Σ p_i·(1 - y_i)
其中λ是失电惩罚系数。λ取多大合适?我试过从10到10000的量级变化。当λ太小时,优化器可能会"放弃"某些负荷来换取更低的网损,这在故障恢复场景里不能接受;当λ太大时,数值条件数变差,求解精度下降。我的经验是把λ设为正常网损量级的100倍以上,实际算例中取500到1000效果比较稳定。
还要注意y_i和功率平衡方程的耦合:如果节点i失电(y_i=0),那么它的功率平衡方程中负荷项就应该被剔除。这同样需要用Big-M来处理,但方向正好和支路功率相反,别记混了。
3. 为什么选Matlab+YALMIP这套组合
3.1 求解器选型:SOCP问题该交给谁
模型建好之后,下一步是求解。二阶锥规划本身是凸优化的一种,有成熟的多项式时间算法;再加上二进制开关变量,就成了混合整数二阶锥规划(MI-SOCP)。这类问题通常用分支定界法求解,核心求解器负责在每一个节点上解一个子SOCP问题。
主流的求解器选择主要是Gurobi、CPLEX、Mosek这三家。Gurobi和CPLEX对混合整数二阶锥的支持都很成熟,速度快、数值稳定性好,是学术界和工业界的事实标准。Mosek的内点法在纯SOCP上非常强,但整数分支的能力相对弱一些。开源方案里SCIP可以跑MI-SOCP,但性能差距明显,适合教学验证,不适合工程级应用。
这里有一个重要的点:Matlab自带的优化工具箱(fmincon、ga等)基本不适合解这类问题。fmincon是为连续非线性优化设计的,遇到整数变量只能靠外部枚举或外点法硬凑,效果不理想。遗传算法这类启发式算法能勉强跑起来,但每次算例的结果可能都不一样,也说不出离最优解有多远,这在工程上很难交代。
我强烈建议用YALMIP作为建模层,而不是直接用求解器自己的接口。YALMIP是一个Matlab工具包,它把sdpvar、binvar这些变量类型映射到底层求解器的API,好处是换求解器几乎不需要改代码——同一套模型,今天用Gurobi跑,明天改个参数就能切到CPLEX,这在方案对比阶段特别实用。
3.2 建模代码的结构设计
写YALMIP建模代码时,我一般按照下面这个流程组织:
- 数据准备:把节点编号、支路参数(电阻、电抗)、节点负荷整理成Matlab数组
- 定义决策变量:连续变量(支路功率P/Q、电流平方l、电压平方V2)和二进制变量(开关状态z、恢复状态y)
- 组装约束:按支路循环写入DistFlow约束,按节点写入功率平衡约束,再写入辐射状约束
- 定义目标函数
- 调用求解器求解
数据准备阶段有一个容易被忽视的细节:支路方向。YALMIP建模时支路的"方向"只是一个数学上的参考方向,不要求与潮流实际方向一致,但方向的选择会影响功率平衡方程中每一项前面的正负号。我习惯把每条支路的参考方向定义为从变电站(根节点)指向负荷侧,这样功率平衡方程写起来不容易混淆。
3.3 核心代码实现
下面是一段我实际用过的核心代码框架,基于IEEE 33节点系统,包含了DistFlow约束、二阶锥约束、辐射状约束和求解调用:
matlab复制%% 变量定义
z = binvar(n_branch, 1); % 开关状态,1=闭合
y = binvar(n_bus, 1); % 节点恢复状态,1=恢复供电
P = sdpvar(n_branch, 1); % 支路有功
Q = sdpvar(n_branch, 1); % 支路无功
l = sdpvar(n_branch, 1); % 支路电流平方
V2 = sdpvar(n_bus, 1); % 节点电压平方
%% 约束初始化
constraints = [];
%% 根节点电压约束
constraints = [constraints, V2(root) == V0^2]; % V0为根节点额定电压
%% 电压上下限约束
constraints = [constraints, Vmin^2 <= V2 <= Vmax^2];
%% DistFlow约束组装
for k = 1:n_branch
i = branch(k, 1); % 首端节点
j = branch(k, 2); % 末端节点
r = branch(k, 3); % 支路电阻
x = branch(k, 4); % 支路电抗
% 支路功率Big-M约束(z=0时功率和电流平方为0)
constraints = [constraints, -M_p*(1-z(k)) <= P(k) <= M_p*(1-z(k))];
constraints = [constraints, -M_q*(1-z(k)) <= Q(k) <= M_q*(1-z(k))];
constraints = [constraints, -M_l*(1-z(k)) <= l(k) <= M_l*(1-z(k))];
% 电压降方程(z=1时严格成立,z=0时放宽)
constraints = [constraints, V2(j) <= V2(i) - 2*(r*P(k) + x*Q(k)) ...
+ (r^2 + x^2)*l(k) + M_v*(1-z(k))];
constraints = [constraints, V2(j) >= V2(i) - 2*(r*P(k) + x*Q(k)) ...
+ (r^2 + x^2)*l(k) - M_v*(1-z(k))];
% 二阶锥约束:||[2P; 2Q; l - V2(i)]|| <= l + V2(i)
v = [2*P(k); 2*Q(k); l(k) - V2(i)];
constraints = [constraints, cone(v, l(k) + V2(i))];
end
%% 节点功率平衡方程
for i = 1:n_bus
inflow = find(branch(:, 2) == i); % 流入节点i的支路索引
outflow = find(branch(:, 1) == i); % 流出节点i的支路索引
power_in = -sum(P(inflow) - r(inflow).*l(inflow)) + sum(P(outflow));
reactive_in = -sum(Q(inflow) - x(inflow).*l(inflow)) + sum(Q(outflow));
% 负荷功率与恢复状态y关联
constraints = [constraints, power_in == -p_load(i)*y(i)];
constraints = [constraints, reactive_in == -q_load(i)*y(i)];
end
%% 辐射状约束(虚拟潮流法)
F = sdpvar(n_branch, 1);
for k = 1:n_branch
constraints = [constraints, -n_bus*z(k) <= F(k) <= n_bus*z(k)];
end
for i = 1:n_bus
if i == root
continue;
end
inflow = find(branch(:, 2) == i);
outflow = find(branch(:, 1) == i);
constraints = [constraints, sum(F(outflow)) - sum(F(inflow)) == 1];
end
constraints = [constraints, sum(z) == n_bus - 1];
%% 目标函数:网损 + 失电惩罚
objective = sum(r.*l) + lambda * sum(p_load .* (1 - y));
%% 求解
ops = sdpsettings('solver', 'gurobi', 'verbose', 1);
result = optimize(constraints, objective, ops);
代码里的符号约定需要说明一下:支路方向从branch(:,1)流向branch(:,2),功率平衡方程中流入节点的功率取负、流出取正,负荷作为"从节点流出的功率"写入。这样写出来的方程和DistFlow原始推导保持一致,检查起来也方便。
这里有一个细节要提醒:电压降方程我用了两个方向的不等式来近似等式,原因是DistFlow推导中的等号在YALMIP里直接写等式约束也可以,但加上两边不等式可以给求解器提供更宽松的中间节点,配合Big-M项后数值稳定性更好。实际测试中两种写法都能收敛,但不写不等式版本在个别大不平衡的算例里出现过数值抖动。
3.4 数值问题:Big-M不是越大越好
在3.2节提到过Big-M取值问题,这里详细展开一下我在多次调试中积累的经验。
Big-M的本质是用一个足够大的常数把约束"关掉"。但M过大的副作用是:M越大,线性松弛后的可行域越宽松,分支定界搜索树就越大,求解时间越长;更麻烦的是,现代求解器在处理大数值系数时可能触发数值公差问题,导致本该为整数解的变量陷入边界情况,甚至出现"伪最优"。
以IEEE 33节点系统为例,我一开始图省事,把M_p、M_v全部设成1e6。结果Gurobi报了一个警告,说模型包含巨大系数的约束,建议检查。求解结果是能跑出来,但代入Matpower验证潮流时误差明显,原因是部分支路在z=0时并没有被严格压到0,而是一个很小的非零数。把M降到1000到5000量级后,这个问题就消失了。
我的经验是:每个M值都应该有物理依据。M_p取所有支路的最大可能传输容量,M_v取电压平方变化范围的1.2倍左右,M_l取电流平方上限。通常几百到几千就够,完全不需要上百万。给求解器一个紧凑、物理意义明确的模型,比任何参数调优都重要。
4. IEEE 33节点系统的仿真验证
4.1 案例设置与故障场景
IEEE 33节点配电网系统是配电网重构研究里用得最多的标准算例,结构是单电源辐射状网络,节点1接变电站母线,额定电压12.66kV,总负荷约3715kW+j2300kvar。系统有37条支路,其中32条是分段开关支路(常闭),5条是联络开关支路(常开),分别在支路8-21、9-15、12-22、18-33、25-29。
我设置了一个典型故障场景:支路5-6发生永久性故障。这个位置很有代表性——它靠近主干线的中部,一旦隔离,会让节点6到18这一大块区域和节点26到33的末端区域全部失电,失电负荷占比很大,对重构方案的考验很强。
故障隔离后,失电区域和带电区域被断开的开关隔开。此时如果简单合上某一条联络开关,往往会因为网络闭环带来环流或者导致某些支路过载,必须同时打开相应的分段开关才能形成新的辐射状拓扑。这个"合一个、开一个"的配合过程,正是重构优化的核心能力。
4.2 重构前后的结果对比
用上面的模型求解这个场景,得到的最优方案是:闭合联络开关18-33和25-29,同时断开分段开关7-8。这个结果符合配电网重构的经典结论——故障后失电区域从主馈线中剥离出来,通过末端联络开关从另两条馈线获得供电,系统重新恢复辐射状结构。
重构前后关键指标对比如下:
| 指标 | 故障隔离后(重构前) | 重构后 |
|---|---|---|
| 失电负荷比例 | 约52% | 0%(全部恢复) |
| 全网最低电压(pu) | 0.876 | 0.941 |
| 系统网损(kW) | — | 约142 |
| 开关动作次数 | 隔离已动作2次 | 重构动作2次 |
重构后所有负荷都恢复了供电,这是最重要的一条。电压水平也明显改善,最低电压从0.876提升到0.941,没有越过0.9的工程下限。这说明重构在恢复供电的同时,也把网络运行点拉回到了安全区间内。
我还对比了不同故障位置下的表现。比如故障点设在支线末端(如支路24-25)时,失电范围很小,重构可能只需要合上一条联络开关,优化的收益主要在网损和电压改善上;当故障点设在主干线中部时,失电范围大,重构方案的复杂度明显上升,此时正确选择断开哪个分段开关来配合联络开关尤为重要。这些不同场景的结果,都验证了SOCP模型在不同故障条件下的鲁棒性。
4.3 结果校验:跟Matpower对一遍
求解器给出的结果能不能信?我的习惯是必须用独立的潮流计算工具做交叉验证。具体做法是:把优化求解得到的最优开关组合固化到网络拓扑里,然后用Matpower做一次标准的牛顿-拉夫逊潮流计算,对比节点电压和支路潮流。
第一次做这个验证时,我就发现了一个问题:优化结果里某些支路的功率值和Matpower算出来的对不上,误差大概在0.1%到0.5%的量级。追查下来,原因有两个:一是YALMIP默认对SOCP松弛求解使用的是内点法,数值精度在默认容差范围内;二是Big-M系数偏大导致某些断开支路有微小泄露。这个问题在第3.4节我已经讲过了,把M收紧之后误差降到了0.05%以下,完全在工程接受范围内。
值得注意的是,SOCP松弛本身有一个理论性质:当目标函数是网损(关于l_ij的单调增函数)时,松弛是"紧"的,也就是说松弛后的最优解会自动让二阶锥约束达到等号边界,此时松弛问题的最优解就是原问题的最优解。这个性质在配电网重构中天然成立,因为我们的目标函数正好包含网损项。毛刺出现时,多半是数值问题而不是模型松弛问题。这个判断标准在我调试过程中帮了大忙——一旦发现结果不合理,先查数值参数,而不是怀疑模型本身。
5. 工程化落地中绕不开的坑
5.1 松弛不紧怎么办
虽然配电网重构的目标函数通常能保证SOCP松弛是紧的,但如果你在目标函数里加入了其他项或者调整了权重,松弛紧性就可能被破坏。表现是:求解器返回的最优解里某些支路的二阶锥约束是严格不等式,即支路的有功无功组合并不落在线路物理特性的允许边界上,更像一个数学上的"宽松解"。直接用这个解做潮流校核时会发现潮流不收敛,或者潮流结果和优化结果差别巨大。
碰到这种情况,第一步是检查目标函数的单调性。如果目标函数里包含了对某些变量不是单调递增的项(比如对电压的平方项加了权重,或者对某些负荷用了非线性惩罚),SOCP松弛的紧性就没有理论保证了。第二步是尝试减小Big-M,加强支路功率和电流平方的耦合约束,往往能显著改善。
如果上述方法都无效,最后的手段是用SDP(半定规划)松弛代替SOCP。SDP松弛在理论上比SOCP松弛更紧,但计算量明显增大,超过几百个节点的系统跑起来就很吃力了。我在实际项目中通常先跑SOCP,发现问题再用SDP做针对性校核,而不是一开始就上SDP。
5.2 计算时间与大规模系统扩展
IEEE 33节点系统在Gurobi下求解只需几秒,但真实配电网动辄几千个节点、几百个开关,直接跑全模型MI-SOCP,求解时间可能从分钟级直接跳到小时级甚至更大。这在故障恢复场景下是绝对不能接受的。
工程上常用的降维手段有三条路。第一条是故障隔离后缩小优化范围,只对失电区域和相邻带电馈线的边界区域建模,不把整个配电网都放进去。第二条是分级重构策略:第一阶段先快速找到一个满足基本供电安全的可行方案,第二阶段在可行方案基础上做网损优化。第三类是采用Benders分解或列生成技术,把大规模混合整数问题分解成主问题和子问题交替求解,能显著减少单次求解规模。
我在实际项目中另外一个实用技巧是:先用连续松弛(把z变量放宽成[0,1]之间的连续变量)快速求解一次,得到最优目标值的下界和大致的最优拓扑模式。然后用这个结果作为初始解,再跑完整的MI-SOCP,分支定界的剪枝效率会高很多。Gurobi支持设置初始解(通过YALMIP的assign函数给变量赋初值),这个技巧在几百节点以上的算例里能省30%以上的求解时间。
5.3 分布式电源、多时段等扩展方向
现在配电网里分布式光伏越来越普遍,故障重构必须考虑DG接入的影响。DG在故障恢复中的价值有两面性:一方面它可以作为局部电源,在孤岛运行条件下维持部分负荷的供电;另一方面它的出力波动性会让重构方案的电压控制变得更复杂。
在模型层面扩展也不算复杂:DG接入节点在功率平衡方程中要加入发电机出力项,同时要考虑DG的容量上限和出力约束。如果要进一步考虑"主动孤岛"运行,还需要额外加入孤岛频率电压稳定性约束,这是目前研究的热点但工程落地还处于初期。
多时段重构是另一个常见的扩展方向。考虑到故障恢复过程可能持续几个小时,期间负荷在变化、DG出力在变化,单时段静态重构方案可能在一段时间后就变得不优甚至不可行。多时段动态重构的思路是把时间维离散成多个断面,在每个断面都求解一次重构问题,同时约束相邻断面之间开关状态的改变次数。这个模型规模会成倍增长,但物理意义更贴近实际,也是我目前项目里正在推进的方向。
还有一个不算技术但务实的经验:不管模型跑得多漂亮,最终的重构方案一定要确认开关的可执行性和现场通信链路是否正常。配电网自动化系统的执行层如果和优化层脱节,再好的算法也只是纸面方案。我做完每次重构计算后,都会把结果导成开关操作序列表,和现场运维人员核对一遍,宁可多花两分钟确认,也不能让错误信号下发到终端设备。
上面这些内容是我从建模、求解到校核一整套流程里踩过的坑和沉淀下来的经验。如果你正在做配电网重构方向的研究或项目,建议从IEEE 33节点系统开始,先把SOCP模型复现跑通,再做故障隔离和负荷恢复变量的扩展。遇到求解结果不对的时候,记住先检查数值参数再怀疑模型,先把M系列系数调紧,再去查目标和约束的逻辑。代码能跑通只是第一步,能解释结果为什么是这个方案,才算是真正入了门。
