ARTICLE DETAIL

资讯详情

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

分布鲁棒优化下的电-气综合能源系统能量-备用协同调度

分布鲁棒优化下的电-气综合能源系统能量-备用协同调度 做电-气综合能源系统调度模型这几年我最大的感受是燃气机组把电网和气网缝在一起之后原来电力系统里那套“多做点备用就稳了”的经验开始失灵。风、光、负荷的预测误差从来不是一个稳定分布而备用调用的成本与风险又高度耦合在气网管道的传输能力上。如果目标函数里只有期望成本模型会对小概率大损失场景毫无防备如果只看最坏场景备用容量又会配得异常保守日常成本被白白抬起来。我在这篇项目的实践中把能量-备用协同调度放入分布鲁棒优化框架并用条件风险价值来度量备用不足导致的尾部损失最终得到一个既不过度保守、又能对极端场景给出明确风险敞口的日前调度模型。这篇博客把建模、转化、求解和算例里的完整链路以及踩过的坑都整理出来适合正在做综合能源系统调度、备用容量配置或者考虑不确定性的电力市场优化同行参考。1. 为什么要同时考虑电、气两套网络和备用这件事1.1 耦合系统不是两套独立网络的简单叠加电网和气网在物理上是两套管网但燃气轮机和电制气P2G设备把它们焊成了一个整体。燃气机组发电时要源源不断从气网取气气网节点压力、管道容量、压缩机出力决定了它到底能不能在调用窗口内把功率顶上去反过来风电大发、电网消纳不了时P2G把多余电量转成天然气注入气网又会改变下游节点的压力分布影响其他用气负荷。单独做电网调度时可能看到某台燃气机组备用比较充裕一旦把气网约束叠上去就会发现关键管道流量已经饱和这台机组在备用调用时段根本拿不到增量燃料。传统做法里“先算能量、再按比例留备用”的两步走在两套网络强耦合之后就会产生这类不可行或次优的调度结果。这个问题的本质不是某个约束写错了而是决策变量之间的物理联动没有在同一层优化里体现。1.2 能量与备用之间的耦合是模型里最容易被低估的一环能量决策机组基点出力、气源供气量、P2G运行功率和备用决策上备用、下备用的容量不是相互独立的。燃气机组的可调空间由其当前出力、爬坡速率、最大出力共同决定而当前出力又取决于能量优化对气源和气网而言备用容量的多少本质上是“预测一个流量区间”供气计划一旦定了备用调用的后效就会反映在节点压力上。更麻烦的是气网没有电力系统那种天然的惯性储能管道压力和压缩机响应速度都会限制备用的实际可达性。所以把能量与备用同时放进优化模型不是把两组变量简单堆进一个目标函数而是要让每个时段、每个节点的能量平衡约束与备用约束通过同一个耦合变量联动。否则就会出现“备用容量报的是 100 MW真正需要调用时因为管道压力不足只能顶出 60 MW”这种现场事故。1.3 不确定性来源决定了风险建模的难度电-气综合能源系统里的不确定性源比单一电网更多风电出力的预测误差、光伏出力、电负荷偏差、气负荷偏差还有极端天气下管道输送能力下降这类偶发事件。这些误差的真实概率分布很难精确知道通常我们手里只有一组历史样本或者日前预测的历史误差样本。如果像一般随机优化那样直接把经验分布当成真实分布样本少的时候会严重低估尾部风险如果完全不知道分布用盒式不确定集做鲁棒优化又会在所有变量上取最坏情况备用被配得过度。正是这个“分布部分已知、且需要控制尾部损失”的困境让我最终选择了分布鲁棒优化和条件风险价值的组合。前者处理“分布不精确知道”的问题后者处理“极端场景下备用不足”的问题二者正好互补。2. 条件风险价值与分布鲁棒优化风险度量怎么选2.1 从期望成本到条件风险价值多了一双看尾部的眼睛先看损失定义。令 L(ξ) 为调度方案在不确定量 ξ 实现后的第二阶段总成本包含备用调用费用和各类惩罚。多数优化模型只关心 E[L(ξ)]但调度员真正怕的往往不是平时的小偏差而是风光出力偏低、电负荷偏大、气网管道受限同时发生的日子。条件风险价值Conditional Value-at-Risk刻画的就是这种尾部损失给定置信水平 α先找损失分布的 α 分位数也就是 VaRCVaR 就是“损失超过 VaR 那一段的条件期望”。Rockafellar 和 Uryasev 给出了一个非常实用的等价定义CVaR_α(L) min_η { η (1/(1−α)) E[(L − η)⁺] }其中 (·)⁺ 表示取正部。这个形式的妙处在于分位数本身变成了一个可优化的变量 η整项是凸函数可以直接塞进优化模型求解。用个生活化的类比期望成本像是“平均每年修车花多少钱”CVaR 则是“假如真出大事那一年平均要花多少钱”。调度员真正怕的从来不是日常小波动而是极端日子CVaR 正好把这部分风险单独拎出来。2.2 分布鲁棒优化介于随机优化和鲁棒优化之间随机优化的前提是已知分布鲁棒优化的前提是对不确定量的取值集合有把握分布鲁棒则把不确定性放在概率分布上假设真实分布 P 落在以经验分布 P̂_N 为中心的一个模糊集 D 里我们求解的是最坏分布下的目标值。用数学语言写就是 min_x max_{P∈D} [目标函数]。这个 min-max 结构让模型在信息量和保守度之间有了一个连续的旋钮模糊集越小问题越接近随机优化模糊集越大问题越接近鲁棒优化。对于电-气综合能源系统的日前调度我们既没有足够数据确定真实分布又不想因为最坏场景而牺牲日常经济性这个区间思维特别合适。三种方法的对比如下方法不确定性的建模方式保守程度数据需求典型问题随机优化(SO)固定经验分布低易低估尾部样本越多越好极端场景下备用不足分布鲁棒(DRO)经验分布模糊集半径可调样本估计半径计算量较大鲁棒优化(RO)盒式/椭球不确定集高只需取值范围备用过度、成本偏高2.3 模糊集的两种常见构造方式实际建模时模糊集怎么搭直接决定对偶转化的难度。常用的有两条路线。第一条是矩模糊集约束分布的一阶矩落在均值向量周围的一个球里二阶矩矩阵有界。这条路线解析性质好很多单阶段问题能得到显式重构但它只捕捉均值、方差这类总体统计量对分布形状不敏感构造出来的最坏分布往往在形状上很奇怪物理上不太讲得通。第二条是 Wasserstein 模糊集定义 D { P | W(P, P̂_N) ≤ ε }其中 W 是 Wasserstein 距离ε 是半径。它的直觉是“允许真实分布在运输意义上偏离经验分布不超过 ε”。Wasserstein 半径有明确的统计意义——在样本量有限时可以用离散化误差的收敛速度给出 ε 的上界参考同时通过强对偶可以把内层对分布的优化转化为一个有限维凸问题。我在项目中使用的是 Wasserstein 模糊集矩模糊集作为对照方案来验证结果稳健性。2.4 为什么目标里要显式加入条件风险价值如果只写 max_{P∈D} E_P[Q(x,ξ)]内层的最坏分布会在模糊集允许的范围内尽可能把概率质量推到损失最大的场景上结果和鲁棒优化差不多备用配得很满。为了给决策者一个“日常经济性”与“尾部风险”之间的偏好旋钮我们在目标里把期望项和 CVaR 项按权重组合min_x { cᵀx max_{P∈D} [ (1−λ) E_P[Q(x,ξ)] λ CVaR_α(Q(x,ξ)) ] }λ 越大优化越照顾极端日子α 决定“极端”的定义。这样做的结果是一个风险度量可解释、备用水平可解释的问题比单纯加一个最坏场景约束好用得多。调度会上领导问“你这方案到底多安全”直接报 CVaR 数值和对应场景清单比“我们考虑了很多种情况”有说服力得多。3. 模型怎么搭两阶段分布鲁棒优化的骨架3.1 第一阶段的决策变量与成本构成第一阶段是日前阶段决定第二天所有设备的状态和能量-备用计划。决策变量包括燃气机组的启停状态、基点出力、上备用容量、下备用容量P2G 的启停与运行功率气源各节点供气量储气罐的充放气计划可中断负荷的备用容量。第一阶段成本包括机组启停成本、燃料成本、气源购气成本、备用容量预留成本。这些成本都是线性的处理起来不麻烦。真正的复杂度在第二阶段因为第二阶段把第一阶段预留的备用在不确定量实现后“兑现”成实际调节动作。这个“先买备用、后花调用费”的结构和电力市场里备用容量市场与能量市场分步结算的逻辑是一致的理解起来不困难。3.2 第二阶段的备用调用与惩罚结构第二阶段是实时调整阶段。假设 ξ 实现后原计划的负荷和风光出力对不上调度中心要以最小成本调用备用。第二阶段变量包括各机组出力调整量 Δp上调或下调、P2G 功率调整、切负荷量、弃风量、气负荷削减量。功率调整受第一阶段备用容量约束−r_d ≤ Δp_i ≤ r_u也受爬坡和管网约束。目标函数里惩罚项非常重要。切负荷和削减气负荷的惩罚系数要远高于备用调用成本否则模型会“主动切负荷”来降低备用采购量这不符合调度实际。我把惩罚系数设为切负荷 1000 元/MWh、弃风 100 元/MWh 这个量级具体根据项目电价和气价标定。第二阶段子问题是一个以 x 为参数的线性规划它的最优值 Q(x,ξ) 就是前面 DRO 目标里被取期望和 CVaR 的对象。换句话说第一阶段买的备用决定第二阶段的调节范围这就是“能量-备用”协同的数学本质。3.3 电-气耦合环节的约束怎么处理耦合环节是这模型的核心也是出错最多的地方。燃气机组的耗气特性通常写为 F_i a·p_i² b·p_i c二次项用分段线性化处理分段数 4-6 段就够用。P2G 设备的产气量与耗电量成正比F_P2G η_P2G · P_e,P2Gη 取 0.55-0.65 左右。天然气网络这部分最费劲。管道流量满足 Weymouth 方程f_mn C_mn · sgn(π_m − π_n) · √|π_m² − π_n²|带平方根和符号函数是天然的非线性非凸约束压缩机还要满足出入口压力比约束 π_out ≤ κ · π_in。电网侧用直流潮流就能满足当前调度场景的精度但气网必须认真处理否则备用可达性会被严重高估。我们曾经因为把某条管道的流量上限估算得偏大导致系统备用整体虚高这在实际运行时是可能直接触发低频减载的。3.4 含条件风险价值的目标等价重构把 CVaR 放进 DRO 之后目标里出现两层结构一层是对模糊集里的分布取 max一层是 CVaR 定义里的 min_η。我们先把 CVaR 写成 Rockafellar-Uryasev 形式再引入辅助变量 z(ξ) ≥ Q(x,ξ) − η、z ≥ 0把 (·)⁺ 用两条线性不等式线性化。这样整个内层问题变成max_{P∈D} min_{η,z} [期望项 CVaR项]。外层对 P 是线性的内层对 η、z 是凸的满足 min-max 交换的条件。实际求解时不真正交换而是用它构造子问题交给 CCG 迭代。这个等价变换是整个模型数值可解的关键少了这一步直接把非线性 MINLP 丢给求解器基本算不动。对于想复现的同行我建议把 CVaR 的 epigraph 形式在建模脚本里单独写成一个函数方便后续换 α 和 λ。4. 求解路线列与约束生成CCG的落地做法4.1 主问题与子问题的迭代框架两阶段分布鲁棒问题比普通两阶段随机规划多了一层“找最坏分布”不能直接丢给求解器。我用的是经典 CCG列与约束生成。思路是主问题只保留有限个场景或分布求解第一阶段变量得到下界子问题固定第一阶段解在完整模糊集里搜索最坏分布返回上界和对应的最坏场景如果上下界 gap 超阈值就把这个最坏场景作为新一列加入主问题同时把第二阶段对应的约束也加进去如此往复。主问题像“先按现有情报做方案”子问题像“挑出你没考虑到的对手招数”一攻一守直到收敛。下面是核心循环的概念伪代码# CCG 两层迭代概念伪代码 scenarios load_historical_samples(N) # 初始经验场景 best_ub inf while True: x_star, lb solve_master(scenarios) # 主问题有限场景下求下界 ub_val, xi_worst solve_subproblem(x_star) # 子问题模糊集内找最坏分布 ub first_stage_cost(x_star) ub_val best_ub min(best_ub, ub) if best_ub - lb gap_tol: break scenarios.append(xi_worst) # 生成新列并加入主问题4.2 Wasserstein 模糊集下子问题的对偶写法子问题里最核心的转化是处理 max_{P∈D} E_P[Q(x,ξ)]。对 Wasserstein 模糊集利用 Kantorovich-Rubinstein 对偶可以写成inf_{γ≥0} { γ·ε (1/N)·Σ_i sup_ξ [ Q(x,ξ) − γ·c(ξ, ξ̂_i) ] }注意 ξ̂_i 是历史样本c(·,·) 是 Wasserstein 距离的代价函数我们通常取一范数或二范数。这样一来无限维的分布优化被拆成 N 个独立的小问题对每个历史样本找使它“损失 Q 减去运输代价 γ·c”最大的那个 ξ。如果 ξ 只出现在第二阶段约束的右手边风电功率、负荷值每个小问题本质上是一个小规模 LPGurobi 几毫秒就能解完。CVaR 项的处理类似多带一个 η 和 z_i 变量。我们实际把 E_P 和 CVaR 两项统一写成对场景权重的线性目标再对偶消掉权重变量得到可直接线性求解的形式。这一步做完整个 DRO 的可解性就有了保障。4.3 气网非线性约束的实用线性化Weymouth 方程这一步处理不好整个模型就卡在这里。我在项目里用两种方案兜底。第一种是分段线性化把压力平方差在合理范围内分成 5-8 段每段用线性不等式夹住流量误差控制在 1%-2%。第二种是二阶锥松弛Weymouth 等价写成 f_mn² ≤ C_mn²·(π_m² − π_n²)再引入辅助变量对辐射状气网松弛效果不错。实用建议是两种都做、互相校验先跑分段线性化得到整数解再拿 SOC 松弛模型验证流量分布两者偏差大就加密分段断点。压缩机的升压关系用线性约束 π_out ≤ κ·π_in 配合方向约束就够不必引入布尔变量区分流向能省不少整数变量。天然气系统通常是辐射状带少量环网这个结构特点可以提前告诉建模者很多松弛方法的效果和网络拓扑强相关。4.4 求解器选择与参数调校建模层用 Python 的 CVXPY 或 YALMIP 都可以重要的是把 CVaR 写成 epigraph 形式交给求解器。求解器我偏好 GurobiMIP 的 cut 管理和二次约束处理比 CPLEX 顺手大算例节点较多、场景上千建议 MIP gap 设 1e-3CCG 的 gap 设 1e-2 就够调度决策用了再小只会让迭代次数和墙钟时间成倍增加。一个非常有效的工程技巧先用随机优化SO解一遍拿第一阶段整数解做 warm startCCG 迭代轮数能少 3-5 轮。另外主问题不要一上来就把全部历史场景都塞进去先按聚类选 200-300 个代表场景CCG 收敛后再逐步放宽模糊集半径验证算例规模能压下来不少。5. 算例设计与结果分析里的关键观察5.1 测试系统的搭建细节算例先用改进的 IEEE 14 节点电网和一个 6 节点天然气网耦合。电网上挂两台燃气机组、三台火电机组、两座风电场总风电装机 600 MW约占峰值负荷的 30%气网含两个气源、一个储气库P2G 放在风电接入点附近方便消纳弃风。负荷曲线取典型冬季日因为冬季气负荷高、电负荷也高能同时考验两套网络的瓶颈。不确定量取风电出力、电负荷、气负荷的日前预测误差误差分布用历史数据拟合不假设成完美正态。实际做的时候还要注意误差分布的风电占比特性渗透率越高误差分布的厚尾越明显这也正是 CVaR 能发挥价值的地方。5.2 场景样本与模糊集半径的确定用 Monte Carlo 从误差分布里抽 2000 个场景做训练集另外抽 5000 个场景做 out-of-sample 测试。模糊集半径 ε 的确定理论上有样本量给出的统计上界比如 ε 与 √(2 ln(1/β)/N) 同阶但直接用理论公式容易偏保守。我最后用的是工程做法对 ε 从 0.001 到 0.1 扫一遍每个 ε 跑一轮模型再对 out-of-sample 场景做仿真画出期望成本与 CVaR 的曲线选“成本还没明显翘头、CVaR 已经明显压下来”的拐点。这个拐点值落在 0.01-0.03 附近对应的物理含义是“允许真实分布相对历史样本有大约 2% 量级的运输距离偏移”。注意这里说的偏移量和代价函数 c(ξ,ξ̂_i) 的量纲强相关换了代价函数拐点位置就会变不能生搬硬套。5.3 三个基准方案的对比口径对比对象选三个SO直接用经验分布ε0无 CVaR、DRO-CVaR本项目方法λ0.4α0.95、RO盒式不确定集下的最坏场景模型。统一比较四项指标期望总成本、CVaR0.95、备用总预留容量、out-of-sample 的切负荷率。下面是某典型日的结果数值经脱敏处理方案期望成本(万元)CVaR0.95(万元)备用总量(MW)切负荷率SO82.4121.62103.2%DRO-CVaR85.1103.42651.1%RO91.8101.23200.4%这个表传达的核心信息是DRO-CVaR 用 3.3% 的期望成本增加换来了 CVaR 下降 15%、切负荷率从 3.2% 压到 1.1%。RO 虽然 CVaR 最低但备用多配了 55 MW日常成本高出 7.7%在工程上很难接受。这就是我坚持用 DRO 而不是直接上 RO 的原因给调度员的不是“世界上最安全的方案”而是“风险和成本都可解释、都算得过来账的方案”。5.4 结果里值得注意的规律第一备用容量会明显向气网瓶颈节点附近的机组倾斜。关键管道流量饱和时远处机组即使有富余调节能力也受制于供气能力模型宁可多花一点钱在瓶颈附近的机组上买备用。这个结果对规划部门特别有参考价值反复出现在高弹性位置的管道就是最值得扩建和增压的候选对象。第二置信水平 α 从 0.8 升到 0.95总备用容量抬升 15%-20%切负荷风险显著下降但继续升到 0.99 时成本几乎与 RO 持平收益已经到头。第三当风电渗透率提高时最优备用结构里 P2G 和需求响应的占比上升因为燃气备用的边际成本被气网约束抬高灵活负荷变成更有竞争力的备用资源。这些规律在跟非专业的调度人员解释模型价值时特别好用。6. 实操踩坑记录参数敏感性与收敛性经验6.1 置信水平 α 和风险权重 λ 的取值陷阱α 和 λ 是最容易被拍脑袋定的两个参数。α0.99 时 CVaR 实质上是“最高损失的期望”整个 DRO 会退化成 RO备用配得很满α 低于 0.8 时 CVaR 对尾部风险的刻画又太钝模型压不住真正的极端场景。λ 类似扫参数时能看到 CVaR 在 λ0.2-0.6 区间内下降最快过了 0.6 边际收益明显变平而期望成本开始抬升。给我的团队定的默认组合是 α0.95、λ0.4然后针对具体网络跑两轮敏感性再微调。不要指望一组参数吃遍所有算例不同气网结构、不同风电渗透率下最优 λ 能差 0.1-0.2。敏感性分析本身不复杂但一定要做否则评审时被问一句“你这参数哪来的”就尴尬了。6.2 模糊集半径 ε 的过小与过大ε 取太小模型约等于 SOout-of-sample 的 CVaR 基本没改善ε 取太大模糊集里塞进了大量不合理分布备用过度配置期望成本直线上升。我最开始用一个较激进的理论半径结果备用比最终方案多配了约 10%后来改成了拐点法。做法是对 5-6 个 ε 值做 out-of-sample 仿真选期望成本-CVaR 曲线上的拐点。经验是在 2000 个样本规模下ε 的合理量级通常在 0.01 附近但具体数值必须结合代价函数 c(ξ,ξ̂_i) 的量纲一起看。这里再提醒一句不要拿别人论文里的半径直接套用代价函数定义差一个尺度因子最优半径就完全不同。6.3 CCG 收敛慢和数值问题的处理这类两阶段 DRO 最容易在迭代后期出现上界、下界来回震荡。原因多半是第二阶段子问题产生的最坏场景分支太多或者主问题里新加列的数值尺度差异过大。我处理的办法有三条。第一机组启停整数变量只留在主问题子问题固定整数变量后用连续 LP 求对偶否则切出来的约束不可靠。第二对子问题返回的最坏场景做去重和聚类同一批极端场景合并成一列主问题规模增长会慢很多迭代后期尤其明显。第三记录 best UB 而不是当前 UB 做收敛判断因为当前上界在前期会明显抖动拿抖动值判断收敛容易误杀迭代。还有一个容易被忽略的细节CCG 和 Benders 的最大区别在于CCG 把子问题返回的最坏场景作为一个新列加入主问题同时强制第二阶段变量对该场景满足约束而 Benders 只加对偶割。前者在主问题里会多出变量和约束但收敛速度通常更快。另外Wasserstein 代价函数如果取二范数子问题里 sup 项会变成二次约束得给 Gurobi 开 NonConvex2 或改用一范数换回线性。我们的项目最终统一用一范数省掉了非线性求解的麻烦。6.4 对工程落地的三点看法最后说点个人体会。这套模型的真正价值不在那个目标函数数值而在两个副产品一是哪些节点、哪些管道位置对备用价格的弹性最大这直接告诉我们该在哪里修管道、增加压缩能力二是子问题里反复出现的最坏场景清单电负荷、气负荷同时偏高风电偏低气网管道受阻的组合在跟调度和运行人员汇报时比任何一个公式都有说服力。实际工程中气网参数经常残缺管径、长度拿不到就用名义值先标定再拿 SCADA 压力数据反推修正 Weymouth 常数效果比等数据齐了再建模好得多。我的落地方案是把 DRO-CVaR 算出的备用配置作为日前市场申报和实时调度的边界依据而不是当作必须逐点执行的指令这样既保住了风险可控性又给现场调度留了灵活性。如果你也在做电-气综合能源系统的能量-备用优化我建议第一步先别急着堆约束把自己的不确定性来源和可接受的风险水平讲清楚模型参数和结果解释都会顺很多。风险度量的选择本质上是对“你怕什么”的表达CVaR 和 DRO 的组合只是把这句话翻译成了数学语言。
返回列表