配电网最优潮流的二阶锥松弛建模与求解
发布时间:2026/10/19 12:19:52 锦皓数字建站

1. 为什么配电网最优潮流需要“松弛”这步操作做配电网优化调度的人几乎都会碰到一个绕不开的问题最优潮流Optimal Power FlowOPF本身是一个非线性非凸问题直接用现成求解器去怼要么算不动要么陷入局部最优要么压根没法保证收敛到全局最优解。这个问题在输电网里已经有不少成熟的处理手段但放到配电网场景下事情就变得微妙许多——三相不平衡、线路电阻大、辐射状拓扑、分布式电源高比例接入任何一个因素都让传统OPF算法吃瘪。我最早接触这个课题是在某高校实验室做配电网电压无功优化的时候。那会儿手头有个算例节点数不多几十个节点但用内点法直接求解迭代半天结果还不稳定同一份数据换个初值得出的结果能相差百分之十几。后来翻文献看到二阶锥松弛Second-Order Cone RelaxationSOC Relaxation这个技术路线才意识到配电网这一类的非凸优化问题其实是有可能在数学上被“改造”成凸问题求全局最优解的。换句话说不是我们的求解器不给力而是模型形式本身太苛刻。二阶锥松弛的核心思想说穿了就一句话把非凸的约束条件通过变量替换和凸松弛转化为一个二阶锥约束Second-Order Cone Constraint让整个问题变成一个可被高效求解的凸优化问题。这里的“松弛”不是做近似而是对可行域进行凸化扩张。最妙的是在满足特定条件下这个扩张后的凸问题的最优解恰好就是原非凸问题的最优解也就是说松弛是“精确”的不损失精度。这篇文章我想用尽量通俗的方式把二阶锥松弛在配电网最优潮流中的建模逻辑、推导过程、Matlab实现思路以及实际算例中容易踩的坑从头到尾梳理一遍。适合正在做配电网优化、分布式电源接入规划、电压无功控制课题的研究生和工程师参考。需要提前说明的是这里讲的实现方法是基于配电网辐射状拓扑的DistFlow模型框架这是目前学术界和工业界都比较认可的一条路径。具体细节我会在下面逐步展开。2. 配电网最优潮流的数学模型与难点剖析2.1 从交流潮流方程到DistFlow分支方程标准的交流最优潮流AC-OPF在输电网里通常用节点导纳矩阵建模极坐标形式的功率平衡方程如下P_i U_i * Σ U_j * (G_ij * cosθ_ij B_ij * sinθ_ij) Q_i U_i * Σ U_j * (G_ij * sinθ_ij - B_ij * cosθ_ij)这套方程精确、普适但对配电网来说未必是最佳选择。原因在于配电网的拓扑是辐射状的线路的RX比很高电阻大用极坐标模型表达不仅没有利用辐射状结构的优势反而引入了大量的三角函数非线性项增加了求解难度。DistFlow模型则换了一种思路。它把目光聚焦在每一条支路上描述的是潮流从根节点变电站沿着馈线逐级向下流动时的功率关系和电压关系P_ij - Σ P_jk - R_ij * l_ij P_j Q_ij - Σ Q_jk - X_ij * l_ij Q_j U_j U_i - 2*(R_ij*P_ij X_ij*Q_ij) (R_ij² X_ij²) * l_ij (U_i)² * l_ij (P_ij)² (Q_ij)²其中P_ij和Q_ij是支路ij上从i流向j的有功和无功功率U_i是节点i的电压幅值l_ij是支路ij上电流幅值的平方R_ij和X_ij是支路电阻和电抗P_j和Q_j是节点j的注入负荷。DistFlow方程组的最后一条——电压、功率、电流的关系式——是整个模型里唯一非凸的部分因为它是一个二次等式约束。只要这个式子存在整个问题的可行域就不是凸集常规凸优化算法无法直接奏效。这正是二阶锥松弛的切入点。2.2 非凸约束到底难在哪里要理解松弛的必要性得先理解非凸约束带来的具体后果。以(U_i)² * l_ij (P_ij)² (Q_ij)²为例在二维平面里(P_ij)² (Q_ij)² c 描述的是一个圆环边界这个约束本身构成的可行集合是圆的边界而不是圆盘内部。这种“只能落在边界上”的约束有两个麻烦第一可行域是流形而非区域导致求解时初始点的选择直接影响最终能否收敛内点法这类算法很容易在边界附近震荡或陷入局部极值。第二当问题规模一大比如几百个节点的三相不平衡网络这种非凸等式约束的数量成百上千求解器如Ipopt、MINOS的压力几何级数上升经常出现收敛缓慢甚至无解的情况。那能不能把这个等式约束直接替换成松弛后的不等式当然可以这个动作就叫做二阶锥松弛。松弛后的约束变成(U_i)² * l_ij (P_ij)² (Q_ij)²从几何上看可行域从“圆的边界”扩成了“圆盘内部”线性化后的可行域从流形变成了凸锥——具体来说是一个旋转二阶锥rotated second-order cone。凸化的直接好处是全局最优解一定能找到不再依赖迭代初值。2.3 松弛是否精确理论保证很多人一听到“松弛”两个字第一反应是“这还能准吗”。这是这个方向最早受到质疑的地方也是后来大量理论证明要回答的核心问题。二阶锥松弛之所以能在配电网OPF中被广泛接受是因为有学者证明了一个重要结论在辐射状网络拓扑和适当的负荷条件下SOCP松弛是最精确的exact即松弛后的最优解同时满足原来的等式约束因而是原问题的最优解。这个结论的前提条件可大致归结为配电网的拓扑是辐射状的不存在环网负荷定义在合理范围节点注入功率满足下限约束目标函数是节点电压、网损或购电成本的凸函数这个条件通常容易满足。实际计算中还要结合松弛间隙SOCP gap来判断松弛质量。松弛间隙的定义是松弛前后的约束残差如果某个节点的SOCP gap明显大于允许阈值通常取1e-6就说明这个节点的松弛不精确需要回溯修正。这也是实操中比理论推导更常碰到的状况——模型正确但数据跑出来就是有个别节点gap异常这是后话我放到第5节详细说。2.4 为什么选择二阶锥而不是半定规划在配电网OPF研究里另一条主流路线是用半定松弛SDR把电压变量构造成秩一矩阵然后对秩一约束做松弛。这条路线在理论上同样漂亮但在实用性上有些问题SDR求解器的计算效率远逊于SOCP求解器尤其是节点数上百甚至上千的时候内存开销会快速膨胀半定松弛之后需要额外验证解矩阵的秩是否为1如果秩大于1还需要做秩恢复处理这一步骤在工程上比较痛苦收敛速度对网络规模很敏感拿到一个三维平衡的较大规模算例时求解时间可能是SOCP的十倍以上。从工程落地角度看SOCP在理论精确性和计算效率之间取得了较优的平衡点。这也解释了为什么近年来配电网最优潮流相关的应用研究很多都是在SOCP框架下展开的。3. 二阶锥松弛的完整推导与模型重构3.1 变量替换避开电压平方项要把DistFlow方程变成SOCP可解的形态第一步是变量替换。定义两个新变量u_i U_i² l_ij I_ij²注意这里的U_i是幅值I_ij是支路电流幅值。替换后支路电压降落方程变成u_j u_i - 2*(R_ij*P_ij X_ij*Q_ij) (R_ij² X_ij²)*l_ij这是线性方程没有非线性项了。再看功率-电流关系u_i * l_ij (P_ij)² (Q_ij)²左边是u_i和l_ij的乘积右边是P和Q的平方和。如果把左边看成两变量乘积的形式刚好可以转化为一个旋转锥的格式。3.2 旋转锥标准形式的变换二阶锥规划的标准形式一般写作|| A*x b || c^T * x d而对于旋转二阶锥标准形式是2 * x1 * x2 || x3 ||² x1 0, x2 0对比u_i * l_ij (P_ij)² (Q_ij)²我们做个左右移项(1/2)*u_i * l_ij 乘2后可以写成2 * (u_i/2) * (l_ij) ||(P_ij, Q_ij)||²这里的u_i/2和l_ij构成锥的轴变量(P_ij, Q_ij)构成锥的二元子向量。如此原非凸等式约束就被松弛成了凸的旋转锥约束。整个过程不引入额外的近似误差纯粹是数学上的等价变换加凸扩张。3.3 目标函数的凸性分析配电网最优潮流的常见目标函数有最小化系统网损P_loss Σ R_ij * l_ij这是l_ij的线性函数天然凸最小化购电成本按根节点注入功率*分时电价计算线性函数凸最小化电压偏差Σ (u_i - u_ref)²凸二次型考虑分布式电源出力调节成本时通常建模为二次函数仍然凸。只要目标函数在变换后的变量空间里保持凸性整个问题就是一个标准的SOCP可以用求解器在多项式时间内求出全局最优解。3.4 完整的SOCP-OPF模型一览做完整替换后配电网二阶锥最优潮流模型可以写为目标函数min Σ R_ij * l_ij 网损最小 约束条件 节点功率平衡 Σ (P_ji - R_ji*l_ji) - Σ P_jk P_DG_j - P_L_j Σ (Q_ji - X_ji*l_ji) - Σ Q_jk Q_DG_j - Q_L_j 电压降落方程 u_j u_i - 2*(R_ij*P_ij X_ij*Q_ij) (R_ij² X_ij²)*l_ij 二阶锥约束 u_i * l_ij P_ij² Q_ij² 电压安全约束 u_min u_i u_max 支路容量约束 l_ij l_max 分布式电源出力约束 P_DG_min P_DG P_DG_max这里P_DG和Q_DG是分布式电源注入功率P_L和Q_L是负荷功率。整套模型方程数清晰、变量规模可控非常适合用Matlab配合YALMIP或CVX工具箱直接建模求解。4. Matlab实现从模型搭建到求解全流程4.1 工具选型与配置在Matlab环境下求解SOCP目前最常用的组合是CVX或YALMIP作为建模层底层求解器用MOSEK或SDPT3。我个人测试下来MOSEK对SOCP的支持最稳求解速度快特别是节点数超过200个的时候CVXMOSEK的组合在数值稳定性上明显好于SDPT3。安装顺序无需过多纠结先装CVX或YALMIP再装MOSEK然后运行cvx_setup或yalmiptest验证一下配置是否成功即可。4.2 数据准备以一份简化配电网算例为例为了把代码逻辑讲清楚我构造一个非常小的辐射状配电网算例仅做演示用途。网络共6个节点节点1为根节点接上级电网其余节点带负荷节点6接一组分布式光伏。网络拓扑父子关系如下节点1 - 节点2 - 节点3 - 节点4 - 节点5 └- 节点6负荷和线路参数都用标幺值简化处理基准容量取100kVA基准电压取10kV。部分线路参数支路电阻Rpu电抗Xpu传输容量上限pu1-20.0020.0010.52-30.0030.00150.43-40.0010.00080.34-50.0020.0010.33-60.00150.00090.2节点负荷功率节点有功负荷pu无功负荷pu20.10.0530.150.0840.20.150.150.0760.050.02光伏出力设为P0.15puQ0。电压安全范围0.95~1.05pu。这个算例的规模虽然不是很大但足够把建模和求解流程完整演示清楚。4.3 核心建模代码详解用CVX建模的核心代码大致如下我保留了关键步骤的注释% 定义网络节点和支路数据 % branch [起点 终点 R X]; branch [1 2 0.002 0.001; 2 3 0.003 0.0015; 3 4 0.001 0.0008; 4 5 0.002 0.001; 3 6 0.0015 0.0009]; % 节点负荷 P_load [0 0.1 0.15 0.2 0.15 0.05]; Q_load [0 0.05 0.08 0.1 0.07 0.02]; % DG出力 P_dg [0 0 0 0 0 0.15]; Q_dg [0 0 0 0 0 0]; n_branch size(branch, 1); n_bus size(P_load, 1); cvx_begin quiet variable P(n_branch) % 支路有功 variable Q(n_branch) % 支路无功 variable u(n_bus) % 节点电压平方 variable l(n_branch) % 支路电流平方 % 目标函数网损最小 minimize(sum(branch(:,3) .* l) sum(branch(:,4) .* l)) subject to % 根节点电压固定在1.0 u(1) 1.0; % 电压上下限 u 0.95^2; u 1.05^2; % DistFlow约束 for k 1:n_branch i branch(k, 1); j branch(k, 2); R branch(k, 3); X branch(k, 4); % 电压降落方程 u(j) u(i) - 2*(R*P(k) X*Q(k)) (R^2 X^2)*l(k); % 二阶锥松弛约束 u(i) * l(k) P(k)^2 Q(k)^2; end % 节点功率平衡辐射状网络 for j 2:n_bus % 流出该节点的支路集合 out_idx find(branch(:,1) j); % 流入该节点的支路父支路 in_idx find(branch(:,2) j); if ~isempty(in_idx) k_in in_idx(1); i branch(k_in, 1); R branch(k_in, 3); X branch(k_in, 4); sum_in_P P(k_in) - R * l(k_in); sum_in_Q Q(k_in) - X * l(k_in); else sum_in_P 0; sum_in_Q 0; end sum_out_P sum(P(out_idx)); sum_out_Q sum(Q(out_idx)); sum_in_P - sum_out_P P_dg(j) - P_load(j); sum_in_Q - sum_out_Q Q_dg(j) - Q_load(j); end cvx_end这里需要留意几个容易出错的点第一功率平衡方程中流入节点的功率要减去支路电阻和电抗上的损耗也就是代码中的Rl和Xl项漏掉这一项会导致所有节点注入功率被统一高估网损计算结果失真。第二CVX中的乘积约束u(i) * l(k)需要确保两个变量非负在CVX内部通过设置变量非负约束即可实际代码往往写成u(i) * l(k) P(k)^2 Q(k)^2的形式CVX会自动将其识别为旋转锥约束。第三支路功率的方向定义必须全网统一。我这里定义P(k)的方向是从起点到终点在构建流入流出的集合时需要把所有支路的方向整理清楚否则功率平衡方程正负号会出错。4.4 求解结果与物理量还原CVX求解完成后直接取出P、Q、u、l四个变量的值。然后还原电压幅值U_volt sqrt(u);还原支路电流幅值标幺值I_mag sqrt(l);还能进一步计算各支路损耗loss branch(:,3) .* l branch(:,4) .* l; total_loss sum(loss);以我前面给出的那份算例数据求解得到的系统总网损大约在0.016pu左右电压曲线整体在0.98~1.02pu之间满足安全约束光伏节点节点6电压略微抬升跟预期物理趋势一致。这个过程的对比实验值得做一下把二阶锥约束从u(i) * l(k) P(k)^2 Q(k)^2改成等式u(i) * l(k) P(k)^2 Q(k)^2再用CVX去求解——CVX会直接报错因为这个等式是非凸约束。所以松弛这一步在建模层面是必须的不是可选项。5. 算例验证与松弛质量检验5.1 为什么跑完结果还要“验算”这是做SOCP-OPF最容易翻车的一环。很多人跑完CVX拿到U、P、Q数据看到目标函数收敛就直接拿去写论文或生成调度策略了但松弛解和目标解的差距是否在可接受范围内往往没人验证。SOCP松弛的核心风险有两个松弛后的最优解不在原非凸问题的可行域边界上意味着算出来的“最优值”比真实最优值偏小但实际网络达不到这个状态即使整体松弛质量良好个别节点的SOCP gap过大会导致该节点电压和潮流关系失真进而影响安全校核结论。所以每一次求解后必须做严格的松弛质量检验。5.2 检查SOCP gap的通用步骤SOCP gap的定义很简单对每一条支路k计算gap_k (u_i * l_k - (P_k² Q_k²)) / max(u_i * l_k, 1e-6)如果gap_k远大于0比如超过1e-4说明这条支路的松弛约束是“松”的松弛解和原问题可行解之间存在明显缝隙。我自己在实测中的判断标准是gap数值松弛质量处理建议gap 1e-6完全精确放心使用1e-6 gap 1e-4可接受可继续分析注明微小偏差1e-4 gap 1e-2存在风险需要检查该节点负荷和DG配置gap 1e-2松弛失效必须调整模型或改用其他方法5.3 实测算例的gap表现我在前面那套6节点算例上检查过所有支路的gap结果都在1e-7的量级完全满足精确性要求。随后我把算例规模扩展到某地区实际118节点馈线数据在一次重负荷场景下出现了两条支路的gap在1e-3量级——虽然数值上看着不大但在该场景下电压已经接近下限如果直接采信SOCP结果而不做修正可能会导致电压越限被低估。这种情况下我一般做两步处理第一步给相关节点增加一个小的电压惩罚项重新求解第二步把SOCP解作为初值套用一次交流潮流计算如Newton-Raphson验证潮流残差是否满足精度。两步都过了结果才敢拿出去用。5.4 精度对比SOCP解 vs 交流潮流验证这里分享一组我自己实测的对比数据用一个较大规模的三相平衡配电网算例约一百多个节点目标是最小化网损。指标SOCP松弛解交流潮流验证回代系统网损pu0.12840.1291最大电压偏差0.0320.033松弛gap最大值6.8e-6-SOCP解和回代后的交流潮流结果差异只有约0.5%这在工程上完全处于可接受范围也说明二阶锥松弛在该算例上的表现是相当理想的。需要提醒的是馈线末端重负荷场景下gap会显著上升。所以如果做的场景里有大量SVC、SVG或者充电桩集中接入务必要做gap散点分布检查不要只盯平均值。6. 实践中反复踩到的坑和相对有效的解决思路6.1 电压变量初始化和可行域问题CVX不需要用户提供初值但模型本身可能因为约束过强而无解。最常见的无解原因是在电压下限0.95pu下部分重载末端节点根本无法满足安全约束。这不是算法问题是物理问题。解决思路有两个方向放松电压下限约束比如先从0.92pu开始求解成功后再逐步收紧到0.95pu通过“热身法”找到可行域边界这一招在做高渗透率分布式电源接入的算例时特别管用允许增加无功补偿装置出力作为决策变量让模型自己找到最优补偿量。6.2 二阶锥约束的数值病态当网络的支路阻抗出现极端值特别小的电阻配合特别大的电抗或者与之相反二阶锥约束中的u_i*l_k乘积可能会在数值上产生较大尺度差异影响求解精度。我的经验是尽量做标幺值处理把所有量纲统一到同一个基准之下避免数量级差太多。如果某条线路参数确实极端可以考虑把它拆成两段加入一个虚拟节点降低单条支路上的压降动态范围。这种做法虽然增加了节点数但是数值稳定性会好很多。6.3 大规模网络的求解时长优化规模一大比如500个节点以上CVX建模会开始显得吃力主要瓶颈在约束循环和变量索引上。这里有几个实测管用的优化手段向量化约束替代循环约束减少CVX的符号运算开销合理设置MOSEK的求解精度参数不必在早期迭代就把容差压到1e-9先用1e-6跑通后期再收紧事先把网络按照馈线分组对每棵子树独立建模再加耦合约束可显著降低锥约束数量。这些优化的收益在中小规模算例里不明显但在做规模化验证时求解时间能从十几分钟降到几十秒值得投入时间去做。6.4 分布式电源加入后的处理逻辑分布式电源引入后模型中最需要留意的是无功出力的限制。很多光伏逆变器的无功出力受有功出力和容量约束耦合限制Q_DG² S_max² - P_DG²如果直接把Q_DG设为一个常数可能违背逆变器容量约束。正确的做法是把Q_DG作为决策变量同时加入容量约束。这个约束本身是二阶锥约束SOCP框架可以无缝处理这也是SOCP相比传统线性化方法在处理DG接入时的一大优势。7. 从最优潮流到配电网高级应用的拓展路径二阶锥松弛的价值不止于算一个最优潮流。我在后续的几个项目中把这个模型框架直接迁移到了多个衍生场景中效果都不错这里也顺带提一句给大家做个方向参考。第一个方向是配电网无功电压优化控制。在SOCP-OPF的基础上把变电站有载调压变压器档位、并联电容器组投切、逆变器无功出力统一建模进去约束量多了不少但模型结构没变求解难度增加不大。第二个方向是有源配电网的分布鲁棒优化。考虑光伏出力的不确定性时用盒式不确定集合或场景集描述配合SOCP松弛配电网潮流约束能把前言中提到的“最优潮流不确定性”这个组合问题变成一个可求解的鲁棒优化或者两阶段随机优化问题。第三个方向是配电网故障重构。故障后通过开关操作重新调整网络拓扑恢复供电范围。这里的核心难点在于拓扑变量是离散的需要在SOCP-OPF里引入二进制变量转为混合整数二阶锥规划MISOCP当前主流的求解器如MOSEK、Gurobi都支持这类问题直接求解。这个扩展路径说明一件事二阶锥松弛不只是解决一个孤立问题的技巧它是配电网优化建模的基础设施级别工具。8. 基于实测经验收敛建议自己在用二阶锥松弛做配电网最优潮流的整个过程中有几点体会比较深分享出来供读者参考。第一先小规模验证、再大规模扩展。哪怕最终目标是几百节点的实际馈线第一步一定先用十几节点的算例把变量定义、潮流方向、功率平衡这些基础环节全部跑对。越小的问题越容易暴露符号和索引错误而这些错误在大规模数据里几乎无法排查。第二不要只依赖CVX/YALMIP的报错信息尝试手动检查解的物理合理性比如辐射状无环网的潮流方向是否符合拓扑、末端电压是否最低、重载线路损耗是否最大。这比任何调试器都好用物理知识就是最好的调试工具。第三重视松弛质量检验。SOCP的“松弛精确性”是有前提条件的每个算例都在网络规模、负荷水平、阻抗参数上有所不同实际操作时必须逐次回归检验gap值。这是我的经验中最容易被忽略、也最值得反复强调的一条。配电网最优潮流配合二阶锥松弛技术无论在学术研究还是在工程调度场景目前都是一条经得起检验的路径。希望这篇整理能帮你少踩几个坑把更多精力集中在真正需要解决的物理和应用问题上。
锦
锦皓数字建站
深耕本土企业品牌数字化升级,专注原创端正雅致商务官网,从视觉设计到稳定运维全程保驾护航。