做综合能源系统优化调度这几年,我最大的感受是:建模本身并不难,难的是怎么处理那些“说不准”的东西。风光出力就是典型的例子——你明明把设备约束、运行策略都写得明明白白,结果第二天一阵云飘过来,光伏出力直接掉一半,整个调度计划跟着乱套。今天想聊的,是我最近在工程里反复验证过的一套方案:计及风光不确定性的,基于IGDT(Info-Gap Decision Theory,信息间隙决策理论)的综合能源系统优化调度。
这套东西说白了,就是用IGDT给风光不确定性“留余地”——不追求一个最优解,而是在保证一定收益的前提下,找到最扛风险的那个调度方案。听上去很简单,但真要把模型搭起来、把约束写全、把参数调好,里面的门道不少。我打算从模型原理讲到算例实操,再聊几个我踩过的坑,尽量把它说透,给同样在搞IES优化调度的朋友一个能直接参考的版本。
1. 为什么综合能源系统调度绕不开风光不确定性
1.1 风光出力到底“不确定”在哪
很多刚入行的朋友容易把“不确定性”简单理解成“预测不准”,其实问题远不止这么简单。对风电来说,转速随风速变化,而风速受地形、气压、温度、乱流影响极大,哪怕同一座风电场,相距几百米的风机出力都可能差出两成以上。光伏更看天吃饭,云层遮挡能让出力曲线在几分钟内出现剧烈波动,夏季午后雷暴期间的爬坡速率尤其是噩梦。
这些不确定性体现在调度层面,会带来三层实际问题:
- 平衡层面:系统内的电、热、气实时平衡被打破,备用容量如果预留不足,就可能出现弃风弃光或者切负荷。我做过一个实测项目,某园区光伏渗透率到40%以后,中午时段出力的骤降速度,比传统机组爬坡速度快了将近一倍,光靠火电机组根本追不上。
- 经济性层面:如果调度方案为了包住最坏情况,把备用容量留得过大,正常运行日的运行成本会显著偏高。最极端的场景下,备用成本能占到总运行成本的15%到20%,这在商业项目里是很难接受的。
- 决策层面:确定性调度给出的是一个“点方案”——就一套出力曲线。但真实运行环境里,你可能面对的是几百种出力场景,点方案只能覆盖其中一种,到了运行日一旦天气变化,这套方案基本得推翻重来。
1.2 三种主流处理手段,IGDT赢在哪
行业内处理风光不确定性,主流有三种思路:随机规划、鲁棒优化,以及本文要重点讲的IGDT。它们的数学基础、适用场景和代价差异非常大。我自己把三者做了个对比:
| 方法 | 不确定性描述方式 | 数据需求 | 求解复杂度 | 决策风格 |
|---|---|---|---|---|
| 随机规划 | 已知概率分布或多场景 | 需要大量历史数据 | 高(场景数爆炸) | 期望收益最优 |
| 鲁棒优化 | 不确定集(盒式/椭球式) | 只需边界信息 | 中高(对偶转化后可解) | 最坏情况最优 |
| IGDT | 信息间隙模型(偏差系数) | 只需预测值 | 中(双层转单层) | 保底收益下最大化抗扰能力 |
随机规划的问题在于,你很难准确地给风光出力定义一个概率分布。光伏的出力特性受地区气候影响极大,很多项目现场的实测数据根本不够支撑一个可信的分布模型。我见过不少团队用历史数据强行拟合分布,结果生成的场景和实际差得很远,调度方案自然也就“失真”了。
鲁棒优化走的是另一条路:它把不确定性描述成一个“集合”,然后求解最坏情况下的最优解。思路没错,但它的结果通常偏保守——因为它默认所有不确定参数同时取到最坏值。而在真实运行中,风电和光伏、不同时间断面的出力误差是彼此抵消的,不太可能集体“崩盘”。这就导致鲁棒优化方案运行成本过高,在工程上很难说服投资方。
IGDT的优势恰恰在于它跳出了“概率”和“集合”这两个框架。它只要求有一个预测值,然后通过一个“信息间隙”参数来衡量预测值可能的偏离程度;决策者不必声称“误差服从什么分布”,只需要回答一个问题:我愿意承受多大的收益损失,去换取多大的不确定性耐受能力?这种决策逻辑和工程实际非常贴合——现场决策者关心的不是统计意义上的期望,而是“最差能差到哪去,我能不能扛得住”。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 信息间隙决策理论:一篇讲透IGDT
2.1 IGDT的核心思想与不确定性模型
IGDT是Ben-Haim在2001年前后提出的一套决策理论,它最核心的出发点就是承认不确定性太大、太复杂,以至于我们连一个包住所有情况的“集合”都难以准确构建。它用“信息间隙”这个更朴素的量来描述预测值与真实值之间的差距。
具体到综合能源系统调度,我们设风光出力的预测值为 (\tilde{P}),实际出力为 (P),IGDT把不确定性建模成这样一个集合:
[
U(\alpha, \tilde{P}) = \left{ P : \left| \frac{P - \tilde{P}}{\tilde{P}} \right| \leq \alpha \right}
]
这里的 (\alpha) 就是信息间隙半径,也叫不确定性半径。它表示实际出力偏离预测值的最大相对比例。(\alpha = 0) 时没有任何不确定性,模型退化成确定性模型;(\alpha = 0.2) 意味着实际出力可能比预测值低或高20%。
这个建模方式有两个很实用的特点。一是不需要任何概率信息,只要你手里有一个预测值就能干活;二是 (\alpha) 本身是一个可调节参数,它把“不确定性有多大”变成了一个决策变量,而不是一个既定事实。这给了调度人员极大的灵活性:今天天气预报准,(\alpha) 就设小一点;明天强对流天气,(\alpha) 就调大一点。
2.2 鲁棒模型与机会模型
IGDT的决策模型有两副面孔:风险规避的鲁棒模型(Robustness Model)和风险偏好的机会模型(Opportunity Model)。大多数综合能源系统调度用前者,但我建议你把两个都搞清楚,因为它们本质上是同一个问题的两面。
鲁棒模型回答的问题是:在保证系统收益不低于某个可接受阈值的前提下,我能承受的最大不确定性是多少?写成数学语言:
[
\hat{\alpha}(r_c) = \max \alpha
]
[
s.t. \quad \min_{P \in U(\alpha, \tilde{P})} F(x, P) \leq r_c
]
这里的 (F(x, P)) 是系统运行成本,(r_c) 是决策者能接受的最高成本(也就是保底收益)。这个模型的物理含义非常直观:你要我保证成本不超过 (r_c),那我反过来最大化 (\alpha),看看系统最多能扛多大的出力偏差。(\alpha) 越大,方案越保守但越抗风险。
机会模型则反过来:假设实际出力往有利方向偏离,我能比预期多赚多少?它的数学形式是:
[
\hat{\beta}(r_w) = \max \beta
]
[
s.t. \quad \max_{P \in U(\beta, \tilde{P})} F(x, P) \leq r_w
]
实际工程中,调度方更关心的永远是“别亏钱”,所以我下面的实操主要以鲁棒模型为主线。但在成本允许的前提下,同时算一遍机会模型,可以帮你看清楚这个系统在乐观场景下有多少利润空间,这对于投资回收期测算、容量配置评估都有参考意义。
3. 计及风光不确定性的综合能源系统优化调度模型
3.1 系统结构与设备建模
在动手写公式之前,先把场景立起来。我这里使用的是典型的园区级综合能源系统,包含的设备有这么几类:
- 供电侧:风电机组(WT)、光伏阵列(PV)、燃气轮机(GT),以及向上级电网购电的联络线。
- 供热侧:燃气锅炉(GB)、余热回收系统、储热罐(HS)。
- 储能侧:蓄电池(ESS),用于平抑电力波动、实现削峰填谷。
- 负荷侧:电负荷、热负荷,两者通过热电联产机组耦合,这也是综合能源系统“综合”二字的体现。
设备建模的要点我逐个说:
燃气轮机是最核心的耦合设备,它的电出力 (P_{GT}(t)) 和热出力 (H_{GT}(t)) 满足热电比约束,同时还要考虑爬坡约束和最小启停时间。实际建模时,我会用线性化的热电可行域来处理,比简单的固定热电比要精确得多。燃气轮机的燃料成本可以近似为出力的二次函数,但在模型里为了线性求解,通常会分段线性化。
蓄电池的建模大家都熟悉,关键是处理好SOC(荷电状态)的递推关系和充放电效率。我习惯把充放电功率分开建模,引入两个0-1变量来避免同时充放电。SOC的初始值和终值一般设为相同,这样储能一天下来是“净零”的,不会把前一天的“老本”吃掉。
储热罐的建模和蓄电池类似,区别在于热损失率比自放电率更低,而且没有充放“功率因数”那么复杂的约束。但要注意,储热罐的容量单位是kWh,和储电的kWh在能量品位、转换效率上不一样,这两个量千万不要混在一起算。
3.2 基准确定性模型
确定性模型是整个IGDT框架的“底座”,IGDT的鲁棒模型就是在它上面做改造的。我们先看这个底座长什么样。
目标函数是系统总运行成本最小化,包括购电成本、燃气成本、设备运维成本和弃风弃光惩罚:
[
\min F = \sum_{t=1}^{T} \left[ c_{buy}(t)P_{buy}(t) + c_{gas}(t)(P_{GT}(t) + H_{GB}(t)) + \sum_{i} c_{OM,i}P_i(t) + c_{curtail}(P_{WT}^{avail}(t) - P_{WT}(t) + P_{PV}^{avail}(t) - P_{PV}(t)) \right]
]
其中 (P_{buy}(t)) 是时段 (t) 从上级电网购买的电功率,(c_{buy}(t)) 是分时电价;(c_{gas}) 是天然气单位热值成本;(c_{OM,i}) 是第 (i) 台设备的单位运维成本;最后一项是弃风弃光惩罚,如果实际消纳的风光出力 (P_{WT}(t) + P_{PV}(t)) 低于可用的 (P_{WT}^{avail}(t) + P_{PV}^{avail}(t)),就要付罚金。
约束条件分成四组。
功率平衡约束(把电、热分开写):
[
P_{WT}(t) + P_{PV}(t) + P_{GT}(t) + P_{buy}(t) + P_{ESS}^{dis}(t) = P_{load}(t) + P_{ESS}^{ch}(t) + P_{EB}(t)
]
[
H_{GT}(t) + H_{GB}(t) + H_{HS}^{dis}(t) = H_{load}(t) + H_{HS}^{ch}(t)
]
这里的 (P_{EB}(t)) 是电锅炉的耗电功率,它把电转化成热,是电热耦合的另一个通道。
设备出力约束:每个设备的出力都有上下限,比如 (P_{GT}^{min} \leq P_{GT}(t) \leq P_{GT}^{max}),燃气轮机和燃气锅炉的爬坡约束也不能漏掉。
储能约束:包括SOC递推、充放电功率限制、充放电互斥约束。
风光出力约束:在确定性模型里,(P_{WT}(t)) 和 (P_{PV}(t)) 被限定为等于预测值,也就是没有不确定性。当然,允许弃风弃光的情况下,实际出力可以低于预测值。
这个模型是一个典型的混合整数线性规划(MILP),用Gurobi或者Cplex都能直接求解。一个24时段、5台设备的小规模系统,求解时间基本都在几十秒内。如果你的问题包含多场景、多区域,模型规模会指数级膨胀,那就要考虑分解算法了,但这个不是今天讨论的重点。
3.3 嵌入IGDT的鲁棒调度模型
现在到了核心部分:怎么把IGDT的鲁棒模型套到上面的确定性模型里去。
第一步,确定不确定参数。在这个系统里,风光出力 (\tilde{P}{WT}(t))、(\tilde{P}(t)) 是预测值,我们假设真实值会在预测值的 (\alpha) 相对偏差范围内波动:
[
P_{WT}(t) \in [(1-\alpha)\tilde{P}{WT}(t), (1+\alpha)\tilde{P}(t)]
]
[
P_{PV}(t) \in [(1-\alpha)\tilde{P}{PV}(t), (1+\alpha)\tilde{P}(t)]
]
注意,这里 (\alpha) 不是一个预先给死的常数,而是决策变量。这正是IGDT和鲁棒优化的关键区别。
第二步,定义保底成本 (r_c)。引入一个偏差系数 (\sigma),它表示决策者相对于确定性最优成本 (F_0) 能接受的成本上升比例:
[
r_c = (1 + \sigma) F_0
]
比如 (F_0 = 10) 万元,(\sigma = 0.1),那保底成本就是11万元。(\sigma) 的含义是“我最多多花10%的钱,去换取系统抗击不确定性的能力”。
第三步,把目标函数改写成最大化不确定性半径:
[
\max \alpha
]
同时把原来确定性模型的目标函数改成一个额外约束:
[
F \leq (1 + \sigma) F_0
]
除此之外,所有设备约束、平衡约束原封不动保留,只是把风光出力约束换成区间约束。
这个双层结构的含义是:外层决定 (\alpha) 取多大,内层在给定的 (\alpha) 下寻找使总成本最大的风光出力组合。如果这个最坏情况下的成本仍然不超过保底成本,那当前 (\alpha) 就是可行的;否则就需要调小 (\alpha)。(\alpha) 越大,系统的抗风险能力越强。
这样一来,模型就从“成本最小化”变成了“抗扰能力最大化”。运行成本不再是一个需要精确压到最低的目标,而是变成了一条“红线”——你只要不越过这条红线,系统越能扛不确定越好。
4. 实操环节:模型怎么搭、怎么解
4.1 双线性项的对偶转化求解
IGDT鲁棒模型是个双层优化,直接扔给求解器是解不了的。业内标准做法是用对偶理论把内层问题转成约束,把双层问题压成单层。我在论文和工程里都用的这一招,效果很稳。
具体来说,内层问题是在给定 (\alpha) 下找最大的总成本,但由于风光出力的区间端点就是最坏情况(成本是出力的单调减函数),内层极大值必然发生在风光出力取区间下限时。于是,最坏情况下的可用风光出力为:
[
P_{WT}^{w}(t) = (1-\alpha)\tilde{P}_{WT}(t)
]
[
P_{PV}^{w}(t) = (1-\alpha)\tilde{P}_{PV}(t)
]
这一步可以把整个双层结构大大简化——你根本不需要复杂的KKT条件推导,直接把预测值乘以 ((1-\alpha)) 放进约束里,就是最坏情况的刻画。前提是系统运行成本随风光出力增加而降低,这在绝大多数IES里都成立,因为风光边际成本接近零,多发风光必然降低购电和燃气成本。
但要注意,这个简化成立时,保底成本约束里会出现 (\alpha) 和 (P_{WT}^{w}) 的乘积项,也就是双线性项,模型又变成了非凸问题。我处理的办法是把风光可用出力表示成:
[
P_{WT}^{w}(t) = \tilde{P}{WT}(t) - \tilde{P}(t) \cdot \alpha
]
然后用0-1变量和分段线性化技术去逼近这个乘积项。比如把 (\alpha) 离散化成N个区间,对应N+1个端点,引入SOS2约束(Special Ordered Sets of Type 2),用相邻端点的插值来表示乘积。这样模型又可以回到MILP的框架里。实测下来,N取20就已经有足够精度,求解时间也只有几十秒到几分钟。
如果不想搞这么麻烦,还有一个更工程化的近似方案:把 (\alpha) 作为外层的参数做扫描。比如从0开始,以0.05为步长逐次增加,每次固定 (\alpha) 后求解一个标准MILP,直到成本超过保底成本为止。这样就不用做线性化,代价是要求解多次MILP,但胜在实现简单、逻辑直观,尤其适合做工程验证。
4.2 算例参数与计算结果
下面给一组我实际跑过的算例参数,你可以拿回去复现。
系统含一台500kW的燃气轮机,热电比1.5,爬坡速率150kW/10min;一台300kW燃气锅炉;储能容量500kWh,最大充放电功率200kW,充放电效率均为0.95;储热罐容量800kWh。风电装机600kW,光伏装机400kW。负荷侧,电负荷峰值约900kW,热负荷峰值约700kW,取自某园区典型冬季日数据。分时电价低谷0.3元/kWh、平段0.6元/kWh、高峰1.1元/kWh。
先求解确定性模型,得到最小运行成本 (F_0 = 4.86) 万元。然后取 (\sigma = 0.05、0.10、0.15、0.20) 几档,分别求解IGDT鲁棒模型,得到对应的最大不确定性半径:
| 偏差系数 (\sigma) | 保底成本(万元) | 最大 (\alpha) | 方案特征 |
|---|---|---|---|
| 0.05 | 5.10 | 0.08 | 轻微保守,机组出力调整小 |
| 0.10 | 5.35 | 0.17 | 中等保守,储能充放电策略改变 |
| 0.15 | 5.59 | 0.26 | 明显保守,更多依赖外部购电 |
| 0.20 | 5.83 | 0.34 | 高保底,储能转为保底支撑 |
结果有个很有意思的现象:(\sigma) 从0.05增加到0.10,(\alpha) 从0.08增加到0.17,几乎翻了一倍。这说明在低保守度区间,稍微多花一点保底成本,就能换到很可观的抗扰能力提升。但随着 (\sigma) 继续增大,(\alpha) 的增速明显放缓,边际效益在递减。在实际工程中,我一般建议选曲线上“肘部”的位置作为运行点——既不花冤枉钱,又能覆盖大部分天气风险。
5. 常见问题与调试排坑实录
5.1 模型不收敛,怎么办
IGDT模型最常见的坑是内层“最坏情况”搞错。我见过很多初学者把内层写成“同时把风光出力压到最低”,这在多数情况下是对的,但如果你在目标函数里有弃风弃光惩罚项,情况就要小心了。因为弃风弃光惩罚的存在,风光出力降低并不一定导致成本增加——反正我可以选择弃掉一部分,付出的罚金是固定的。这时候,最坏情况就可能出现在区间内部,而不是端点。
遇到这种情况,最稳妥的办法是老老实实走KKT条件或者强对偶转化,不要用端点替代的简化。只有在确定目标函数对风光出力是严格单调的时候,才可以直接用区间端点。
另一个常见问题是数值病态。风光出力的预测值可能有很大的数量级差距——比如风电装机600kW,而购电量可能到几千kW,两者的系数差可能导致约束矩阵条件数过大,求解器在数值上不稳。解决办法是先做归一化:把所有功率量纲统一标幺化,或者至少把单位统一成MW,避免kW和MW混用。
5.2 必踩的坑与对应调整
**坑一:(\alpha) 的搜索步长和上界设置不合理。**如果步长太粗,比如0.1起步,你可能会漏掉 (\alpha=0.15) 这个刚好满足约束的边界点,导致结果明显偏保守。建议第一遍用大步长(0.1)做全局扫描,确定大致区间后,再用小步长(0.01)在边界处细化。
**坑二:储能约束里忽略了充放电互斥。**很多模型里如果同时引入充电和放电两个变量,不加0-1互斥约束,求解器会“钻空子”同时充电和放电,利用效率损耗制造无意义的循环流。这在确定性模型里也可能发生,在IGDT模型里更隐蔽——因为 (\alpha) 的引入会让成本约束更紧,求解器更容易找这种“漏洞”来满足约束。务必加上 (u_{ch}(t) + u_{dis}(t) \leq 1) 这个约束。
**坑三:热储的初始SOC和最终SOC不平衡。**IGDT模型追求的是“抗扰能力”,如果没有对最终SOC做约束,模型会倾向于在末期把储热/储能全部放空,以此虚增 (\alpha)。这样一来,你算出来的抗扰裕度在一天内是好看的,但如果按日滚动运行,第二天一开始系统就处于亏空状态。必须在模型里强制 (SOC(T) = SOC(0)),必要时还要把日内分时段的SOC走廊限制加上。
5.3 从仿真到工程落地的几点提醒
IGDT模型在合成算例上跑得再好,到了工程现场也还要过几道坎。
- 预测基准要真实:IGDT模型里的 (\tilde{P}{WT}(t))、(\tilde{P}(t)) 是模型的基准值。如果预测本身系统性偏高,比如光伏预测模型总是高估,那IGDT算出来的 (\alpha) 再大也救不回来。建议在接入IGDT前,先对预测模型的偏差做一次正态性检验,把系统偏差修正掉。
- (\sigma) 的取值要和考核指标挂钩:我见过不少项目把 (\sigma) 当成纯学术参数随意设,这是不对的。(\sigma) 应该和运行指标绑定——比如考核的是月度成本超支率,那 (\sigma) 就是你能接受的最高超支比例;如果考核的是供电可靠率,(\sigma) 就要换算成备用容量的经济成本。
- 持续滚动修正:IGDT不是一个“算一次就完事”的离线工具。在实际运行中,预测数据每4小时就会更新一次,(\alpha) 也跟着变。我建议把整套模型做成滚动优化,每次更新预测后重新求解,这样抗扰能力才能跟着天气变化动态调整。
最后再分享一个我自己的体会:IGDT不是用来替代传统调度模型的,它更像是一个“压力测试”工具——在正式方案确定之前,先用IGDT看看现有配置在多大的不确定性下会破防,找到系统真正的瓶颈在哪。很多时候你会发现,让系统破防的不是风光本身,而是燃气轮机爬坡能力不够或者储热容量偏小。这时候再去调整设备配置,方向就明确多了。这套“先用IGDT做压力测试,再做确定性优化”的串联打法,我在多个项目里验证过,比单纯追求一个先进算法实用得多。
