做配电网仿真这几年最让我头疼的问题之一就是无功优化。目标函数和约束条件看似简单但真上手写代码会发现潮流方程里全是电压平方、电流平方、还有P²Q²耦合模型天然是非凸非线性。以前用内点法或遗传算法硬解要么收敛不稳定要么解出来一堆“看着可行、实际不敢用”的局部最优。最近我把“基于二阶锥规划的配电网无功优化算法”在IEEE33节点系统上从头到尾跑通了一遍从DistFlow潮流模型到二阶锥松弛的数学推导再到Matlab代码实现整条链路都理顺了。这篇文章就把这套方法的核心逻辑、建模细节和调试经验完整写出来给正在做配电网电压控制、分布式电源接入评估、或者写相关课题代码的同行做一个可直接上手的参考。先说清楚这套东西能解决什么问题。配电网里的无功资源无非是电容器组、静止无功补偿器、分布式电源的无功调节能力优化目标通常是最小化网络损耗、改善电压分布、提高新能源消纳能力。传统方法要在非线性约束下反复迭代求可行解优化效率低且稳定性差。二阶锥规划的核心思路是把原本非凸的潮流约束松弛成凸的锥约束让问题变成一个能够高效求解、且能保证全局最优的凸优化问题。这个方法非常适合IEEE33这种中等规模的辐射状配电网也是目前学术界和工程界做配电网优化调度最主流的技术路线之一。这篇文章适合三类读者一是刚接触配电网优化、想看明白模型怎么从非线性变成凸问题的人二是手头有Matlab但不太确定怎么用优化工具箱建模的工程师三是已经能跑通普通潮流计算、想进一步做分布式电源无功协调控制的同学。文章里会给出完整的模型推导、代码片段、参数设置和避坑经验你可以照着思路复现到自己的算例上。1. 项目全景为什么选二阶锥规划做配电网无功优化配电网无功优化本质上是一个带约束的最优化问题给定网络拓扑和负荷分布通过调节各节点的无功注入使得目标函数最小。目标函数可以是系统网损最小、电压偏差最小、或者两者加权组合。约束条件包括潮流平衡方程、节点电压上下限、支路容量限制、无功设备调节范围等。这听起来很常规但关键难点就在潮流约束上。配电网的潮流计算不像输电网那样可以用简化的直流潮流近似因为配电网电阻电抗比大、电压等级低、分布式电源接入点多必须用完整的交流潮流模型。交流潮流方程中有电压幅值的平方项、支路电流的平方项、有功无功的乘积项这些使可行域不是凸集。非凸意味着什么意味着用传统非线性规划求解器去搜只能保证找到局部最优解而且求解时间随网络规模增长非常不稳定。对于调度决策来说这个“局部最优”是不能接受的因为你不知道还有没有更优的解存在。二阶锥规划则为这个问题提供了一个漂亮的出路。它属于凸优化范畴一旦把非凸约束成功转写成二阶锥约束求解器就能在多项式时间内找到全局最优解。凸优化还有一个工程上很友好的特性最优解唯一且稳定不会因为初值设置不同就跑出千奇百怪的结果。这一点对后续做日内滚动优化、多场景分析特别重要。我在实际执行中的感受是二阶锥规划相比传统智能优化算法最大的优势在于可复现性。用遗传算法跑同一个算例十次可能有八种不同的结果而用二阶锥规划配一个成熟的锥规划求解器每次跑出来结果完全一致。对做工程报告和学术研究的人来说这个确定性太重要了至少不会被导师或评审质疑“结果怎么又变了”。另外IEEE33节点系统在这个领域扮演的角色有点像深度学习领域的MNIST是大家都认可的标准化算例。它规模适中辐射状拓扑清晰全网参数公开结果可以横向对比。这也是为什么我推荐在这个系统上先跑通基本流程再移植到自己的实际网络中。2. 核心模型拆解从潮流方程到二阶锥松弛的推导过程很多人看到“二阶锥规划”这个词就被吓住了觉得是高深数学。其实拆开看里面的逻辑并不复杂关键在于理解两个事情一是配电网潮流方程长什么样二是怎么通过变量替换和不等式松弛把它变成一个凸问题。2.1 目标函数设计网损和电压偏差怎么选在IEEE33节点系统上我采用的是网损最小化目标这是无功优化最经典的目标形式。系统总网损可以表示为所有支路电阻损耗之和Ploss Σ(r_ij · L_ij)其中r_ij是支路电阻标幺值L_ij是支路电流幅值的平方。注意这里用电流平方而不是电流本身原因后面会说——因为我们做变量替换时用的就是电流平方。如果你更关心电压质量可以把目标改成电压偏差最小化形式通常是min Σ(U_i - U_ref)²U_i是节点电压平方U_ref是期望电压平方。也可以把网损和电压偏差加权组合权重根据实际需求设定。在我这个算例里网损最小化作为主目标已经能带动电压改善因为电压偏低往往伴随着网损偏高两者在大多数场景下是同向变化的。2.2 约束条件配电网必须满足哪些物理和运行边界配电网的交流潮流约束可以用支路潮流方程来描述这套方程在文献里常叫DistFlow模型。对于一个辐射状网络每条支路k连接节点i和节点j标幺值下的支路潮流方程如下有功平衡P_ij - r_ij·L_ij ΣP_jk P_Lj - P_Gj 无功平衡Q_ij - x_ij·L_ij ΣQ_jk Q_Lj - Q_Gj 电压降落U_j U_i - 2(r_ij·P_ij x_ij·Q_ij) (r_ij² x_ij²)·L_ij其中P_ij和Q_ij是支路末端流出的有功和无功功率P_Lj和Q_Lj是节点j的负荷P_Gj和Q_Gj是节点j注入的分布式电源功率U和L分别是节点电压平方和支路电流平方。除了潮流约束还要加上运行边界节点电压约束U_min ≤ U_i ≤ U_max典型范围是0.95²到1.05²支路容量约束P_ij² Q_ij² ≤ S_max²分布式电源出力约束P_Gj² Q_Gj² ≤ S_DG²电容器组等无功设备出力范围约束这套约束在物理上完备但问题在于潮流方程中隐含着P、Q、U、L之间的非线性耦合关系。尤其是支路电流和功率之间满足L_ij (P_ij² Q_ij²) / U_i这个等式是非凸的直接把整个模型变成了非凸优化问题。2.3 二阶锥松弛的本质怎么把“非凸”变“凸”现在到了最核心的一步把不可处理的等式约束松弛成不等式。关键在于观察上面那个等式L_ij (P_ij² Q_ij²) / U_i。我们不去要求它严格成立而是把它改成L_ij ≥ (P_ij² Q_ij²) / U_i这个不等式等价于|| (2P_ij, 2Q_ij, L_ij - U_i) ||₂ ≤ L_ij U_i左边是向量的2范数右边是线性表达式。一个包含2范数小于等于线性表达式的约束就是标准的二阶锥约束。二阶锥约束是凸的这一点可以直接验证锥集合在几何上是一个凸锥任意两点连线段上的点仍然落在锥内。所以整个问题从非凸NLP变成了凸SOCP。这个转化的代价是什么代价是放宽了约束条件。原来的严格等式变成了不等式意味着可能存在一些数学上满足松弛约束、但物理上并不严格对应的点。不过理论和实践都表明对于辐射状配电网的无功优化问题只要目标函数中网损项随着L_ij单调递增求解器就有强烈的动机把L_ij压到尽可能小最终会落在锥的边界上即松弛是“紧”的。换句话说松弛后的最优解通常恰好满足原来的等式约束不存在信息损失。我在代码里做得比较稳妥的一件事是求出最优解之后回代检查每个支路的锥约束缝隙也就是计算L_ij·U_i和P_ij²Q_ij²之间的相对误差。这个检查不用多复杂但是能让你对“松弛紧不紧”心里有数。如果某个支路的缝隙很大就要警惕模型或者数据有问题。3. IEEE33节点系统与测试算例搭建模型推导清楚之后下一步就是搭算例。IEEE33节点系统是个很成熟的测试平台全网参数标准化做电力系统方向的人几乎都见过它。3.1 从标准数据到可计算模型IEEE33节点系统的基本结构是一个12.66kV的配电网节点1是变电站出口作为松弛节点其余节点通过32条支路以辐射状连接。系统总负荷大约是3715kW加2300kvar节点分布从1一直到33其中有几个节点是不带负荷的联络节点。在编程之前需要先做两件事一是确定基准值二是把原始物理单位参数转换成标幺值。我用的基准功率是10MVA基准电压是12.66kV这样阻抗基准值Zbase Ubase² / Sbase ≈ 16.02Ω。网上流传的IEEE33节点参数大多以欧姆为单位需要统一除以Zbase转成标幺值。这一步看着简单但特别容易出问题。有人直接用有名单位建模结果节点电压标幺值计算出来只有0.000几或者约束范围设置跟物理值不匹配怎么调都收敛不了。先说结论强烈建议统一转成标幺值再建模数值稳定性完全不是一个量级。以下是我在算例里用到的系统基础参数汇总项目数值说明基准电压12.66 kV配电网额定电压基准功率10 MVA标幺化基准节点总数33节点1为松弛节点支路总数32辐射状拓扑系统有功负荷3715 kW全网总负荷系统无功负荷2300 kvar全网总负荷电压运行范围0.95~1.05 pu优化约束边界3.2 分布式电源和补偿设备怎么接原始的IEEE33节点系统没有分布式电源所以做无功优化时需要在部分节点接上分布式电源否则无功调节手段太少优化效果不明显。我采用的接入方案是这样的分布式电源/设备接入节点容量/范围类型分布式电源118400 kW无功可调光伏逆变器分布式电源222400 kW无功可调光伏逆变器分布式电源325500 kW无功可调风电机组分布式电源433400 kW无功可调光伏逆变器电容器组120~300 kvar离散可调分组电容器这个接入方案有一定的典型性分布式电源分散接在馈线中后段因为这些位置距离松弛节点远、电压支撑弱最能体现无功优化的作用。电容器组装在节点12该节点处于中段电压相对较弱的位无功补偿效果明显。需要说明的是接入节点的选择和容量大小属于“算例设置”不是IEEE33系统的标准配置。每个人做研究时的接入方案可以不同但这套流程不依赖具体的接入位置你换成自己的DG接入机照样能跑。3.3 算例参数一览整个算例的参数设置如下电压上下限取0.95和1.05标幺值分布式电源采用有功固定、无功可调的运行模式每台DG的无功输出范围由其剩余容量决定。电容器组作为离散无功设备我把它建模成可投切的整数变量投切步长为100kvar。目标函数选择全网有功损耗最小。优化前先跑一遍不加任何控制的潮流得到一个初始断面作为对比基准。这个初始结果很有意思系统网损约为202.68kW最低电压出现在节点18附近约为0.913标幺值已经逼近电压越限边缘。这说明如果不做无功优化这个系统在峰值负荷下是有电压风险的。4. Matlab代码实现与关键代码段解析现在到了最实用的部分怎么用Matlab把这套模型变成可运行的代码。我这里用的是YALMIP建模方式它像一个翻译层把数学约束直接映射成代码然后把模型交给底层的锥规划求解器去解。4.1 数据录入与拓扑检查第一步是把IEEE33节点的拓扑和参数录入Matlab。我的习惯是用矩阵存支路参数每一行对应一条支路格式为起始节点、终止节点、电阻标幺值、电抗标幺值。% 支路数据起始节点终止节点电阻R(pu)电抗X(pu) branch [ 1 2 0.005820 0.003844; 2 3 0.004608 0.003042; 3 4 0.003090 0.002040; % ... 其余支路省略实际代码中补全32条 18 33 0.002064 0.001364; % 末段联络支路 ]; % 负荷数据节点号有功(kW)无功(kvar) load_data [ 2 100 60; 3 90 40; % ... 其余节点负荷省略 ]; % 基准值转换 Ubase 12.66e3; % 基准电压伏 Sbase 10e6; % 基准功率伏安 Zbase Ubase^2 / Sbase; branch(:,3) branch(:,3) / Zbase; % 电阻转标幺 branch(:,4) branch(:,4) / Zbase; % 电抗转标幺 load_data(:,2:3) load_data(:,2:3) / Sbase; % 负荷转标幺节点编号从1到33其中节点1是松弛节点。代码里还应该检查网络连通性确保没有孤岛节点。我在调试时遇到过支路数据漏写一条的情况导致节点12直接和系统失联优化结果看起来“正常”但实际是缺了一个节点的解。后来我加了一段自动检查代码从节点1出发按照支路连接关系做广度优先遍历遍历到的节点数如果是32而非33说明数据有缺失。4.2 决策变量建模与目标函数决策变量选取是整个建模最关键的一步。对于SOCP模型我们不直接用电压幅值和电流幅值而是用它们的平方值作为变量这在数学上让约束变得友好。% 决策变量 U sdpvar(33, 1); % 节点电压平方标幺值 L sdpvar(32, 1); % 支路电流平方标幺值 P sdpvar(32, 1); % 支路有功功率标幺值 Q sdpvar(32, 1); % 支路无功功率标幺值 Pg sdpvar(33, 1); % 节点注入有功分布式电源标幺值 Qg sdpvar(33, 1); % 节点注入无功分布式电源标幺值 % 目标函数全网支路电阻损耗最小 objective sum(branch(:,3) .* L);目标函数非常简单就是电阻向量和电流平方向量的内积。注意这里没有把变压器自身的损耗算进去因为IEEE33系统就一个松弛节点变压器损耗可以忽略或者作为常数叠加。4.3 潮流约束和二阶锥约束的YALMIP编码约束编码是重点。我先把DistFlow的功率平衡约束和电压降落约束用YALMIP循环表达出来。cons []; % 松弛节点电压固定 cons cons [U(1) 1.00]; % 节点1电压标幺值为1 % 遍历每条支路建立潮流约束 for k 1:32 i branch(k,1); % 支路首端 j branch(k,2); % 支路末端 r branch(k,3); x branch(k,4); % 节点功率平衡净注入 负荷 - 分布式电源 % 每个非松弛节点的功率平衡通过流入流出汇总建立 % 这里采用节点注入的方式表达 end % 电压降落约束 for k 1:32 i branch(k,1); j branch(k,2); r branch(k,3); x branch(k,4); % 必须求出该支路对应的从i流向j的功率 % U_j U_i - 2*(r*P_k x*Q_k) (r^2 x^2)*L_k cons cons [U(j) U(i) - 2*(r*P(k) x*Q(k)) (r^2 x^2)*L(k)]; end % 二阶锥松弛约束 for k 1:32 i branch(k,1); % 锥约束的完整表达 cons cons [norm([2*P(k); 2*Q(k); L(k)-U(i)]) L(k)U(i)]; end功率平衡的部分我没有在片段中完全展开因为它需要按照每个节点的父支路和子支路关系来写。具体做法是对每一个节点j先从支路矩阵找出所有“末端节点等于j”的支路这些是从父节点流入j的功率再找出所有“起始节点等于j”的支路这些是流向子节点的功率。然后建立等式流入j的功率 - 流出j的功率 - 支路损耗 节点负荷 - 分布式电源出力用YALMIP表达就是for j 2:33 in_idx find(branch(:,2) j); % 流向节点j的支路 out_idx find(branch(:,1) j); % 从节点j流出的支路 % 有功平衡所有流入减去流出的有功 负荷有功 - 电源有功 cons cons [sum(P(in_idx)) - sum(P(out_idx)) load_data(j,2) - Pg(j)]; cons cons [sum(Q(in_idx)) - sum(Q(out_idx)) load_data(j,3) - Qg(j)]; end这里有个容易被忽略的细节如果某个节点既有父支路又有子支路上面的公式是对的如果是末端节点out_idx为空sum取空数组在YALMIP里会自动变成0。这个形式对辐射状网络通用不需要手动指定每条支路的父子关系。4.4 分布式电源和电压范围约束接下来是边界约束。分布式电源的容量约束是一个圆形可行域有功固定时无功可调范围受到逆变器容量限制。用YALMIP表示% 电压上下限约束 cons cons [U 0.95^2]; cons cons [U 1.05^2]; % 分布式电源有功出力固定为额定值 dg_nodes [18, 22, 25, 33]; dg_power [0.04, 0.04, 0.05, 0.04]; % 标幺值对应400kW/400kW/500kW/400kW Pg(dg_nodes) dg_power; % 分布式电源容量约束无功出力不超过剩余容量 for k 1:length(dg_nodes) n dg_nodes(k); S_dg [0.05, 0.05, 0.06, 0.05]; % 对应逆变器容量 cons cons [Qg(n)^2 S_dg(k)^2 - Pg(n)^2]; end % 电容器组约束离散变量节点12 % 使用整数变量表示投切组数每组100kvar Ctap intvar(1,1); cons cons [Ctap 0, Ctap 3]; Qg(12) 0.01 * Ctap; % 每组对应0.01标幺值(100kvar/10MVA)这里有一个非常实用的经验如果模型里加入了整数变量比如电容器组的投切组数求解难度会显著上升。在实际的代码实现里我分两步走第一步先不考虑电容器组的整数约束把它的无功输出当成连续变量来优化第二步再把结果作为初值加上整数约束重新求解。这样既利用了二阶锥快速求连续解的优势又能在最终解里体现投切设备的离散特性。4.5 求解器调用与结果提取建模完成之后就是调用求解器求解。YALMIP的优势在于不需要你手动指定用哪种求解器你把问题丢给它它自动判断问题类型并选择已安装的合适求解器。% 指定使用锥规划求解器 options sdpsettings(solver, sedumi, verbose, 2, debug, 1); sol optimize(cons, objective, options); % 检查求解状态 if sol.problem 0 disp(求解成功); else disp([求解出现问题, sol.info]); end % 结果提取与还原 U_opt sqrt(value(U)); % 电压幅值标幺值 U_kv U_opt * Ubase / 1000; % 电压幅值千伏 Ploss_opt value(objective) * Sbase / 1000; % 网损千瓦我把求解成功后的电压幅值还原成了物理量网损也从标幺值乘回基准功率转成千瓦。这样在后续画图和写报告时不需要再换算一次减少出错概率。求解器的选择上有一点值得说如果环境里装了多个求解器YALMIP默认会按一定优先级自动挑选。在实际项目中我通常显式指定求解器因为不同求解器对初始点设置、可行性容差、数值稳定性的处理差异很大。换成商业求解器后大算例的求解时间可能有几十倍的差距但收敛精度和鲁棒性提升同样明显。5. 仿真结果分析优化前后差在哪模型跑通之后最重要的就是看结果到底改了什么。在这个算例中无功优化的效果非常直观优化前后的差异主要体现在电压水平、网络损耗和分布式电源出力三个方面。5.1 电压分布对比先看电压分布。优化前全网最低电压出现在节点18只有0.913标幺值已经低于0.95的运行下限属于实际运行中不允许出现的欠压状态。优化后最低电压提升到了约0.986标幺值所有节点电压都回到安全范围内电压分布曲线整体上移。这里有个值得注意的技术点电压改善之所以这么明显是因为分布式电源在提供有功的同时还利用剩余容量向系统注入了感性无功。在辐射状配电网中无功功率从松弛节点向负荷节点流动是导致电压降落的主要原因之一而分布式电源就地注入无功直接减少了远端节点的无功缺额相当于“就近支援”电压支撑效果自然明显。指标优化前优化后最高电压/pu1.0001.025最低电压/pu0.9130.986平均电压/pu0.9480.997电压越限节点数805.2 网络损耗与降损效果再看网损。这个算例的网络损耗从优化前的202.68kW降到了优化后的143.76kW降幅约为29%。这个降幅在配电网无功优化研究里属于中等偏上的水平因为基础网损较大分布式电源接入数量也比较多调节空间充足。网损下降的原因可以从支路损耗公式来解释支路有功损耗等于电阻乘以电流平方。在输送功率基本不变的前提下提高电压水平、就地补偿无功功率能减少流经支路的无功电流电流幅值下降损耗自然减小。这个逻辑跟高压输电补偿无功的道理是一致的。指标优化前优化后全网有功损耗/kW202.68143.76损耗下降比例-29.1%单位电量损耗/(kW·h/万kW·h)54.638.75.3 分布式电源出力的合理性校验优化结果里还需要验证设备出力是否落在合理范围内。我在结果提取后做了一层常规检查所有分布式电源的无功出力是否满足容量约束电容器组的投切组数是否为整数且在限定范围内所有节点电压是否在上下限内所有支路功率是否在容量范围内我这个算例中节点22的无功出力恰好达到了容量上限其余DG都有一定裕量电容器组投了300kvar全部投入。这个结果在物理上是可以合理解释的节点12和节点22本身就是电压较弱的区域无功资源优先投放在这些关键节点符合直觉。还有一个细节值得注意优化后某些末端节点的电压有轻微超过1.0的情况但仍在1.05以内。分布式电源注入无功在抬升末端电压的同时也带来过电压风险尤其是轻负荷时段。所以实际调度中往往需要结合多时段场景做协调不能只看单一断面。这也是我在这篇文章末尾想提醒大家的一点。6. 实测避坑建模与调试经验记录从模型推导到代码跑通我前前后后踩了不少坑。下面这些经验不是教科书里会写的内容都是实际操作中踩过之后才总结出来的。6.1 标幺值不一致导致的不收敛我一开始建模时支路阻抗用欧姆表示电压用伏表示负荷用兆瓦表示结果整个模型数值尺度相差十几个数量级YALMIP报了一堆数值警告求解器怎么也收敛不了。后来把单位统一处理成标幺值电压范围用0.95²到1.05²功率、阻抗、电流全部基于同一套基准值换算问题立刻消失。这条经验我可以直接告诉你做配电网优化先把单位统一了再谈建模否则后面每一个阶段都会被数值问题折磨。6.2 负荷符号方向搞错第二个坑是功率平衡约束里的符号方向。DistFlow模型中负荷作为消耗性负荷在节点功率平衡里是减掉的而分布式电源是注入要加进去。如果符号弄反求解出来的结果会完全不合理某些节点的电压奇高、分布式电源出力负得离谱且目标函数值比基准还高。调试方法很简单取一个已知的简单算例手动验证。比如先把分布式电源全部设为零把电容器组也设为零模型退化成纯潮流问题此时优化结果应该和普通潮流计算结果一致。我做完这个检查后立刻发现了符号问题。6.3 锥约束是否“紧”的验证二阶锥模型与原始非凸恒等式之间的误差如果不主动检查可能会被粗心的人忽略掉。我在代码里加了这样一段验证gap zeros(32, 1); for k 1:32 i branch(k,1); j branch(k,2); lhs value(L(k)) * value(U(i)); rhs value(P(k))^2 value(Q(k))^2; gap(k) abs(lhs - rhs) / max(rhs, 1e-6); end max_gap max(gap);如果max_gap在1e-5量级左右说明锥松弛是紧的模型没有问题。如果某条支路的gap明显偏大说明松弛在这个点没有收紧需要检查是数值问题还是约束漏写了。在我做过的算例中绝大部分情况下gap都很小只要建模正确二阶锥松弛的紧性是有保证的。6.4 求解器选择与数值问题YALMIP的默认求解器选择机制有时会把问题交给非线性求解器这种情况下即使求解器报告成功结果也不一定是全局最优。所以建议在命令行里显式指定求解器名称。另外要注意不同求解器对可行性的定义不同同一套模型在不同求解器上跑出来的结果可能有微小差异这属于正常现象。我在测试中发现初始点上界对求解效率影响明显。给电压平方变量添加合理的上下界让求解器在更好的初始区域开始搜索能显著减少迭代次数。6.5 常见问题排查速查表现象可能原因排查方法求解器报不可行负荷符号反了或约束冲突删掉分布式电源回退成纯潮流验证电压结果异常高功率平衡约束缺失或松弛节点电压没固定检查节点1的松弛约束目标函数值不变决策变量未正确连接到目标函数检查YALMIP变量是否重新赋值二阶锥缝隙过大模型存在等式约束和松弛不一致逐条检查锥约束索引与支路对应关系求解时间过长整数变量过多或求解器数值设置差先解连续松弛再固定整数变量做校验7. 从算例走向工程落地还需要补什么最后聊一点我对这个方向的思考。在IEEE33节点系统上跑通二阶锥无功优化只能算迈过了第一道门槛。真正用到工程场景还有几个绕不开的问题。第一个是实时计算速度。实际配电自动化系统中无功优化需要在线滚动执行一个断面要能在几十秒内出结果。IEEE33节点系统秒级可解但如果换成几百上千节点的真实馈线模型规模显著增大对求解效率的挑战就上来了。解决思路包括利用辐射状网络的结构特性做约束稀疏化、采用外逼近或者交替方向乘子法做分布式求解、对可调设备进行预筛减维。第二个是多时段协调。单一断面的优化容易陷入“头痛医头、脚痛医脚”的陷阱。分布式电源出力波动性强负荷也在不断变化某时刻的无功决策可能影响后续时段的电压水平。把二阶锥模型扩展成多时段动态优化加入储能设备的状态变量和爬坡约束是目前比较成熟的进阶方向。第三个是三相不平衡问题。IEEE33节点默认是三相平衡的但实际配电网大量存在单相负荷和不对称线路三相潮流模型下的二阶锥优化复杂度要高得多。如果所在系统三相不平衡程度大需要谨慎评估单相模型的计算误差。还有一个重要但容易被忽略的点最优解和可执行解之间的距离。模型求出的最优解可能要求某台设备无功出力精确到小数点后四位但实际设备可能只能按步长离散调节或者需要一定响应时间才能到达目标值。工程上常用的处理方法是先算优化结果再做一次设备可达性映射确保指令可执行。我这个算例里加入了电容器组的整数约束算是处理了一部分离散设备问题但真正的工程系统不只包含电容器还有有载调压变压器分接头、静止无功发生器、逆变器的PQ模式切换等这些设备时间尺度和调节精度各不相同对优化模型的要求也不一样。写这篇文章时我反复核对了模型推导、代码实现和调试过程中遇到的每一个环节。对我个人而言最大的体会是二阶锥规划本身并不神秘它不过是用一个巧妙的不等式松弛把工程上难啃的非凸骨头变成了教科书中成熟可解的凸优化问题。难点反而在建模前的物理认知和建模后的结果合理性检查。希望这篇文章能让你在配电网无功优化这件事上少走几步弯路把精力放在真正有价值的问题上——比如如何把优化结果变成实际可控的调度策略。