
1. 这个项目到底解决什么问题先读懂设备动作损耗这笔“隐形成本”做配电网电压无功优化的人大概率都经历过这样一个过程模型建好了算法跑通了仿真结果一片大好电压合格率拉到100%网损嗖嗖往下降。然后呢拿到实际现场去用的时候傻眼了——电容器组一个礼拜动作了几十次开关触点烧蚀得厉害有载调压变压器分接头天天咔咔响运维班组的人直接找到你头上来了。这就是我当初折腾这个项目的直接原因。单纯以电压合格和网损最小为目标做优化优化器一定会可着劲儿调节设备——因为对它来说每一次设备动作都是“免费的”多调一次电压更稳、网损更低何乐而不为但真实世界里任何一次有载调压变压器的分接头调整、任何一次并联电容器组的投切都会造成实实在在的代价机械磨损、触点烧蚀、涌流冲击、设备寿命衰减。这笔账不放进优化模型里做出来的方案根本落不了地。所谓“考虑设备动作损耗”的电压无功优化本质上是往传统的优化目标函数里增加了一个“设备动作代价”的维度。它要求优化器在“电压质量、网损水平、设备动作成本”三者之间做一个真正的权衡而不是无脑追求某一个指标最优。1.1 电压无功优化问题的基础为什么无功会影响电压先花两分钟把基础盘一下免得后边代码逻辑讲起来发懵。在辐射状配电网中一条馈线从变电站出口往末端走电压是逐步降低的。降低的原因有两个一个是线路电阻上的有功压降一个是线路电抗上的无功压降。对于10kV配电网来说线路的电抗和电阻比值X/R通常在1~3之间和输电网那种X/R动辄5~10的情况完全不同因此电阻上的有功压降占比很高不能忽略。但无功仍然是电压偏移的主要推手——当馈线末端接入大量分布式光伏、或者负荷较重时无功功率沿线路流动末端电压就可能越限偏高或偏低。无功优化的思路就是通过调节电网中的无功源电容器组、静止无功发生器、有载调压变压器分接头、分布式光伏的无功出力等改变无功功率的流动路径从而把各节点电压拉回到合格范围内同时尽量减小网络中的有功损耗。1.2 设备动作损耗到底在损耗什么这个“损耗”不是网损那种电能量损耗而是指设备在动作过程中付出的机械与电气代价。我用一个表格把典型设备的动作代价梳理清楚设备类型动作方式主要损耗机理工程上的典型动作次数限制并联电容器组机械开关投切涌流冲击、触头烧蚀、电容器内部介质应力通常数千次视开关类型而定有载调压变压器(OLTC)分接头电动调节机械传动机构磨损、油质劣化、调压开关触头消耗几万次检修周期内通常有限额静止无功发生器(SVG/SVC)电力电子连续调节器件开关损耗与热应力无严格次数限制但高频调节影响器件寿命分布式光伏逆变器无功功率连续调节逆变器附加损耗、有功出力受限机会成本无严格次数限制这里有一个关键的认识误区不是所有设备都需要惩罚。SVG和光伏逆变器可以做连续无功调节动作“代价”相对较低甚至可以忽略但电容器组和OLTC属于离散机械调节设备动作一次的成本不可忽视。因此建模时必须区分设备类型别搞“一刀切”的惩罚。1.3 为什么非要“分布式”地去做这个优化这可能是很多人第一个困惑直接把全网的电压无功优化建模成一个数学规划问题扔给求解器不就行了吗为什么要分布式原因有三层第一配电网规模大了之后集中式优化真的跑不动。一个动辄上千节点的馈线组加上联络开关、分布式电源、储能、可调负荷变量和约束数量很容易冲上十万量级。虽然现代求解器很能打但“能解”和“算得快”是两回事。电压无功优化如果要在日内滚动运行比如15分钟一个断面集中式的计算时间可能让人无法接受。第二数据隐私和归属权问题是硬约束。配电网和输电网不一样它往往跨越不同的产权主体——配电公司、分布式电源运营商、大用户、储能聚合商。这些主体之间并不愿意把完整的电气数据尤其是负荷曲线和内部拓扑交给一个中央控制中心。分布式优化天然适配这个局面每家只管自己的区域只在边界节点上交换必要信息。第三通信可靠性和扩展性。集中式优化对中央节点和通信网络的依赖是单点式的任何一个环节出问题整个优化就瘫了。分布式方案让每个区域都在本地完成自己子问题的求解中央协调器只做轻量级的信息汇总与参数更新鲁棒性要好得多。2. 分布式优化的方案选型为什么我最终选了ADMM方向定了之后紧接着就是方法选型。做分布式电压无功优化主流路线大致有三条交替方向乘子法ADMM、一致性算法、目标级联分析法。三条路我都实际试过这里把选型过程拆开说。2.1 三条分布式路线的对比与取舍一致性算法的思路是让每个区域各自优化然后通过邻居间的变量交换让公共变量的估计值逐步收敛到一致。它的优点是通信拓扑要求低、实现简单但缺点很致命收敛速度慢而且迭代次数和网络规模强相关。小型测试系统上看不出来一旦区域变多一致性算法的收敛过程会让人等得没脾气。目标级联分析法ATC是分层优化的思路上层把目标值的容许区间往下传递下层把优化结果往上反馈通过层层修正逼近全局最优。它在多层级结构比如输配协调里表现优异但在单层配电网的区域间协同场景里显得有点“大材小用”计算开销偏高。ADMM是我最终选择的方案。它的核心优势是有成熟的凸优化收敛性理论打底虽然不是所有配电网问题都是凸的但我们可以通过合理的模型变换让它搭上凸优化的边实现上只需要每个区域求解自己的子问题然后在协调层做一次拉格朗日乘子更新逻辑非常清晰。拿工程话说ADMM的“性价比”最高。它不需要复杂的层级信息交互对初始化不敏感而且有原始残差和对偶残差两个明确的收敛判据调试的时候心里有底。2.2 ADMM应用于配电网优化的数学形式先说一个大家容易绕进去的点。标准ADMM要求全局优化目标函数是可分离的也就是目标函数可以拆成各区域自己的目标函数之和区域之间的耦合只体现在约束条件上。配电网的电压无功优化天然满足这个结构每个区域的网损、电压偏移、设备动作代价都只和自己的变量有关而区域之间通过边界节点的电压和支路功率产生约束耦合。假设网络被划分为 (K) 个区域区域 (i) 的本地变量集合为 (x_i)全局变量为 (z)表示边界节点的电压幅值等共享变量。区域的本地约束是潮流方程和其他运行约束边界一致性约束写作[ x_i z, \quad i 1, 2, \ldots, K ]构造增广拉格朗日函数[ L_\rho(x, z, \lambda) \sum_{i1}^K \left[ f_i(x_i) \lambda_i^T(x_i - z) \frac{\rho}{2} |x_i - z|_2^2 \right] ]ADMM的迭代分成三步[ x_i^{k1} \arg\min_{x_i} \left[ f_i(x_i) \lambda_i^{T}(x_i - z^k) \frac{\rho}{2}|x_i - z^k|_2^2 \right] ][ z^{k1} \arg\min_z \sum_{i1}^K \left[ -\lambda_i^T z \frac{\rho}{2}|x_i^{k1} - z|_2^2 \right] ][ \lambda_i^{k1} \lambda_i^k \rho (x_i^{k1} - z^{k1}) ]子问题更新那一步每个区域只需要知道上一轮协调层给出的全局变量 (z^k) 就能独立求解看起来就非常干净。上面这些公式看着唬人落地到Matlab里其实没什么特别的难度。下面重点讲讲我在代码实现时几个关键的工程决策。3. Matlab代码实现逐步拆解从潮流模型到迭代求解直接上项目代码结构。整个项目的文件组织大致是这样的3.1 配电网潮流模型选择与实现电压无功优化不是孤立的规划问题它的每一次迭代都需要计算潮流因此潮流模型的选择直接影响问题可解性和计算速度。DistFlow模型是配电网优化里用得最多的连续潮流描述它避开了极坐标下三角函数带来的非线性用支路功率和节点电压幅值直接建模。标准DistFlow方程如下[ P_{jk} P_{ij} - r_{ij} \frac{P_{ij}^2 Q_{ij}^2}{V_i^2} - p_j ][ Q_{jk} Q_{ij} - x_{ij} \frac{P_{ij}^2 Q_{ij}^2}{V_i^2} - q_j ][ V_j^2 V_i^2 - 2(r_{ij}P_{ij} x_{ij}Q_{ij}) (r_{ij}^2 x_{ij}^2)\frac{P_{ij}^2 Q_{ij}^2}{V_i^2} ]其中 ((r_{ij}, x_{ij})) 是支路 (i-j) 的阻抗((P_{ij}, Q_{ij})) 是支路首端流过的有功和无功(V_i) 是节点电压幅值。这套方程在Matlab里实现起来非常直接而且因为电压无功优化的电压偏移通常限制在±7%以内忽略 (\frac{P_{ij}^2 Q_{ij}^2}{V_i^2}) 这一项即所谓的“线性化DistFlow”在很多工程场景下精度是足够的。我在代码里做了一个双模设计一种是完整的非线性DistFlow用于精确潮流校核一种是线性化DistFlow用于优化迭代。优化的时候用线性化版本得到优化决策后再用精确潮流做一次校核两全其美。这里踩过的一个最大的坑是如果用线性化潮流直接算节点电压结果和精确潮流在小阻抗支路上可能差出2%~3%这个偏差在优化循环里会被放大最终导致电容器组的投切方案在实际潮流里电压越限。所以校核这一步一定不能省。3.2 设备动作损耗建模两种思路与代码表达设备动作损耗建模是项目的核心贡献点这里我提供两种实践中都用得上的建模思路。思路一惩罚项法松约束目标函数中给每个可控离散设备叠加一项动作代价。若设备在时刻 (t) 的档位状态为 (u_t)上一时刻为 (u_{t-1})动作代价记为[ f_{action} \alpha \cdot |u_t - u_{t-1}| ]其中 (\alpha) 是单次动作代价系数。如果是电容器组(u) 就是0/1投切状态如果是OLTC(u) 是分接头档位整数。这个惩罚项直接加到优化目标里形式上非常干净在Matlab里用非光滑项绝对值也能高效求解。实际调试中(\alpha) 的取值要参考设备的动作寿命数据来定。比如一组电容器开关的电气寿命是5000次换一组开关的成本折算到每次动作大约是几十元如果无功优化的网损单价是每千瓦时几毛钱那么折算后 (\alpha) 的量级是可以测算的。当然具体数字因地区、设备而异但建模思路是一样的。思路二动作次数约束法硬约束在调度周期内限制每个设备的动作次数不超过上限[ \sum_{t1}^T |u_t - u_{t-1}| \le N_{max} ]这个方法对运行方式的约束更直接但在分布式框架里处理起来比较麻烦——因为动作次数的约束与时间序列强耦合破坏了各个时段之间的独立性。我在实际项目中用了一个折中方案松弛掉这个全局约束改对每个时刻的动作设置线性惩罚这样24个时段之间的耦合就只剩下状态变量 (u_t) 与 (u_{t-1}) 的固定关联松弛后也能在分布式框架中顺利分解。如果项目要发论文或者做严格的工程论证建议惩罚项法和约束法都实现做一个敏感性对比。我在做某电网的实际项目时对方更认可硬约束——因为保障设备寿命是他们考核KPI的一部分软约束不具备说服力。3.3 区域分解与边界变量选择分布式优化做得好不好一半取决于区域怎么切、边界变量怎么选。区域切分要遵循的原则尽可能沿联络线或功率较小的支路切使得区域间的耦合变量个数最少。以经典的33节点配电网为例它是一个含5条联络开关的环形拓扑正常情况下辐射状运行。我按馈线主干把网络切成3个区域区域之间用联络支路连接。联络支路的首末端节点电压就是边界变量。这里有一个容易犯的错误边界变量的量纲和数量级。节点电压是1.0p.u.这个量级而支路无功功率可能是几百kVar两者在增广拉格朗日里混合计算时惩罚因子 (\rho) 很难同时适配两个尺度的变量。我的做法是对边界变量做归一化处理——电压保留p.u.值功率则除以基准功率变成p.u.值这样整个增广拉格朗日里所有项的量级一致 \rho) 的整定就容易多了。3.4 ADMM主循环与改进策略主循环的伪代码如下% 初始化 lambda zeros(n_boundary, 1); % 拉格朗日乘子 z ones(n_boundary, 1); % 全局变量初始值电压p.u. rho 10; % 惩罚因子 tol_pri 1e-4; tol_dual 1e-4;for k 1:max_iter % 步骤1各区域并行求解子问题 % 区域1输入z、lambda_1求解本地决策变量x1 x1 solve_subproblem(region1_data, z, lambda(:,1), rho); % 区域2同理 x2 solve_subproblem(region2_data, z, lambda(:,2), rho); % 区域3同理 x3 solve_subproblem(region3_data, z, lambda(:,3), rho); % 步骤2协调层更新全局变量z z_new (x1_boundary x2_boundary x3_boundary) / 3 ... - (lambda1 lambda2 lambda3) / (3 * rho); % 步骤3更新拉格朗日乘子 lambda(:,1) lambda(:,1) rho * (x1_boundary - z_new); lambda(:,2) lambda(:,2) rho * (x2_boundary - z_new); lambda(:,3) lambda(:,3) rho * (x3_boundary - z_new); % 步骤4计算原始残差和对偶残差判断收敛 r_pri norm([x1_boundary - z_new; x2_boundary - z_new; x3_boundary - z_new], 2); r_dual rho * norm(z_new - z, 2); if r_pri tol_pri r_dual tol_dual break end z z_new; end注意子问题求解内部其实需要嵌套一个潮流迭代——区域内的电压和功率要满足潮流方程。我使用的是前推回代法作为子问题中的潮流求解器配合Yalmip或者直接调fmincon做本地优化。如果追求速度推荐把子问题的目标函数线性化或二阶锥化再调用快速求解器。这里有一个工程优化技巧不需要每个ADMM外循环都精确求解子问题到最优。子问题做一个不精确求解比如迭代20次就停ADMM整体收敛往往反而更快。这是ADMM理论上认可的“不精确”变体实践里非常香。4. 仿真结果怎么分析对比实验设置的四个关键维度代码能跑通只是第一步项目能不能让人信服要看仿真实验设计得是否严密。4.1 测试算例与基础场景设置我选择了一个公开的标准33节点配电网算例做测试——这是配电网优化领域的“Hello World”12.66kV、基准容量10MVA、包含33个节点和37条支路。为了验证分布式方法我在这个网架上做了如下扩展把网络按馈线划分为3个区域在馈线中段和末端接入4组并联电容器每组可投切容量为50kVar/100kVar/200kVar可选在中间节点接入1台有载调压变压器分接头范围±8×1.25%在部分节点接入分布式光伏不参与优化时序控制只作为负荷扰动源取了一天24个时段的光伏出力曲线和负荷曲线。负荷采用典型参数的日曲线——工业、商业、居民负荷的混合形态光伏出力近似正弦波形的晴日曲线这样优化问题在日内滚动执行时设备动作的方向和时机都比较丰富能充分检验动作惩罚项是否起作用。4.2 对照组怎么设我设计了四个对比方案这也是论文或项目报告中比较通用的做法方案描述期望看到的结果方案A无优化初始状态电压越限严重网损最高作为性能下限方案B集中式优化不考虑设备动作损耗网损和电压最优但设备动作极频繁方案C集中式优化考虑设备动作损耗网损略上升电压合格动作次数明显减少方案D分布式优化考虑设备动作损耗逼近方案C且求解耗时大幅缩短每个方案输出四类指标全网总有功损耗、电压越限节点比例、设备动作总次数、求解时间。前三个是电力指标第四个是算法效率指标缺一不可。4.3 关键结果的解读逻辑真实跑出来的数据大致表现是这样的不同算例参数会滑动但趋势一致方案B和方案C的网损差距通常在3%~6%之间——这就是“为降低设备动作付出的代价”在工程上完全可以接受方案C的设备动作次数相比方案B下降约60%~80%效果极其显著方案D和方案C的最终目标函数值差距通常在1%以内但求解时间可以缩短一个数量级以上ADMM迭代过程的原始残差曲线呈单调下降趋势多数情况下后期可能小幅波动一般30~60次主迭代内收敛如果方案D和方案C的差距偏大超过3%优先检查三个地方一是边界变量的选择是否合理二是 \rho) 是否需要自适应调整三是子问题求解精度是否足够。5. 踩坑实录ADMM调参、代码调试与结果校验这部分是全文最有价值的地方。这些坑是我反复调试排出来的教科书上找不到但对想做这个方向的人是最直接的经验。5.1 ADMM惩罚因子怎么调这是ADMM落地时碰到的第一个硬骨头。 \rho) 太小时原始残差收敛慢整个迭代过程像老牛拉车\rho) 太大时对偶残差急剧震荡目标函数值在最优解附近疯狂抖动。实践中我自己总结了一套靠谱的调参流程第一步把目标函数做归一化。网损项和动作惩罚项的量级最好差不多否则无论怎么调 \rho) 都难以兼顾。第二步从 \rho 1) 开始试跑一遍观察原始残差和对偶残差哪个收敛慢。如果原始残差慢加大 \rho对偶残差慢减小 \rho。第三步采用自适应 \rho 更新策略典型做法是if r_pri 10 * r_dual rho rho * 2; elseif r_dual 10 * r_pri rho rho / 2; end这个策略源自经典的残差平衡思想工程效果远好于固定 \rho。5.2 边界不匹配导致的结果偏差分布式优化结果和集中式结果对不上这个是第二高发的疑难杂症。我排查过的一个典型案例是这样的33节点系统切成3个区域后分布式优化得到的目标函数值比集中式高了整整5%。当时百思不得其解后来一条一条查发现是区域分解时漏掉了一条联络支路导致两个区域各自的潮流约束集和集中式不等价。说白了区域分解之后每个区域内部的连接关系必须和原网络完全一致任何一个拓扑关系错了都白搭。这类问题的排查技巧先跑一个例外测试把所有区域的边界变量全部固定为集中式优化解的值如果分布式子问题求出的目标值和集中式对不上那必然是本地区域建模出错如果对得上问题一定出在边界耦合上。5.3 离散变量的分布式处理电容器组是离散变量投/切OLTC分接头也是离散变量整数档位而ADMM的数学形式在连续变量下理论最漂亮。直接把离散变量扔进子问题会让子问题变成混合整数规划求解效率会明显变慢。我的处理经验分两步。第一步先把离散变量松弛成连续变量在连续域里做分布式ADMM迭代这一步收敛快。第二步迭代收敛后做一次就近取整再继续迭代几次让电压变量和乘子适应离散值。这个办法虽然不够“数学严谨”但工程效果好最终电压质量指标几乎没有损失。还有一个更稳妥的选择是在子问题里直接用 \texttt{round} 约束离散变量交给yalmip配合外部求解器处理混合整数子问题——前提是你的子问题足够小求解器能在秒级返回。区域划分得合理的情况下这个方案也完全可行。5.4 动作损耗项“被吃掉”的问题这是当初我调代码时最容易忽视的问题目标函数中网损值是兆瓦量级动作代价是几十元量级两者若直接相加动作代价项在目标函数里占比小到几乎不影响优化方向惩罚项形同虚设。解决方法是把动作代价乘以一个适当的放大系数或者采用多目标加权方式让动作惩罚在目标函数中的占比落在10%~30%区间内才能起到真正的约束作用。具体数值要在实验里反复标定——这也是我前面强调量纲归一化的原因。6. 项目还能怎么扩展几个后续迭代方向这个项目做完如果还有余力继续深入我建议沿着下面三个方向去扩展。第一个方向是多时间尺度协调。目前做的是单断面或者24时段滚动的电压无功优化可以进一步细分为日前的设备动作计划电容器、OLTC这类慢设备 日内实时无功调节SVG、光伏逆变器这类快设备。慢设备动作频率低主要考虑设备寿命快设备调节连续动作代价低。这种双层架构在工程里更接近实际调度逻辑。第二个方向是不确定性处理。光伏和负荷都有预测误差确定性优化给出的决策在天气突变时可能失效。可以考虑鲁棒优化、机会约束规划或者模型预测控制MPC让优化方案在不确定性扰动下仍然保证电压合格。第三个方向是通信与智能化结合。ADMM目前需要一个协调中心做全局变量更新如果完全去中心化没有协调中心需要设计基于一致性算法的变体或者在边缘计算框架下做联邦优化。这个方向研究热度还在上升。从我自己的体会来说做这个项目的最大收获不是弄懂了ADMM那套数学而是真正理解了为什么工程上的优化模型要比论文里的复杂那么多——真实系统的约束太多了而且很多约束是隐性的、需要靠对物理过程的理解才能提取出来。设备动作损耗就是这样一种“容易被忽略但其实极其重要”的成本。希望这篇拆解能帮你少走一些弯路。