ARTICLE DETAIL

资讯详情

深耕郑州网站建设与运营推广的一线实战洞察。

48时段多源动态最优潮流:分布式鲁棒优化与ADMM解耦实战

48时段多源动态最优潮流:分布式鲁棒优化与ADMM解耦实战 48个调度时段、多类电源、分布式鲁棒优化——这几个标签凑在一起基本就是现在电力系统调度方向最常被问到的组合之一。我前段时间在48时段多源动态最优潮流问题上完整走了一遍分布式鲁棒优化路线从建模、模糊集构造、到ADMM解耦求解中间踩了不少坑也积累了一些可以直接抄作业的经验。今天把整个思路和实操过程拆开细讲这篇适合正在做动态最优潮流、可再生能源消纳、以及想尝试分布式鲁棒优化但不知道从哪下手的同学看。先交代一下背景所谓48我这边用的是1天48个时段进行滚动调度也就是半小时一个时段。这种粒度比24小时点对点调度更能体现风光的日内波动也对优化模型的时间耦合约束提出了更高要求。你如果手头是48节点算例也不冲突我后面会专门说节点系统怎么搭。总之核心是想搞清楚一件事当风电、光伏预测误差无法忽略时多源系统的最优潮流该怎么在“保证可靠”和“经济性最优”之间找平衡而且还要让多个区域能各自为政、互不交出全部数据。1. 为什么动态最优潮流要鲁棒化处理和分布式求解1.1 静态最优潮流为什么不够用静态最优潮流只解一个时间断面目标函数和约束都只针对某一时刻。系统里有爬坡约束、储能容量、机组启停、线路时序越限等问题时单断面模型根本照顾不到。比如中午光伏大发静态模型可能让所有火电都压到最低出却完全不管半小时后光伏掉下来时火电能不能爬上去。现实里调度一定是连续的必须把时序耦合写进模型里。动态最优潮流把时间离散成T个时段目标函数对所有时段求和同时约束里带上爬坡、储能荷电状态等跨时段变量。这样一来问题规模成倍增加但解出来的调度轨迹是物理上可执行的而不是一堆孤立断面的拼凑。48时段对我来说是个很合适的粒度计算量还能接受又能把日内风光曲线的重要拐点都覆盖住。1.2 风光不确定性不是多留点备用就能解决的很多不了解这块的人会说不确定无非就是预测不准我把旋转备用调大一点不就完了这话对传统负荷预测相对适用但对风电、光伏完全不一样。风电的间歇性不是简单的高斯噪声风速突变、云层遮蔽都会造成预测误差的“重尾”特征极端场景下的偏差可能达到装机容量的三成以上。单纯加大备用轻则经济性大幅下降重则可能使某些线路在极端场景下依然越限。这也是我坚持用鲁棒化而不是传统机会约束的原因之一。机会约束需要假设不确定参数的概率分布而实际风光预测误差概率密度很难精确刻画分布式鲁棒优化则是用一个模糊集合去“罩住”所有可能分布只要真实分布落在这个集合里决策就有可行性保障。思想更保守但更踏实。1.3 集中式求解的边界数据隐私与信息孤岛还有一个很现实的问题现在电网的运行模式越来越趋向区域自治。省级、地市、园区各自维护着发电商、负荷和网络数据你要把全网所有数据汇集到调度中心再统一建模不仅通信代价大还涉及信息隐私。分布式优化的意义就在这里各个区域只需要交换边界节点电压相角、联络线功率等少量协调变量内部数据完全不用公开各自求解子问题通过一致性约束协调。所以我最后采用的方案是上层用两阶段分布式鲁棒优化处理不确定性下层用ADMM把网络按区域拆分。48时段、多区域、不确定集、分布式求解四个要素扣在一起才是一个完整能跑通的框架。2. 48时段多源最优潮流问题的标准模型2.1 目标函数怎么设才合理目标函数我建议别只写火电煤耗成本那会低估弃风弃光的代价。多源系统里风电和光伏的边际运行成本接近零但它对系统平衡有“隐性成本”。我在目标函数里通常写成这样第一项是火电包括燃气机组的发电成本用二次函数近似a_i P_i^2 b_i P_i c_i第二项是弃风弃光惩罚项用预测可用功率与实际消纳功率的差值乘单位惩罚系数第三项是储能充放电磨损成本避免求解器为了套利让储能疯狂充放另外也可以加上线路网损项但直流潮流模型下网损形式不直观我一般用分段线性近似。惩罚系数的取值非常影响结果。我踩过的坑是弃风罚得太低优化结果会出现“宁愿弃风也不让火电压出力”的不合理现象。合理做法是把弃风弃光惩罚系数设为火电最高边际成本的1.2倍左右让系统在极端情况下倾向于消纳但又不是无条件消纳。2.2 关键约束逐个看动态最优潮流的约束体系比静态模型复杂不少我按功能分成五大类潮流和节点平衡约束每个时段的注入功率等于流出功率在直流潮流假设下是线性方程。机组出力上下限和爬坡约束火电机组有功出力有上下限相邻时段爬坡/滑坡速率有严格限制这是连接不同时段的“硬桥”。线路传输容量约束每条线路潮流不超过热稳定极限。分布式鲁棒优化里这条约束很容易成为最坏场景下主导约束。储能约束包括充放电功率限制以及荷电状态转移方程SOC在时段间传递是动态模型的重要组成部分。系统备用约束为了避免风光实际出力低于预测时功率失衡需要每个区域预留足够的正备用容量。除了这些基本项还应该加一个区域间联络线断面约束特别是在分布式求解框架里每个子区域都要维护自己内部的断面限值。2.3 风光场景怎么生成鲁棒优化需要构造不确定集合而不是做蒙特卡洛抽样后取一个确定期望。我生成不确定集的流程是先用历史预测数据和实际量测数据计算预测误差再将误差样本按时段聚合得到每个时段的误差均值、协方差或分位点。对于48时段模型每个时段对应一个不确定变量。这里容易出问题风光预测误差具有明显的时间相关性比如早晚高峰时段误差方差大白天光伏时段误差偏态明显。如果你把所有时段都构造同一个模糊集结果会过于保守。比较好的做法是时段分组——先聚合成峰、平、谷三类时段然后为每一类独立构造模糊集。这个细节能让总成本下降5%左右我在后面的算例里也会体现。3. 分布式鲁棒优化方案选型3.1 模糊集三选一盒式、预算式和Wasserstein球这是开题最需要纠结的问题之一。三种常见思路我都试过说下感受盒式不确定集P_w ∈ [P_min, P_max]。简单但把所有场景一视同仁容易过保守尤其当实际很少出现所有风光同时极端偏离的时候。预算式不确定集在盒式基础上加了比例上限比如最多同时有Γ个风电场的出力偏离预测值。这种能控制保守度但Γ怎么选需要工程经验。Wasserstein球模糊集以历史样本的经验分布为中心用Wasserstein距离半径r定义一个球真实分布落在球内。优势是数据驱动半径r有统计意义上界缺点是问题规模变大求解变慢。我推荐做研究用Wasserstein球做工程落地用预算式。预算式物理含义清楚计算友好而且对CCG算法非常友好。后面排隐患时也知道每一轮迭代实际触发的约束是哪几条。3.2 把min-max-min问题改写成可求解形态分布式鲁棒最优潮流本质上是三层的决策问题这里是三层外层决定机组出力在模糊集上保证所有可行分布都不越限中层在模糊集合里选择最坏情况的分布内层针对该分布求最小运行成本。即min-max-min结构。处理办法是传统CCG列约束生成思路把问题拆成主问题MP和子问题SP。主问题在给定若干“坏场景”下求一台可行调度子问题固定主问题的调度结果去搜索模糊集里让调整成本或约束越限量最大的分布。每次迭代把子问题找到的最坏场景作为新约束加回主问题直到主问题的目标值不再上升。需要注意内层min不能简单丢弃。当模糊集是预算式时内层min其实可以把风光出力当作“恢复手段”——这就是“恢复可行性”的核心理念当使用Wasserstein模糊集时内层min需要先通过对偶转成max再把外层的max-min对偶成一个可计算的凸问题。3.3 为什么用ADMM做解耦而不是Benders两阶段问题可以集中式求解但既然目标是多区域协同就必须在求解架构上做分布式处理。我选ADMM的主要原因它对非严格凸问题容忍度高一阶算法实现简单而且天然适合处理边界一致性约束。Benders分解也可以做区域解耦但它要求主问题是严格凸的否则每次切割不是全局有效切割。动态最优潮流本身是大规模线性/混合整数线性问题凸性不够强Benders容易震荡。ADMM只需要子问题各自可解边界变量通过拉格朗日乘子协调收敛性虽然依赖参数设置但对工程问题来说更好调。我的整体架构是这样的区域间通过边界节点电压相角一致性约束耦合ADMM迭代过程中每个区域独立求解它的调度子问题然后把边界变量发给邻居协调器只负责更新拉格朗日乘子和惩罚系数。这样处理最大的收益是风电场的完整预测数据和火电的煤耗曲线都不需要集中式模型拿到。4. 实操48节点/48时段算例搭建与调试4.1 算例拓扑与分区方式我用的测试系统是以公开的48节点系统为基础扩展的在原有输电网骨架上新增了6个风电场接入点和4个光伏电站接入点总装机里风光占比约32%火电占比约55%储能占比约13%。48个调度时段按半小时划分全天多源负荷曲线用的典型双峰形状。分区时我分成三个区域区域A偏负荷中心、有燃气机组和小型储能区域B偏新能源基地、风电光伏集中接入区域C以火电为主、承担系统基荷和备用。每个区域之间通过已有的联络线连接分布式优化时边界就是这些联络线两端节点。这样分区的好处是让区域间功率交换有真实互补性——B区域白天光伏多要往外送A区域负荷重需要接收功率C区域就要根据需求提供爬坡和备用。分布式鲁棒优化在这种结构下才能体现出价值如果每个区域都自给自足协作意义小解耦反而增加复杂度。4.2 集中式上界模型的快速实现我建议在写分布式代码前先写一个集中式模型作为“真值参考”。分布式算法跑出来的解如果不和集中式解对比你很难判断收敛得对不对。这一步我用MATLABYALMIP加Gurobi快速实现。模型结构用YALMIP大致是这样的T 48; Pg sdpvar(ng, T); % 火电出力 Pw sdpvar(nw, T); % 风电消纳量 SOC sdpvar(ns, T); % 储能荷电状态 theta sdpvar(nb, T); % 节点相角 Constraints []; for t 1:T Constraints [Constraints, Pg(:,t) Pgmin, Pg(:,t) Pgmax]; if t 1 Constraints [Constraints, -ramp_down Pg(:,t)-Pg(:,t-1) ramp_up]; end Constraints [Constraints, 0 Pw(:,t) Pw_forecast(:,t)]; Constraints [Constraints, SOC(:,t) SOC(:,t-1) eta_ch*Pch(:,t) - Pdis(:,t)/eta_dis]; % 直流潮流方程、线路容量约束省略 end Objective sum(sum(coal_cost)) penalty_wind * sum(sum(Pw_forecast - Pw)); ops sdpsettings(solver,gurobi,verbose,2); optimize(Constraints, Objective, ops);注意在写集中式模型时我故意没把不确定性加进去——先跑出确定性调度轨迹再把这个轨迹作为鲁棒子问题的初始条件。这样出问题时可以快速定位是建模错误还是鲁棒化带来的差异。4.3 ADMM迭代流程与关键参数ADMM迭代我分成三个环节初始化、迭代更新、收敛判断。初始化时给每个区域的边界节点相角设一个初值拉格朗日乘子全部置零惩罚系数ρ从1.0起步。之后按标准ADMM循环每个区域独立求解子问题目标函数里加上边界一致性二次罚项和线性拉格朗日项。迭代更新的核心是拉格朗日乘子按下式更新λ_{k1} λ_k ρ (θ_i - θ_j)同时为了让收敛更稳我做了两点改进一是在每次迭代后自适应调整ρ当原残差与对偶残差比过大时增大ρ反之减小ρ二是引入一个低通滤波让边界变量更新不要跳得太猛。收敛判断我只看两个指标一是原始残差即边界变量不一致性的最大值二是目标函数值在两个连续RDG之间的变化。48节点系统、3个区域、48时段的情况下我一般跑到120到150轮ADMM迭代就能让原始残差降到10^-4量级。4.4 结果怎么评估评价分布式鲁棒优化结果我习惯看四张曲线第一张是所有区域边界节点相角差的最大值随迭代次数的收敛曲线这个直接判断ADMM是否收敛。第二张是各区域机组总出力曲线看是否出现明显的时段跳变或不自然峰值这常常是储能或爬坡约束破坏的信号。第三张是风光实际消纳率随调度时段变化注意对比鲁棒优化和确定性优化的差异一般来说鲁棒优化会主动降低某几个高风险时段的消纳率以换取整体安全。第四张是线路负载率分布重点看是否出现线路负载率在某个场景下超过100%。鲁棒模型约束了所有模糊集内场景所以理论上不会越限但如果你的模糊集半径设得不够大真实现测数据可能仍会越限。我对比过集中式和分布式的结果分布式解的总成本比集中式高约1.6%。这个差距来自部分冗余的边界协调通常可以接受。如果差异超过5%就要检查区域划分或者惩罚系数是否合理了。5. 常见问题与排查速查表很多刚开始做分布式鲁棒优化的人在代码跑不通或者结果不理想时容易卡住很久。我把这轮调试中遇到的高频问题整理成一张表现象可能原因排查与调整方法ADMM迭代一直不收敛原始残差震荡惩罚系数ρ设置不合理或者子问题非凸先固定ρ做几次测试观察残差变化改用自适应ρ检查边界变量单位是否一致建议用标幺值CCG主问题目标值单调不增或者迭代次数爆炸模糊集合过大或者子问题返给的场景冗余检查模糊集半径/预算Γ对子问题返回的场景做去重和聚合只加实质性场景鲁棒解比确定性解成本高很多10%模糊集过保守过度约束试试时段分组模糊集检查是否把已经消纳的确定性场景也加进了最坏场景集合储能出力出现明显锯齿形波动目标函数中缺少充放电磨损惩罚项加充放电次数惩罚或一次项的耗损成本同时检查SOC步长和充放电效率是否写入正确风电场消纳率为0但预测值很大弃风惩罚系数太小或者线路阻塞被忽略提高惩罚系数到火电边际成本的1.2~1.5倍检查是哪个线路约束触发了限电分布式求解和集中式求解结果差异大区域划分导致边界耦合过多或某条联络线功率限制影响全局检查联系线是否太紧区域间用相对功率作为边界变量比绝对相位角更好收敛使用Wasserstein模糊集后模型规模爆增场景样本数过大导致对偶变量增多先用K-means对历史场景聚类到20~30个代表场景半径r用交叉验证定别一味取理论值除了表格里的内容我再分享三个亲测有效的经验。第一分布式鲁棒优化里的“分布式”很容易被忽略但它往往比鲁棒集合构造更影响调试难度。我发现在单个区域内如果网络拓扑里存在低阻抗环路子问题的系数矩阵条件数会变差ADMM收敛变慢。解决方法是先对区域内部做无功-有功解耦预处理或者干脆改用支路潮流变量而不仅是节点相角。第二模糊集不是越大越好。我一开始把风电预测误差的标准差放大1.5倍作为不确定范围结果总成本上涨了14%而实际在测试集上的越限率只改善不到1%。后来我通过在验证集上做滚动回测来调模糊集半径成本只比确定性方案高6%左右同时越限率降到接近零。数据驱动方法一定要配验证集做闭环测试不能光看鲁棒集合的理论保证。第三如果使用商业求解器注意给每个子问题设置时间限制。ADMM迭代中偶尔会出现某个区域子问题恰好非常难解导致整个协调流程停下来干等。我用的是一个非常简单的策略单次子问题求解超过30秒即返回当前可行解目标函数值放宽到1e-4的gap。整体求解时间从原来的几百秒缩短到几十秒对收敛精度几乎没有影响。这个技巧在处理大规模系统时尤其管用。最后再分享一个小经验在做这类多时段分布式鲁棒优化时我强烈建议把模型的每一层拆出来单独测试。先跑确定性动态最优潮流确认目标函数和约束都在合理范围再单独跑鲁棒子问题固定调度结果检验最坏场景搜索最后才连起来跑整体ADMM。可能有的同学觉得这样太慢但如果你一次性写完2000行模型然后发现结果完全不合理排错的时间远比这个“慢慢来”的时间多。我就是这么一步步调通的至少在这类问题上稳扎稳打比炫技可靠得多。
返回列表