资讯动态

虚拟电厂日前鲁棒优化调度:应对源荷双重不确定性

发布时间:2026/10/21 3:01:59 来源:尧图企业网站定制
做虚拟电厂调度避不开一个现实问题你手里那些分布式光伏、储能、可调负荷没有一个会老老实实按预测曲线走。我最早跑日前优化时也天真地以为只要把光伏出力“预测准”、把负荷曲线“估准”剩下的交给混合整数线性规划就行。结果现场一对比凡是碰上阴雨天或者某个园区临时加产计划就被打乱。后来才意识到与其只盯着预测精度不如在调度模型里直接承认不确定性让计划在“最不想看到的情况”下也能扛住这就是鲁棒优化进场的原因。这篇文章就把“计及源 - 荷双重不确定性的虚拟电厂日前鲁棒优化调度”这串很长的题目拆开讲清楚。它解决的问题是虚拟电厂在提前一天制定次日计划时源侧出力、荷侧需求都不确定怎么做一个不依赖精确预测、又不过分保守的调度方案。适合正在做虚拟电厂、园区综合能源、微网调度的同学参考也适合刚接触鲁棒优化但被文献里的符号绕晕的初学者。我会从问题背景、模型数学形式、CCG求解流程、算例结果和调试经验五个部分展开最后分享一些我实际踩坑后的个人体会。1. 虚拟电厂为什么绕不开源 - 荷双重不确定性1.1 虚拟电厂的形态与调度难题虚拟电厂不是新建一座电厂而是把分散的分布式光伏、风电、储能、燃气轮机、可调负荷、充电桩等资源“打包”成一个整体统一参与电力市场或者接受电网调度。从资产角度看它像一个资产组合从调度角度看它又像一个可以对外输出功率曲线的电源。难点在于这个电源内部的每一类资源都有自己的物理约束而且不像传统火电那样可控性那么强。举个例子光伏的出力受云层影响几分钟内就可能大幅波动储能系统有容量和充放电功率限制不能想充就充、想放就放可调负荷又涉及用户体验不能无限压减。把这些约束放在一起做成一个优化模型本身就不容易。更麻烦的是虚拟电厂对外承诺的出力曲线一旦定了日内偏离太多就要面临考核或罚款。所以调度策略必须给“不确定的那部分”留出足够余地。1.2 源 - 荷双重不确定性到底指什么传统确定性调度模型里光伏出力、风电出力、负荷需求通常被当作已知参数也就是常用预测值。比如预测明天中午光伏 4 兆瓦模型就把 4 兆瓦写进约束里。但真实情况是光伏可能只有 3 兆瓦也可能到 5 兆瓦负荷可能比预测高 10%也可能低 5%。这些偏差统称为不确定性。其中“源不确定性”指分布式电源出力的随机性光伏、风电最典型。光伏受云层、温度影响风电受风速、风向影响而且预测误差会随着时间尺度拉长而增大。“荷不确定性”指负荷预测误差包括居民用电习惯变化、工商业临时增加生产、天气导致空调负荷突增等。两者叠加后净负荷曲线的波动往往比单一因素更剧烈这也是为什么标题特别强调“双重”——不是只考虑源侧也不是只考虑负荷侧而是两边同时波动。1.3 为什么“日前”尺度最值得先做调度问题按时间尺度分日前、日内、实时。日前调度的特点是提前一天决定次日的机组启停、储能充放电计划、购售电计划等这些决策往往需要提前申报无法等到实时再改。比如电力现货市场要求日前申报机组启停也有最小开停机时间约束储能如果日内频繁切换策略对寿命和效率都不利。所以虚拟电厂的实际业务流程里日前计划是“定调子”的关键一步。如果日前计划太激进日内实时调整的空间就小如果太保守经济性又差。鲁棒优化正好适合这种“先做决策、后见真章”的问题。日内滚动修正可以作为后续闭环但日前鲁棒调度是最值得先落地、也最容易量化收益的部分。2. 鲁棒优化的建模思路从随机优化到两阶段鲁棒2.1 三种思路的对比处理不确定性业内主流有三条路线。第一条是随机优化。它假设不确定参数的概率分布已知通过生成大量场景来逼近期望成本并用概率约束处理风险。优点是经济性好缺点是你很难拿到准确分布而且场景太多时求解规模爆炸。第二条是模型预测控制MPC利用滚动优化不断修正计划适合日内实时控制但没法直接解决“提前一天报价”时的决策问题。第三条就是本文的主题——鲁棒优化。它不依赖概率分布只要求不确定参数落在一个集合内目标是让方案在这个集合里任意实现下都可行、成本都可控。我个人的体会是鲁棒优化特别适合第一版落地。原因很现实虚拟电厂的历史数据往往不够支撑精细的概率建模但调度人员对“光伏可能偏离多少”“负荷可能偏离多少”是有经验的这正好可以转化成不确定性集合参数。先保证“不出事”再逐步向随机优化或分布鲁棒方向演进。2.2 不确定性集合的选取盒式集合与预算约束鲁棒优化里最关键的一步是把“不确定参数能变成什么样”描述清楚。最常用的是盒式集合也叫区间集合。对每个时段 t光伏出力 P_pv,t 在预测值附近波动可以写成P_pv,t 属于 [ P_pv,t_hat - ε_pv,t, P_pv,t_hat ε_pv,t ]其中 P_pv,t_hat 是预测出力ε_pv,t 是最大偏差。这样描述虽然简单但有一个问题如果所有时段同时取最坏值方案会非常保守成本会高到无法接受。考虑到实际中极端情况不可能每个时段都发生于是引入预算参数 Γ。预算约束限制了所有时段不确定参数偏离预测值的总“量”。数学上可以写成Σ_t |P_pv,t - P_pv,t_hat| / ε_pv,t ≤ Γ_pvΓ_pv 越大表示允许更多时段出现偏差方案越保守Γ_pv 0 时退化为确定性模型Γ_pv T 时就是最保守。负荷侧也类似。这样做的好处是既能保证鲁棒性又能通过 Γ 调节经济成本和风险之间的平衡。2.3 两阶段鲁棒的标准形式虚拟电厂日前调度不是简单的“一次性决策”因为有些变量必须在不确定性实现前就定死有些变量可以等实际看到出力之后再调整。比如机组启停状态、日前购电合同往往提前定而储能实际功率、可调负荷削减量可以在日内微调。于是很自然地用两阶段鲁棒优化建模。标准形式可以写成min_x max_{u ∈ U} min_y c^T x d^T ys.t. Ax ≤ b, Fx Gy ≤ h(u), u ∈ U其中 x 是一阶段变量表示在不确定性发生前就要确定的决策u 是不确定参数在集合 U 里变化y 是二阶段变量表示不确定性实现后允许调整的决策。目标函数在所有可能的不确定场景下都尽可能小。这样的模型在数学上叫 min-max-min 形式没法直接丢给求解器需要转成可迭代求解的主问题-子问题结构。这个形式对虚拟电厂特别合适因为日前光伏出力不确定、负荷不确定但储能剩余容量、可调负荷的动作都可以在日内根据实际情况修正。3. 模型搭建与求解实操从目标函数到 CCG 迭代3.1 决策变量与参数定义实际建模前建议先把变量和参数理清楚。我习惯用一张表把虚拟电厂设备的信息整理出来模型写起来不容易出错。符号含义单位P_g,t燃气轮机 t 时段出力MWu_g,t燃气轮机 t 时段启停状态0/1-P_ess_c,t / P_ess_d,t储能充电 / 放电功率MWSOC_t储能电量MWhP_buy,t / P_sell,t虚拟电厂向外部电网购电 / 售电功率MWP_cur,tt 时段可调负荷削减量MWP_pv,t / P_wt,t光伏 / 风电实际出力MWP_load,t实际负荷MW参数包括各类设备的容量上限、爬坡速度、储能充放电效率、容量上下限、峰平谷电价、可控负荷削减补偿单价、预测出力、预测负荷以及对应的偏差区间。基础参数越清楚后面写约束越顺畅。3.2 目标函数与约束怎么写目标函数是总运行成本最小通常包括购电成本、售电收入、燃气轮机燃料成本、启停成本、可调负荷削减补偿成本、储能运维成本。可以写成min Σ_t ( c_buy,t * P_buy,t - c_sell,t * P_sell,t c_g * P_g,t c_start * u_g_start,t c_cur * P_cur,t c_ess * (P_ess_c,t P_ess_d,t) )约束里面最重要的是功率平衡约束表示虚拟电厂内部所有资源的功率之和等于实际负荷Σ P_g,t P_pv,t P_wt,t P_ess_d,t P_buy,t - P_ess_c,t - P_sell,t P_load,t - P_cur,t此外还有储能 SOC 递推约束、充放电状态互斥约束、燃气轮机出力上下限与爬坡约束、可调负荷最大削减量约束、购售电功率上限约束等。这些约束大部分是线性的整模型可以写成混合整数线性规划MILP这对后续用商业求解器求解很重要。值得注意的是功率平衡约束里面有不确定量 P_pv,t、P_wt,t、P_load,t所以直接求解不现实。两阶段鲁棒优化把功率平衡放在了二阶段约束里一阶段只做日前决策二阶段根据不确定性实现调整储能、可调负荷、燃气轮机出力来确保平衡这才是整个建模的精髓。3.3 列与约束生成算法 CCG 拆解主问题-子问题迭代求解是目前处理两阶段鲁棒最流行的方法叫列与约束生成英文简称 CCG。它和传统 Benders 分解一样不断迭代但收敛更快因为每次迭代都会往主问题里加新变量和新约束。算法流程可以这样理解初始化上界 UB 为无穷大下界 LB 为负无穷大选择一组初始不确定参数 u_0。求解主问题主问题是在一组已知场景下做一阶段决策并引入辅助变量 η 表示第二阶段成本。求解后得到一阶段解 x_k 和最优值更新下界 LB。将 x_k 固定下来代入一个最大最小子问题max_{u∈U} min_y d^T ys.t. Fx_k Gy ≤ h(u)求解这个子问题找到最坏情况的不确定参数 u_{k1} 以及对应的最小成本。然后更新上界 UB。 4. 判断 UB 和 LB 之差是否小于预设收敛阈值。如果满足就停止如果不满足把这个最坏场景对应的新变量和约束加入主问题继续迭代。子问题里的 max-min 结构在约束为线性时通常通过强对偶把内层最小化转成外层最大化然后处理双线性项。最终子问题会变成一个混合整数线性规划可以直接用求解器算。实际代码里可以在 Python 中用 Pyomo 建模再调用 Gurobi 或 CPLEX 求解。这里给出一个简化的 CCG 伪代码框架方便理解# 初始化 lb -1e9 ub 1e9 u_worst initialize_u() while ub - lb tolerance: # 主问题给定 u_worst求一阶段解和辅助成本 x, eta, lb solve_master(u_worst) # 子问题固定 x寻找最坏场景和最小成本 u_new, sub_cost solve_subproblem(x) # 更新上界 ub min(ub, objective(x) sub_cost) # 若未收敛添加割约束到主问题 if ub - lb tolerance: add_cut_to_master(u_new)实际的收敛指标可以用相对间隙比如 |UB - LB| / |LB| 1%。对虚拟电厂这种规模的 MILPCCG 通常十几轮迭代就能收敛前提是子问题对偶线性化处理得当。4. 典型算例分析鲁棒调度到底让成本高了多少4.1 算例设置为了看清楚鲁棒调度和确定性调度的差别我构造了一个典型的园区虚拟电厂算例光伏 5 MW、风电 3 MW、储能 2 MW / 4 MWh、燃气轮机 1 MW、可调负荷 2 MW峰平谷三段电价。预测负荷曲线最高 10 MW最低 6 MW。光伏预测假设中午达到峰值负荷预测有两个高峰。不确定性方面光伏偏差取预测值的 ±20%负荷偏差取 ±10%。调度周期取 24 小时时间分辨率为 1 小时。在此基础上做三组对比第一组是确定性模型直接用预测值算第二组是鲁棒模型Γ_pv 取 12Γ_load 取 8第三组是更保守的鲁棒模型Γ_pv 取 24Γ_load 取 24。成本里包含了购电、启停、燃料、负荷削减补偿等。4.2 结果对比与解读调度策略日前计划成本最坏场景实际成本光伏弃光 / 切负荷情况确定性调度12.8 万元15.9 万元最坏场景切负荷 0.9 MWh鲁棒调度中等保守13.6 万元13.9 万元无切负荷少量光伏弃光鲁棒调度高度保守14.8 万元15.1 万元无切负荷弃光增加明显这个结果很能说明问题。确定性模型由于没有考虑偏差计划成本看起来很低只有 12.8 万元但一旦实际出现“光伏少发 负荷上升”的最坏组合它就需要在日内紧急切负荷或高价购电实际成本飙到 15.9 万元。中等保守的鲁棒模型日前计划成本上升到 13.6 万元但最坏场景成本只到 13.9 万元既保证了可靠性又没有贵太多。这说明适度的鲁棒化相当于用约 6% 的成本溢价换掉了最坏情况下 20% 以上的风险成本性价比非常明显。高度保守的鲁棒模型把 Γ 取到最大成本继续上升到 14.8 万元最坏场景 15.1 万元但相比中等保守的方案可靠性提升有限反而因为过多预留备用导致光伏弃光量增加。所以实际操作中Γ 并不是越大越好通常取总时段数的 1/3 到 1/2 就能覆盖大部分风险。4.3 保守度调节的实用技巧调节保守度最直接的办法就是改 Γ。Γ 的取值范围从 0 到 T但我在实际测试中发现并不是每个时段对风险贡献一样。光伏出力较大的午间时段偏差绝对值也大同样的 Γ 配额留给这些时段对成本影响更明显负荷高峰时段的偏差会影响是否切负荷更重要。建议做一次敏感性分析固定一个初始 Γ然后逐周扫描 Γ 从 0 到 T把成本和可靠性指标画在一张图里寻找“成本拐点”。拐点之后继续增加 Γ可靠性提升很小但成本涨得很快这个拐点附近的 Γ 就是适合工程使用的值。这个方法比拍脑袋选参数靠谱很多而且可以直接写进项目报告里。另一个技巧是不同资源使用不同的 Γ。源侧光伏和负荷侧的不确定性特征不一样光伏可能连续阴天导致多时段低出力负荷高峰偏差往往集中在固定几个时段。因此给源侧带独立预算、负荷侧带独立预算比共用一个大 Γ 更符合实际也更省成本。5. 常见问题与排查经验实录5.1 不确定性集合参数该怎么定很多人问光伏偏差取 ±20% 有没有依据。这个数字不是拍脑袋定的可以根据历史预测数据和实际出力的偏差统计得到。把过去三个月的光伏预测误差按时段统计取 80% 或者 90% 分位数作为 ε就是工程上比较稳妥的选择。负荷侧同理。如果没有历史数据可以先用 ±10% 起步再通过仿真校验。另外要特别注意偏差的单位。有人说“光伏偏差 20%”到底是相对预测值的百分比还是绝对功率在建模时一定要统一成绝对功率比如预测 5 MW、偏差 ±20% 就是 1 MW写成区间 [4, 6] MW。否则在不同预测值下同样的百分比换算出的绝对偏差不一样会直接影响鲁棒效果。5.2 求解不收敛或收敛太慢怎么办CCG 在实际运行中主要问题是子问题双线性项线性化后的大 M 取值。大 M 取得太大求解器数值稳定性变差MILP 求解时间飙升取得太小又会错误地截断可行域。我的经验是大 M 要结合物理约束的边界来确定不要全部统一用一个很大的值。比如储能放电功率上限是 2 MW那和它相关的二元变量大 M 就可以取 3 或者 5没必要取 10000。不同约束使用各变量量纲下更紧的边界能显著提升求解速度。如果迭代不收敛还需要检查主问题里有没有加入足够多的“已发现最坏场景”。开始迭代前可以先把几个预测偏差较大的极端场景作为初始场景加入主问题比如“光伏全天最小、负荷全天最大”“光伏全天最大、负荷全天最小”这样前期下界增长更快减少迭代轮数。5.3 模型规模太大求解时间过长的优化方向虚拟电厂聚合的资源数量一旦超过几十个再考虑 96 个时段、每个时段都有启停变量模型会膨胀得很快。这里有几个减少规模的经验。第一个思路是聚合同类资源。同一园区里参数接近的储能系统可以先聚合成一台等效储能类似的分布式电源也可以聚合。聚合后约束数量大幅减少但功率平衡和调节能力基本不变。第二个思路是用典型日代替全时段。如果只关心日前调度但不想做 365 天的逐日求解可以用聚类算法选出几个典型日场景在典型日上做鲁棒调度再映射回具体日期。第三个思路是在主问题里不要把二阶段所有时段的全变量都一次加进来只在生成了最坏场景后加入对应时段的变量。这会降低主问题初始规模让前几轮迭代跑得更快。5.4 鲁棒解过于保守的应对措施常有人说鲁棒调度出来的储能曲线“太难看”整天预留着容量实际上大部分天气都浪费了。这里有两个应对手段。第一是引入“后悔值”或者机会约束的概念就是允许极小概率下失负荷但失负荷量受惩罚约束。鲁棒集合外层留一个极端的、概率极低的点内层用现有的 Γ 覆盖常规风险成本能显著下降。第二是和确定性调度做混合决策比如储能充放电计划用确定预测算但燃气轮机和购电合同的容量用鲁棒模型算这样“大方向经济、边界可靠”。我在项目里实操过第二个方案效果很明显。只对关键备用容量做鲁棒化日前成本增加可以控制在 2% 到 4%同时最坏场景的可靠性几乎不受影响。对调度团队来说这样的结果也更容易被接受。一点个人体会把“计及源 - 荷双重不确定性的虚拟电厂日前鲁棒优化调度”落地到能跑、能交付、能解释最花时间的其实不是模型推导而是把调度员的经验翻译成数学约束。功率平衡、爬坡、SOC 这类约束写起来都有公式可依但 Γ 取多少、偏差区间取多少、哪些资源允许二阶段调整这些才真正影响方案质量和可接受度。我个人的经验是从小算例起步先用 24 小时、每小时一点、单个虚拟电厂跑通 CCG再逐步加 96 时段、加多设备、加市场规则。不要一上来就追求完美的两阶段模型因为一旦结果不合理你很难判断是建模问题、参数问题还是求解器设置问题。先给一个最笨的确定性模型做基线再一步步把不确定性加进去每一步都能看到成本和可靠性的变化这种方法在团队协作中也很有效。最后再分享一个实用小技巧所有鲁棒优化的结果一定要同时保存“最坏场景”和“对应的一阶段决策”而不只是保存成本数值。复盘时能看到是哪类场景把调度逼到了极限是光伏低出力还是负荷拉高这比冷冰冰的成本曲线更有价值。这个思路后续还可以往分布鲁棒优化、日内滚动闭环、市场报价策略方向扩展但那是另一个话题了。

读完文章,也想定制专属网站?

尧图设计师 24 小时内与您沟通定制方案

免费获取报价 →
↑