做微网优化调度这些年,我越来越确定一件事:最难的从来不是机组模型有多复杂,而是风电、光伏出力预测误差这种“说不清道不明”的不确定性。你昨天中午预测光伏出力100 MW,今天中午实际可能只有70 MW,波动一旦超出计划,整个微网的功率平衡就得重写。最近我一直在完善一套基于信息间隙决策理论(IGDT)的含光热电站微网优化调度模型,试图把风电、光伏、储能、光热电站的协同调度放进同一个数学框架里,让系统在面对不确定性时既不盲目保守,也不过度乐观。这篇文章把这些年的建模思路、公式取舍、求解流程和踩过的坑完整梳理一遍,适合正在做微网调度、光热建模或不确定性优化方向的同行参考,也适合刚入门、想从零搭一套IGDT调度的同学抄作业。
1. 为什么光热电站成了微网调度里的“定海神针”
1.1 风光储微网的灵活性缺口到底在哪
让我从最朴素的场景说起。高比例风电光伏接入后的微网,调度员的日常工作从“按负荷曲线开机组”变成了“按预测出力猜平衡点”。光伏在午间集中大发,夜间直接归零;风电则可能在十几个小时内连续爬坡或者骤降。如果你只用电池储能去扛这些波动,先不说容量够不够,光是循环寿命就让人头疼:锂电池频繁深度充放电,容量衰减速度肉眼可见,项目还没回本,电池就先老了。我见过不少微网项目为了满足消纳指标,把储能容量硬生生翻倍,结果调度曲线几乎每天都在“满充满放”,维护成本居高不下。
更麻烦的是连续阴天或静风天气。电池在头几个小时还能支撑,到了第二天第三天,SOC见底,系统只能大幅购电或者切负荷。化学储能本质上是一种“高功率密度、低能量密度”的短时灵活性资源,让它在长时间尺度上替代传统调峰电源,既不经济也不可靠。这正是含光热微网和普通风光储微网拉开差距的地方——光热电站的储热系统天然具备跨时段能量搬移能力,从物理结构上就更适合承担“填谷、错峰、顶缺”这些需要长时间支撑的任务。
1.2 光热电站的调度价值:储热罐和电加热器带来的双向调节能力
光热电站的原理可以概括成“光—热—电”三段式:聚光集热器把太阳直接辐射转化成热能,热能先存进储热罐,需要发电时再按需释放,驱动汽轮发电机组。塔式、槽式、碟式的具体集热方式不同,但调度建模的核心逻辑都差不多——关键在于,光热电站的“发电”和“来光”在时间上被储热罐解耦了。中午太阳好时可以把用不完的热能存起来,晚上或者云层遮光时再放热发电,这一条就直接弥补了光伏夜间出力为零的短板。
更妙的是,新一代含光热微网里普遍加入了电加热装置,也就是P2H。P2H的作用是把电能重新转换为热能存入储热罐。你可能会问:电转热再热电,循环效率并不高,图什么呢?答案是,当微网出现弃风弃光时,这部分电能的边际成本极低,留着也是浪费,把它转成热能搬移到晚高峰再发电,等于把“死电”变成了“活钱”。光热电站因此成了微网里唯一既是电源、又能在特定时段扮演负荷角色的设备,这种双重身份让它天然适配多能互补的协同调度框架。
1.3 从“电源”到“灵活性资源”:系统结构与协同逻辑
我习惯把含光热微网画成这样一个结构:风电、光伏、光热电站、电化学储能、本地负荷、大电网交互接口,再加上P2H装置。风、光作为主导新能源电源,储能负责短时功率平抑,光热电站承担长时间尺度的能量搬移和爬坡支撑,P2H则在新能源大发时段吸收多余电能。
协同逻辑可以概括成三句话:储能削峰,光热填谷,P2H吃弃电。具体到日前调度,操作变量包括光热发电功率、储热罐充放热功率、P2H输入功率、储能充放电功率、与大电网的购售电计划。每一类变量都有对应的物理约束,后文会逐项展开。先记住一个判断:如果一套模型里光热电站只是被当成普通火电机组来处理,完全没有储热罐和P2H的建模,那么这模型的结论基本就只能用于挂名,投到实际项目里大概率没法用,因为光热的看家本领就是它的热惯性。
2. IGDT到底在解决什么不确定性难题:信息间隙、鲁棒性与机会性决策
2.1 为什么随机规划和传统鲁棒优化在这里不够顺手
处理风电光伏出力不确定性,行业内主流工具无非三条路:随机规划、鲁棒优化、以及本文要讲的IGDT。随机规划的第一步就是假设预测误差服从某个概率分布,然后基于分布采样生成大量场景。问题在于,微网工程里往往拿不到足够长的历史数据去支撑一个可靠分布假设,尤其是新建场站,台风、寒潮、连续阴雨这类极端天气一旦出现,实际误差分布往往是重尾的,用正态分布硬套会严重低估极端偏差的风险。
传统鲁棒优化则走向另一个极端。它要求在最恶劣的参数组合下,约束依然满足、目标函数不超标,得到的调度计划等于为“所有极端同时发生”买单。实际微网里,风电最差、光伏最差、负荷最极端几乎不可能同时出现,因此鲁棒优化的解往往成本高到让项目业主皱眉。用带伞做类比:随机规划像根据降水概率精确决定带不带伞,鲁棒优化像不管天气如何都穿全套雨衣,而IGDT更像在出门前接受“天气预报可能不准”这个事实,并回答一个问题——预报偏差大到什么程度,我还能保证不淋成落汤鸡?
2.2 信息间隙模型:从预测值到不确定性包络
IGDT的核心工具是信息间隙模型。假设某不确定参数的真实值为P,预测值为(\tilde{P}),IGDT把不确定集合定义为以预测值为中心、以不确定性半径α为宽度的偏差包络:
[ \mathcal{U}(\alpha,\tilde{P}) = \left{ P : \left| \frac{P - \tilde{P}}{\tilde{P}} \right| \le \alpha \right} ]
这个公式看起来简单,含义却很实用:它不需要你给出预测误差的概率分布,只需要你承认预测值周围存在一个相对偏差不超过α的波动范围。α越大,包络越宽,系统面临的不确定性越强。在微网调度里,不确定参数可以是风电出力、光伏出力,也可以是负荷功率。多位研究者常用一个统一的α来概括所有不确定性,也可以给风电、光伏、负荷分别配置αw、αpv、αload,区分不同源的不同置信水平。我自己的经验是先统一α跑通主流程,再逐步拆分细化,否则调试阶段很难定位是哪个环节导致鲁棒半径变小。
2.3 鲁棒函数与机会函数:两条对称的决策路线
IGDT最漂亮的地方在于它同时给出两个相反的决策函数。先定义确定性最优成本为C0,它是在α=0时求得的调度成本。鲁棒函数(robustness)回答的是:给定一个可接受的成本偏差门槛β,系统最大能承受多大的不确定性半径αr?数学上写作:
[ \alpha_r = \max \alpha \quad \text{s.t.} \quad \max_{P \in \mathcal{U}(\alpha,\tilde{P})} F(x,P) \le (1+\beta) C_0 ]
这里的F是调度总成本,x是调度决策变量。直观理解是:最坏情况下,成本也不要超过基准成本的1+β倍。αr越大,说明调度计划抵抗预测误差的能力越强。机会函数(opportuneness)则反过来问:在不确定性有利的一侧,系统最小需要多大的波动半径αo,才能让成本突破某个乐观门槛?数学上写作:
[ \alpha_o = \min \alpha \quad \text{s.t.} \quad \min_{P \in \mathcal{U}(\alpha,\tilde{P})} F(x,P) \le (1-\beta) C_0 ]
鲁棒策略适合风险规避的调度场景,比如离网微网或重要负荷供电;机会策略适合想捕捉超额收益的并网微网,比如利用预测偏差带来的低价购电机会。两套函数一纵一横,共同构成了IGDT的决策坐标系。后面章节会说明如何把这两个函数嵌入到具体的优化模型里,这才是真正动手写代码的地方。
3. 优化调度模型的分块建模与约束表达:风光储热如何进同一套数学框架
3.1 目标函数怎么搭:购电、运维、弃电惩罚与储能老化
目标函数是整个模型的“指挥棒”。如果只写运行成本最低,模型就会拼命让储能频繁充放、让光热机组反复启停,因为短期成本最小化不等于长期运行健康。我采用的目标函数形式如下:
[ \min \sum_{t=1}^{T} \left( C_{\text{grid},t} + C_{\text{om},t} + C_{\text{curtail},t} + C_{\text{bess},t} \right) ]
其中Cgrid是时段t向大电网购电的费用,如果允许倒送电则取负值;Com是光热电站等设备的运行维护费用;Ccurtail是弃风弃光惩罚,通常等于弃电电量乘以惩罚单价;Cbess是储能老化成本,我按吞吐电量折算,用来抑制电池的过度频繁使用。
两个容易踩的坑。第一,弃风弃光惩罚系数不能拍脑袋填,它应该高于机组正常发电的边际成本,但低于购电峰值电价。如果系数设得比购电价还高,模型宁可高价购电也不弃电,结果看似消纳率很高,实际成本完全失控。第二,储能老化项不能省。没有老化成本时,模型会把储能当作免费吸能池,一天来回几十次,仿真曲线非常漂亮,真实电池却撑不过半年。
3.2 风电、光伏、储能与大电网交互的常规约束
这部分约束是微网调度的“地基”。风电和光伏的出力约束很简单,实际调度出力不得超过预测出力上限:
[ 0 \le P_{wt} \le P_{w}^{\text{fore}}, \quad 0 \le P_{pv} \le P_{pv}^{\text{fore}} ]
如果允许削减,则削减量与调度出力之和等于预测值。储能部分的约束略复杂,包括SOC动态、充放电功率上下限、SOC上下限,以及同一时刻不能同时充放电的逻辑约束:
[ SOC_t = SOC_{t-1} + \eta_c P_{c,t}\Delta t - \frac{P_{d,t}\Delta t}{\eta_d} ]
[ SOC_{\min} \le SOC_t \le SOC_{\max}, \quad 0 \le P_{c,t} \le P_c^{\max} u_{c,t}, \quad 0 \le P_{d,t} \le P_d^{\max} u_{d,t} ]
其中uc,t和ud,t是0-1变量,确保充放电互斥。大电网交互约束则限制联络线功率不超过上限,并视政策决定是否允许倒送电。最后是所有微网模型都必须满足的功率平衡方程:
[ P_{wt} + P_{pv} + P_{\text{csp},t} + P_{d,t} + P_{\text{grid},t} = P_{\text{load},t} + P_{c,t} + P_{\text{p2h},t} ]
注意,我没有把P2H耗电漏掉。很多初版模型就是漏了P2H这一项,导致功率不平衡,仿真结果凭空多出一块电能,这是我在多个项目里见过的典型错误。
3.3 光热电站“光—热—电”三段式建模与储热平衡
光热电站建模是整个模型的灵魂。我习惯把光热电站拆成三个模块:光场、储热系统、发电模块,每个模块都有独立约束。
光场产热功率由太阳直射辐射和镜场效率决定,工程简化写法为 (Q_{\text{sf},t} = \eta_{\text{sf}} \cdot DNI_t \cdot A),其中DNI是直接法向辐射,A是镜场面积。但日前调度里更常见的做法是直接给定归一化的光场热功率预测曲线,省去辐射模型的非线性。储热系统的核心是热量平衡方程:
[ H_t = H_{t-1} + \eta_{\text{ch}} Q_{\text{ch},t} - \frac{Q_{\text{dis},t}}{\eta_{\text{dis}}} ]
其中Ht是储热罐当前储热量,Qch是充热功率,Qdis是放热功率。储热量必须满足上下限约束,充放热功率也必须设上限。发电模块把储热罐释放的热能转换成电功率:
[ P_{\text{csp},t} = \eta_{\text{pe}} \cdot Q_{\text{tb},t} ]
Pcsp不能超过汽轮机组最大技术出力,也不能低于最低技术出力,还要考虑爬坡约束。这三个模块通过热量平衡串联起来:光场产热一部分直接送发电模块、一部分充入储热罐;储热罐释放的热能与光场产热共同满足发电模块需求;P2H产生的热量也可以进入储热罐。我见过只建储热罐、却忽略充放热功率上限的模型,结果储热罐在仿真里“十分钟灌满、十分钟放空”,完全失真。虽然简化建模合理,但物理极限该有还是要有。
3.4 电加热器(P2H)如何在模型里真正促进新能源消纳
P2H的建模不复杂,就是电转热的效率关系:
[ Q_{\text{p2h},t} = \eta_{\text{p2h}} \cdot P_{\text{p2h},t},\quad 0 \le P_{\text{p2h},t} \le P_{\text{p2h}}^{\max} ]
真正影响P2H是否被启用的,是它在目标函数中的“计费方式”。如果P2H消耗的每一度电都按正常购电价计费,模型几乎永远不会用它——因为直接弃电比电转热再发电更便宜。我的做法是,P2H消耗的电能在功率平衡中占据负荷项,但不产生购电成本,只产生一个很小的运维成本,同时它消纳的风光电量记为消纳收益。这样模型就愿意在午间光伏大发、电价低谷且存在弃电风险时,把多余电能转成热能存起来,供晚高峰放热发电。换句话说,P2H不只是一个设备约束,它的经济价值必须在目标函数里被“赋予意义”。
4. 两阶段求解架构与IGDT嵌入方式:从max-min问题到可求解代码
4.1 整体思路:先确定性基准,再不确定性半径搜索
IGDT嵌入调度的整体流程,我习惯分成三步走。第一步,先令α=0,忽略所有不确定性,求解确定性模型,得到基准成本C0和基准调度计划。这个C0是所有后续判断的参照物,也是β门槛的基准。第二步,构造鲁棒模型(RLZ),固定β,搜索能承受的最大不确定性半径αr。第三步,构造机会模型(ORZ),固定β,搜索能实现乐观目标的最小不确定性半径αo。最后,把β从1%扫到15%左右,得到一条αr-β曲线,这条曲线能直观展示“多花多少成本能换回多大的抗不确定性能力”。
4.2 鲁棒模型(RLZ)的max-min结构与端点场景处理
RLZ的本质是一个max-min问题:外层最大化α,内层在最坏场景下最小化成本或检查成本上界是否超过门槛。直接求解双层问题很困难,但IGDT的信息间隙模型有一个很实用的性质:当目标函数和约束在P上近似线性时,最坏情况一定发生在不确定性包络的端点处,而不是包络内部。
对单一风光出力来说,最坏场景就是“预测出力整体按α下偏”——风更小、光更弱、负荷更大。因此我采用“端点场景枚举+二分法”的思路:在每一次外层迭代中固定α,构造最坏场景,求解一次确定性优化,检查成本是否满足(F \le (1+\beta)C_0),然后用二分法搜索最大α。伪代码可以写成下面这个样子:
lo, hi = 0.0, alpha_limit while hi - lo > 1e-4: alpha_mid = (lo + hi) / 2 worst_cost = solve_dispatch(alpha_mid, mode="worst") if worst_cost <= (1 + beta) * C0: lo = alpha_mid # 可承受,继续扩大半径 else: hi = alpha_mid # 超出承受,缩小半径 alpha_r = lo二分法比线性递增搜索快得多,而且对中小规模微网来说,单次确定性求解在秒级完成,整个RLZ搜索完全可以在分钟级跑完。如果你有多个不确定参数,可以对包络方向做组合枚举,但组合数会随参数数量指数增长,这时就需要考虑对偶转化或场景缩减。
4.3 机会模型(ORZ)的min-min结构与搜索方向
ORZ与RLZ刚好对称。机会决策想找的是“在什么样的波动方向下,成本可以比基准更低”,所以内层取的是最有利场景——风更猛、光更强、负荷更低,这时候系统可以少购电甚至多售电。搜索方向与RLZ正好相反,外层要不断试探更小的αo,直到找到能满足 (F \le (1-\beta)C_0) 的最小半径。伪代码类似,只是把“worst_cost”换成“best_cost”,判断条件变为:
lo, hi = 0.0, alpha_limit while hi - lo > 1e-4: alpha_mid = (lo + hi) / 2 best_cost = solve_dispatch(alpha_mid, mode="best") if best_cost <= (1 - beta) * C0: hi = alpha_mid # 小半径就能获得超额收益,继续收窄 else: lo = alpha_mid # 半径还不够小到触发机会效应 alpha_o = hiORZ得出的αo如果很小,说明系统在很小的扰动下就能获得显著收益,这种系统对“运气”敏感;如果αo很大,说明必须出现显著有利偏差才可能降低成本,机会空间有限。在项目管理上,αo往往被冷落,但我个人觉得它其实很有价值——它帮你判断这个微网到底是“被不确定性牵着走”,还是“能主动利用不确定性获利”。
4.4 求解方法论小结:什么时候用对偶转化,什么时候用场景枚举
端点场景枚举加二分搜索虽然直观,但并不是所有情况都适用。不同求解路线各有适用边界,我整理了一个小表:
| 求解方式 | 适用情况 | 优点 | 需注意的问题 |
|---|---|---|---|
| 端点场景枚举+二分搜索 | 中小规模、线性约束、不确定参数较少 | 实现简单、可解释性强、调试容易 | 不确定参数多时场景组合爆炸 |
| KKT/强对偶转化 | 模型线性凸、规模中等 | 严格最优、把双层转单层 | 推导复杂,互补松弛处理麻烦 |
| C&CG(列与约束生成) | 大型两阶段模型 | 效率高、适合迭代寻优 | 需要实现主问题与子问题交互 |
| 智能算法(PSO/GA等) | 非线性、强耦合模型 | 灵活、不依赖梯度 | 超参数敏感、约束处理繁琐、难以保证全局最优 |
我的建议是,中小规模日前调度先用端点枚举加二分法,先跑通IGDT的核心逻辑,再考虑要不要上更复杂的对偶转化。很多论文花大力气做KKT推导,但在24时段微网模型里不一定比端点枚举更快。
5. 算例设计与不确定性参数设置中的实际经验
5.1 时间尺度:典型日先分析机理,典型周再验证稳健性
IGDT需要反复迭代求解确定性模型,如果一上来就跑全年8760小时,时间成本很高。我推荐先选典型日。典型日的选取不能只挑“最大负荷日”或“最大发电日”,最好按季节分四组,每组里面挑一个同时代表风光资源特征和负荷特征的日曲线。比如春季选一个风电大发日,夏季选一个光伏大发且午间负荷高的日,秋季选一个波动剧烈的日,冬季选一个晚高峰负荷高的日。先把四个典型日的αr-β曲线跑出来,看机理是否清晰、参数是否合理,再用典型周或连续月数据做稳健性验证。我见过直接跑整年结果,结果某几周求解不收敛却查不出原因的情况,白白浪费了大量时间。
5.2 不确定性设置:α与β如何联动,误差包络怎么定
β的经济学含义是“决策者愿意承担的额外成本比例”。β设得太低,比如1%,模型只能承受很小的预测误差,αr自然很小;β设得越高,αr越大,系统越抗波动,但运行成本也越高。实际操作中,我习惯把β从1%扫到12%~15%,每隔2~3个百分点取一个点,记录对应的αr和αo,画出完整的曲线。下面是我在某模拟算例中得到的一组示意数据:
| β(成本偏离系数) | αr(最大可承受不确定性半径) |
|---|---|
| 0.01 | 0.12 |
| 0.03 | 0.23 |
| 0.05 | 0.31 |
| 0.08 | 0.42 |
| 0.12 | 0.55 |
注意这是示意性结果,具体数值完全取决于光热出力特征、储能容量和电价结构。但这组数据的趋势很典型:αr随β近似单调递增,前期增长快、后期逐渐饱和。当你发现再增加β时αr几乎没有增长,说明系统的物理可变资源已经用尽,光靠提高成本冗余买不到更多抗不确定性能力。
5.3 结果分析的三个关键维度:成本曲线、调度计划堆叠和α-β曲线
算例结果不要只看一个总成本数字。我一般从三个维度分析:第一是α-β曲线,看鲁棒性与经济性的权衡关系;第二是典型日调度计划堆叠图,看光热出力、光热储热充放行为、储能SOC、P2H输入功率如何在一天内互相配合,重点关注午间消纳和晚顶峰两个时段。第三是成本分解表,把购电成本、运维成本、弃电惩罚和储能老化拆开,对比确定性方案与IGDT鲁棒方案,能清晰看到成本增加来自哪里。实际测试中,IGDT鲁棒方案和确定性方案的最大差异往往出现在傍晚时段——鲁棒方案会提前在午间多用P2H储热、在晚高峰少购电,虽然总成本略高,但对风电晚间骤降的承受能力显著增强。
6. 我在实际测试中踩过的坑与几点调整建议
6.1 储热罐初值引发的“幽灵电量”问题
第一次跑完整模型时,我盯着结果看了很久都觉得不对劲:日前调度的总成本低得离谱,储热罐的日末储热量却接近零。排查后发现问题是初值设置太随意——储热罐初始H0没有设定边界,优化器在第一个时段就用光场热量疯狂充罐,最后一个时段又把罐放空,这些热能既不来自当天辐射,也不是真实库存,等于从“虚空”里凭空搬来了能量。解决方法是加周期约束,要求日末储热量不小于初始储热量,或者在目标函数里给H0赋予真实库存成本。这一步很多人会漏掉,但它直接决定调度结果是否可信。
6.2 光热机组爬坡与最小启停时间约束不能省
汽轮机组不是无惯性设备,它的热力系统响应速度远慢于电池和电力电子设备。如果把光热发电模块简化成只有上下限约束的电源,优化器完全可能建议机组每隔半小时就大幅启停或剧烈爬坡,这在工程上根本做不到。后来我补上了爬坡约束和最小开机/停机时间约束,调度曲线才变得像样。爬坡率建议按光热汽轮机的实际技术参数设置,通常每分钟百分之几额定功率;最小运行时间至少覆盖数小时,否则热应力会显著缩短设备寿命。在做模型对比时,不要为了“结果好看”而把这些约束删掉,那会导致IGDT的鲁棒半径评估过度乐观。
6.3 不要把α等同于置信概率
每次给项目方汇报时,总有人把αr=0.2理解成“有80%的把握”。这是最需要澄清的误解。α不是概率置信度,它描述的是预测值周围的相对偏差半径,是集合意义上的不确定性度量。如果想知道系统在某种概率保证下能承受多大误差,需要结合历史误差分布做外部统计校验。比如你先统计出风电预测误差的P90分位数是20%,再把α设为0.2,IGDT的结论是“在这个偏差半径内,成本不超过门槛”,至于这个半径对应多少概率保证,需要分布函数去回答。我建议汇报材料里明确区分这两个维度,否则项目评审时很容易被抓住概念漏洞。
6.4 给后来者的五条实操建议
根据我反复调试的经验,有几点建议供参考。
- 先跑确定性模型,验证设备约束、功率平衡和参数量纲无误之后,再接入IGDT搜索。IGDT搜索本质上是不断调用确定性模型,底层的坑没清干净就直接上双层,排查难度会成倍上升。
- 不要一开始就用智能算法。PSO、GA在无约束或弱约束问题上确实好使,但微网调度约束极多,罚函数调参能把人逼疯。先用确定性求解器加二分搜索,把IGDT逻辑跑通再说。
- 不确定参数的候选α范围要参考历史预测误差统计来定,不要拍脑袋。比如历史风电预测误差均方根误差是15%,α的搜索上界可以设为0.3左右,范围太宽只是浪费时间。
- 对每一个β点,建议同时输出αr和αo,它们是一对互补信息。只报鲁棒半径,项目方可能会问“万一实际天气比预测好呢”;只报机会半径,又会低估风险。
- 把所有计算条件和参数写进报告的附录或注释里。IGDT这类模型对参数极其敏感,同样的结论换一组β范围可能完全不同,保持参数可追溯是最基本的工程素养。
最后说一点我自己的体会。IGDT并不比随机规划或鲁棒优化“更高级”,它更像是一种改变你思考方式的分析框架:它不给你一个单一的最优方案,而是给你一条“以成本换抗风险能力”的边界曲线。把αr-β曲线拿到项目会上展示时,决策者往往会突然明白,为什么以前那个看起来完美的确定性最优调度,一遇到实际天气波动就碎成一地。如果你也在做含光热的微网调度,我建议一步步来:先跑通确定性模型,再接入IGDT搜索,最后再补P2H和机组运行细节。你真正需要的,是一个能清楚解释决策边界的工具,而不是一个看起来很深的数学壳。