1. 微电网经济调度到底在解决什么问题
做微电网调度的人,几乎都绕不开同一个痛点:光伏和风电的出力今天看着很准,明天就可能偏差百分之二三十,负荷曲线更是难伺候。你要是按确定性模型设计好一天的调度计划,实际运行的时候大概率会被一片云或者一波临时用电打乱。这也是为什么我在项目里把经济调度的核心从传统的确定性优化,逐步转向了两阶段鲁棒优化——它给微电网带来的不只是一个更稳的调度方案,还附带了一套处理不确定性的方法论。不管你是在做园区微电网、海岛微电网,还是离网型微电网,只要系统里同时有可再生能源、储能和可控机组,这套思路都能直接复用。
1.1 从单一电源到多能互补的调度难题
微电网和传统大电网最大的区别,在于它是个“小系统、多主体”的组合体。光伏、风电、柴油发电机、储能电池、可调负荷,全部挤在一个规模不大的网络里。电源之间特性差异巨大:光伏和风电是随天气变化的不可控电源,柴油机是慢速可调的旋转电源,储能是快速响应但容量受限的缓冲器,负荷侧又有一部分用户愿意配合调峰。调度要做的事情,就是在满足供需平衡和所有运行约束的前提下,安排未来24小时内每台机组什么时候开、什么时候停、功率给多少,储能在什么时段充、什么时段放,和主网的交换功率怎么分配,目标只有一个——总运行成本最低。
听起来很像一个经典的经济调度问题,但真正落地时难在三点。第一,约束多且耦合强。功率平衡要在每个节点成立,还要考虑线路容量、电压上下限、机组爬坡率、储能SOC上下限,这些约束互相牵制。第二,可再生占比高,预测误差大。光伏的预测误差在阴雨天可能超过30%,负荷在极端天气下也可能出现10%以上的波动,微电网的备用容量又远不如大电网充裕。第三,决策时间尺度不一样。柴油机启停是小时级的决策,储能功率是分钟级甚至秒级的响应,怎么把这些不同尺度的决策统一进一个模型,非常考验建模功底。
很多刚入门的朋友会把微电网调度直接理解成一个“带约束的最优化问题”,然后用线性规划或者混合整数规划去解。这个理解没错,但只对了一半。确定性优化默认所有输入参数都是已知且准确的,这在传统火电调度里问题不大,在微电网里却是一个过于奢侈的假设。所以实际项目里,我更愿意把调度问题看成一个“在不确定性环境下做资源分配”的问题,而不是简单的静态优化。
1.2 为什么必须考虑不确定性——传统确定性调度的局限
有些工程师会质疑:传统确定性调度加上旋转备用约束,不是也能保证安全吗?在光伏和风电占比低、系统裕度大的场合确实可以。但微电网不一样,它的装机容量小,可能一整台柴油机的出力就占了系统负荷的30%,储能容量也有限。一旦实际光伏出力比预测低、负荷比预测高,系统很难在短时间内找到替代电源支撑。
我举个例子。某个园区微电网按照晴天预测做日前调度:中午光伏出力充足,调度方案决定让储能少放多充,把低价光伏电存起来留到晚间高峰用。结果下午一片厚云经过,光伏出力十分钟内掉了60%,柴油机爬坡还需要时间,系统频率一路下探。事后复盘,问题不在于光伏预测不准,而在于调度模型里根本没有给预测误差留出应对通道。如果当时能在午间保留一部分储能放电空间,或者把柴油机的最小出力稍微抬高一点,结局完全不一样。
确定性优化的另一个麻烦是“报喜不报忧”。它给用户的是一套在理想预测场景下成本最低的方案,但对实际可能出现的偏差没有任何抵抗力。你拿着这套方案去应对运行中的各种意外,要么频繁人工干预,要么冒着越限风险硬扛。对微电网这种规模小、惯性小的系统来说,这种脆弱性是致命的。
行业里解决这类不确定性问题的思路很多。随机优化(stochastic optimization)需要给每个不确定量指定概率分布,然后用场景树去模拟大量随机路径,计算代价比较大,而且分布参数本身往往不靠谱。模型预测控制(MPC)通过滚动优化来在线修正,非常实用,但它本质上是一种执行层反馈机制,更适合日内实时调度,在日前计划阶段还是需要一个能在最坏情况下依然可行的方案作为底座。两阶段鲁棒优化则走了一条“防御型”路线:我不去猜光伏到底发多少,我只圈定一个可能出现的偏差范围,然后把方案设计成“在这个范围内无论怎么波动都不越限”。这个思路在工程落地阶段的吸引力远超其他方法。
1.3 鲁棒优化和随机优化、MPC怎么取舍
经常有人问我:这几个方法到底该选哪个?我的建议是看你要解决的问题处于哪个时间尺度。如果做日前计划,要提前确定机组启停、储能充放电策略,两阶段鲁棒优化非常合适,因为它能保证方案在预设不确定性集合内全部可行,而且求解效率可控。如果做日内滚动调度,MPC更顺手,因为每隔15分钟刷新一次预测,可以不断修正偏差。如果项目对经济性要求极高,且能拿到较准确的概率分布,场景法随机优化也值得尝试,但它通常需要和鲁棒约束配合使用,避免极端场景漏掉。
从工程投入产出比来看,两阶段鲁棒优化是性价比最高的方案。它不需要精确的概率模型,只需要预测上下界和波动预算;它不追求所有场景下的“平均最优”,而是追求最坏场景下的“安全可行”。这种特性让它在微电网这种不确定性高、安全裕度小的环境里尤为适用。所以接下来,我重点拆解一下两阶段鲁棒优化的建模和求解,这些都是可以直接搬到你自己项目里的干货。
2. 两阶段鲁棒优化:思路与建模
2.1 “两阶段”到底是什么意思
理解两阶段鲁棒优化的起点,在于把决策动作按“能不能等”分成两类。第一类决策是需要提前敲定、无法在短时间内轻易改变的,叫第一阶段决策(here-and-now);第二类决策可以等不确定量实现之后再做调整,叫第二阶段决策(wait-and-see)。
放到微电网的场景里,这个划分非常清晰。柴油机的启停状态、储能电池的工作模式,都属于第一阶段决策。柴油机热启动需要十几分钟甚至更久,储能模式切换如果太频繁也会影响电池寿命,所以这些0-1整数变量必须提前确定。反观各类有功功率——柴油机出力、储能充放电功率、与主网的交换功率、可调负荷的调整量——都属于第二阶段决策,它们可以在看到实际光伏出力和实际负荷之后,再根据偏差做微调。
这样一区分,两阶段鲁棒优化就变成了一个“三层嵌套”的结构。最外层是第一阶段决策成本,加上一个“最坏不确定性场景下第二阶段最小运行成本”的期望;中间层是在不确定性集合里找一个让系统最难运行、成本最高的场景;内层则是在这个给定场景下求解经济分配问题。三层耦合在一起,写成紧凑形式就是:
min_x (c₁ᵀx + max_{u∈U} min_{y∈Ω(x,u)} c₂ᵀy)
这里 x 代表第一阶段决策,u 是光伏、风电、负荷的不确定量,U 是不确定性集合,y 是第二阶段决策,Ω(x,u) 是给定 x 和 u 之后的可行域。这个式子有点绕,但只要你抓住“先做开停机决策,再看最坏情况下的最优调度成本”这个逻辑主线,就不会迷路。
2.2 决策变量与不确定性集合
建模的第一步,是把变量梳理清楚。我自己习惯把变量归成四类,每一类都有它独有的状态转移和上下限约束。
机组相关变量包括柴油机启停状态、启动/停机标志、有功出力、运行时长等。启停变量是整数,出力是连续量。储能相关变量包括充放电状态、充放电功率和SOC。这里要注意,充放电状态严格来说是0-1变量,但为了让模型好解,很多工程实现会去掉状态变量,只限制充放电功率不同时为正,靠目标函数里的惩罚项来约束。网络相关变量包括节点电压幅值、相角、支路潮流、与主网交换功率。负荷相关变量包括可调负荷的调整量、可中断负荷的中断量以及失负荷量。
不确定性变量的选择要贴合系统实际。微电网里波动最明显的三个来源就是光伏出力、风电出力和负荷功率,通常把这三个量写成向量 u = (u_PV, u_WT, u_Load)。每个分量都有一个预测值,加上一个偏差量。偏差的上下界怎么取?我一般从历史预测误差数据里统计,比如取90%置信区间的宽度。这个做法比拍脑袋定范围靠谱得多,计算量也不大。
2.3 目标函数与约束条件详解
经济调度的目标函数不能只写发电成本,否则储能和负荷侧资源的灵活性会被严重低估。我在工程模型中会把目标分为四块。
一是机组发电成本。柴油机的燃料成本和出力之间近似二次关系,为了放进线性规划或混合整数规划,一般做分段线性化处理。二是启停成本。柴油机热启动和冷启动成本差别很大,要按停机时长分类,否则模型会倾向频繁启停来省燃料费,现实中根本不可行。三是储能退化成本。这个用充放电功率乘以一个退化系数估算,量级不大,但能让模型主动减少电池的无效循环,对延长电池寿命很有帮助。四是失负荷惩罚。这是可靠性成本的体现,量级必须设得足够大,比如上千元每兆瓦时,避免模型为了节省燃料而主动切负荷。
约束条件方面,核心是功率平衡约束,也就是每个节点的注入功率等于负荷加充电功率加上与主网交换功率。除此之外还有机组出力上下限、爬坡约束、储能SOC递推、充放电功率限制、线路容量约束、备用约束等。注意,在两阶段鲁棒模型中,凡是包含第二阶段变量的约束,都必须在不确定性集合U中任意取值时都成立。这是和确定性优化之间最本质的区别——你解出来的不是“某一场景下的方案”,而是“一族场景都能满足的方案”。
3. 针对微电网的典型建模方案
3.1 不确定性集合的选择——盒式、Budget、椭球体
不确定性集合的选择,直接决定模型复杂度和解的保守程度。文献里最常见的三种集合分别是:盒式集合(box)、预算约束集合(budget set)和椭球体集合(ellipsoidal set)。
盒式集合最简单,就是把每个不确定量限制在各自的上界和下界之间,形成一个矩形体。直观,建模容易,对偶变换处理起来也很快。但它的致命缺点是允许所有不确定量同时取极端值。实际中“光伏同时全错、风电同时全错、负荷同时全错”的场景几乎不可能出现,所以直接套盒式集合,解出来的方案往往偏保守,成本虚高。
预算约束集合在盒式集合基础上加了一个限制:所有不确定变量的相对偏差之和不超过一个预算值Γ。这个Γ就是鲁棒性水平。它的物理含义是“整个系统最多允许多少个时段或多少个变量同时出现极端偏差”。这样一来,不确定性集合既保留了盒式集合的边界信息,又避免了“所有坏事一起发生”的极端保守假设,是目前工程应用里最推荐的方案。
椭球体集合和正态分布近似挂钩,能够利用误差的协方差矩阵描述变量之间的相关性,理论上更精确。但它会引入二次项约束,对求解器的要求更高,收敛速度也明显变慢。如果不是项目精度要求特别高,我一般不建议初学者一上来就用椭球体。
3.2 储能和需求响应的建模细节
储能是微电网灵活性的关键,也是最容易建模出错的地方。一个常见坑是:把充电和放电效率混为一谈,使用一个“平均效率”来处理。实际上,充电过程是把电网电能存进电池,要考虑充电效率;放电过程是把电池电能送出来,要考虑放电效率。正确的SOC递推方程写成两段:
SOC(t+1) = SOC(t) + η_ch × P_ch(t) × Δt − (P_dis(t) / η_dis) × Δt
η_ch和η_dis通常不相等。如果你把两者直接合并成一个值,看似简化了模型,但在24小时连续运行中,SOC误差会不断累积,最后得到的经济性评估偏差可能超过10%。做储能调度,第一原则就是把这个效率差异建模清楚。
需求响应建模要区分两类负荷。可削减负荷只需要一个“削减量”变量,乘以单位补偿费用作为目标函数里的成本项就行。可转移负荷则复杂一些,它涉及不同时段之间的耦合,比如某条生产线从用电高峰时段整体转移到低谷时段,需要建立转出和转入之间的平衡约束。这部分约束如果不加,模型会高估负荷灵活性,导致调度方案里出现“这个时段让负荷全部消失、下个时段又全部出现”的不合理现象。
3.3 关键参数的确定:鲁棒性水平、预算值
鲁棒参数取值这个东西,没有任何标准公式,但它有很实用的工程套路。Gamma值(Γ)是最重要的参数,它直接决定不确定性集合的“宽窄”。我建议先统计历史预测误差分布,计算每个时段偏差的绝对值和方向,然后设定一个能覆盖80%-90%历史场景的预算水平。比如某地区光伏预测误差超过20%的场景只占5%,那就可以把光伏的不确定预算设成“80%时间内不会超过”的水平。
定完初值后,再用实际数据回测,看调度成本涨幅是否可接受。我在不同项目里跑过的Gamma曲线大致一致:Gamma从0增大到某个值之前,总成本增长比较平缓;但超过某个临界值后,成本突然飙升,说明系统在“死守过多极端场景”,已经没有工程收益。我的经验是取曲线拐点附近的Gamma值,既不浪费资源,又保证安全性。这个“成本-Gamma曲线”测试做一次就够,以后项目参数稳定后基本不用再调。
4. 求解两阶段鲁棒优化问题的方法
4.1 Benders分解与列约束生成
两阶段鲁棒优化没法直接交给求解器一次解完,因为存在max-min嵌套,而且第二阶段可行域里一旦出现整数变量,问题会变成更困难的混合整数两层规划。工程上主流有两种分解思路:广义Benders分解(GBD)和列与约束生成(C&CG)。
Benders分解的思路是:把原问题拆成主问题和子问题。主问题先处理第一阶段变量,得到一组调度方案;子问题在给定这组方案后,去U里找最坏场景并评估成本。如果子问题发现当前方案不可行,就给主问题回传一条Benders割,逼着主问题修改方案。迭代直到上下界收敛。这个思路在经典随机优化里沿用很长时间,但问题是割的质量不稳定,一旦对偶信息处理不好,收敛速度会非常慢。
C&CG是近年应用更广的方法。它的核心改进在于:主问题里不仅保留第一阶段变量,还直接加入第二阶段变量以及若干极端场景对应的约束。每轮迭代,子问题会返回一个“最糟糕”的不确定性场景,主问题就把这个场景对应的约束补充进去,相当于把极端场景一个个累积进主问题的约束集合。C&CG和Benders最本质的区别是:Benders只加割约束,不新增场景相关变量;C&CG则是每次把整组“场景变量和约束”一起加进去,可行域刻画更精确,所以迭代次数通常远少于Benders。
4.2 C&CG算法流程与实施要点
C&CG的实现流程并不复杂,但细节决定成败。步骤如下:
第一步,初始化。设定上下界,LB=-∞,UB=+∞,迭代次数k=0,设定一个相对间隙阈值,比如0.01。
第二步,求解主问题,得到第一阶段解x和当前主问题目标值,更新下界LB。
第三步,固定x,求解子问题。子问题本质上是一个给定x之后的max-min问题,做法是把内层min问题做对偶变换,转成一个单层的max问题,然后求解,得到最坏场景u和该场景下的运行成本,更新上界UB=min(UB, c₁ᵀx + f(x, u))。
第四步,检查UB - LB是否小于阈值,如果满足就停止;否则,把u*对应的第二阶段变量和约束加入主问题,k=k+1,回到第二步。
实际操作中有三个细节特别容易踩坑。第一,子问题对偶变换时要处理KKT互补条件,如果子问题里有二次项,需要线性化;第二,主问题规模会随迭代次数不断膨胀,要定期清理冗余约束,不然求解时间会飞速上涨;第三,如果子问题出现了不可行的情况,说明第一阶段决策x本身已经违反了某个运行约束,必须在主问题中额外补充不可行割,不能简单忽略。
4.3 在MATLAB/Julia中进行实践
我在自己的项目里常用MATLAB+YALMIP,或者Julia+JuMP。YALMIP的好处是建模格式贴近数学表达,容易阅读和调试,尤其适合原型验证。JuMP的运行性能更好,建模宏也更灵活,适合需要反复迭代求解的生产级项目。
在C&CG框架里,主问题每次迭代都会增加新变量和新约束,如果每次重建整个优化模型,建模时间可能比求解时间还长。我在Julia里习惯把主问题封装成可复用的函数,每轮只更新系数矩阵和约束边界,而不是从头重新构建模型。这样整个求解流程从几十轮迭代下来能快一个数量级。
求解器方面,如果第二阶段全是连续变量,推荐Gurobi或CPLEX。开源方案里HiGHS配合JuMP也能覆盖大部分线性化场景,但如果模型里带了二阶锥潮流约束,HiGHS会比较吃力。分布式能源接入比较多、潮流约束偏非线性的话,可以考虑Mosek。选求解器最重要的一点是:先确认模型是纯线性、混合整数线性,还是带二次约束、二阶锥约束,不同类别对应完全不同的求解器配置。
5. 一个小型案例的完整流程
5.1 案例配置及数据
为了把前面这些原理落到地面上,我拿一个典型工商业微电网案例出来演示。案例规模不大,但包含了光伏、风电、柴油机、储能、可调负荷这五类常见元素。调度周期取24小时,时间分辨率1小时。
| 项目 | 参数值 |
|---|---|
| 光伏预测峰值 | 60 kW |
| 光伏预测误差 | 20% |
| 风电预测峰值 | 20 kW |
| 风电预测误差 | 25% |
| 柴油机额定功率 | 50 kW |
| 柴油机最小出力 | 10 kW |
| 柴油机启停成本 | 500元/次 |
| 储能容量 | 200 kWh |
| 储能额定功率 | 50 kW |
| 充电效率 | 0.9 |
| 放电效率 | 0.95 |
| SOC范围 | 20%-90% |
| 主网购电上限 | 100 kW |
| 基础负荷 | 80 kW |
| 负荷预测误差 | 10% |
| 可调负荷比例 | 10% |
这套数据我特意选的是普通量级,不是某个极端项目场景,目的是让大家可以直接拿自己的数据替换着用。实际项目里光伏占比可以比这个大得多,储能也可能变成多个集装箱并联,模型框架完全兼容,只要把参数矩阵替换掉就行。
5.2 求解结果分析
用确定性模型跑一遍,24小时总成本大约是3700元。然后把光伏和负荷的鲁棒预算Gamma设成5,跑两阶段鲁棒优化,总成本会上升到4100元到4300元之间,成本上涨大概10%-15%。这个涨幅说实话不算小,但换来的是一整天调度方案能在光伏被云遮、负荷临时抬升等情况下都不越限,最坏场景下的失负荷量从30 kWh直接压到零。对微电网调度来说,这个安全边际非常关键。
更值得观察的是调度方案的形态差异。确定性模型倾向于让光伏中午满发,储能尽可能充满,整体就是“压榨可再生能源”的思路;鲁棒模型则会给储能预留一部分放电空间,柴油机的最小出力也略微抬高,整体方案更像“留有余量”。用数据说话,鲁棒解下储能全天的平均SOC比确定性解低约5个百分点,但系统在最坏场景下的可靠性表现完全不同。这5个百分点的SOC牺牲,换来的是整个系统的安全性兜底,我认为是值得的。
5.3 灵敏度分析与保守性权衡
拿到基础结果后,别急着交差,我建议把Gamma从0逐步加到10,每个点重新求解一次,画出总成本和最坏场景失负荷量随Gamma变化的曲线。这类分析是判断鲁棒参数取多少最合理的关键依据。
我在多个项目里观察到同样的规律:Gamma在0到某个值之间时,成本增长缓慢,失负荷量快速下降;越过某个阈值后,成本增速突然变陡,失负荷量却几乎不再变化。这说明模型已经在为一个“根本不可能发生”的最坏场景支付太多成本。此时把Gamma定在拐点附近是最优选择。
还有一类项目会出现曲线从头到尾都很陡的情况。如果Gamma很小的时候成本就飙升,说明系统本身缺乏灵活性资源,单纯调整鲁棒参数解决不了问题。这种时候优先考虑扩容储能、增加可调负荷比例,或者重新配置微电网的电源结构,比盯着模型参数优化有效得多。我曾经在一个项目里把可调负荷比例从10%提到20%,同一Gamma水平下总成本下降约6%,系统对不确定性的容忍度明显改善。这证明了硬件配置才是调度的底层支撑。
6. 常见问题与工程教训
6.1 求解时间过长怎么办
两阶段鲁棒优化最大的工程障碍是求解时间。模型规模不大的时候,C&CG十几轮就能收敛;但一旦子问题里嵌入了太多整数变量,或者主问题里堆了大量冗余约束,几十轮迭代不下来很正常。
排查思路按优先级来。第一,检查第二阶段是否混入整数变量。如果第二阶段有0-1变量,对偶转换会非常棘手,通常需要big-M法线性化互补条件,或者干脆调整模型结构让第二阶段保持连续。第二,给主问题的场景去重。我见过不少实现里,同一个极端场景被重复加进主问题十几遍,白白增加变量数量。可以用一个小规模的哈希表存场景,每轮求解后检查是否重复。第三,把冗余约束清理掉。在建模时尽量避免同一约束分多行写,能向量化就向量化,让求解器presolve能发挥作用。
6.2 鲁棒解过于保守怎么办
有的项目用两阶段鲁棒算出来的成本比确定性模型高出20%以上,这时候首先怀疑的不是算法,而是不确定性集合定得太极端。我碰到过一个案例,光伏预测误差上限设成了历史最大偏差的100%,结果鲁棒解几乎把光伏当成零出力资源,整体成本暴涨30%以上。后来把误差上限改成90%分位数,成本涨幅立刻降到8%,实际回测也没有越限。
第二个思路是分层处理不确定性。光伏、风电、负荷的波动特性不一样,没必要全塞进同一个鲁棒集合。可以把波动快、预测误差大的风电用电场景法或随机约束来处理,把波动相对温和的负荷放进鲁棒集合。混合建模在工程上表现不错,但建模工作量会上升,适合项目精度要求比较高的场景。
第三个思路是引入“软鲁棒”概念。给部分鲁棒约束设置松弛量,允许在极端场景下牺牲少量负荷或允许短时越限,以此换取成本下降。这个方案在商业项目里挺实用,因为用户更关心“多久能恢复”“成本能省多少”,而不是“绝对不越限”。把松弛惩罚写进目标函数,模型会自动在安全性和经济性之间做平衡。
6.3 实际部署时的其他重要注意事项
调度优化的最后一步是落地执行,这里有几个坑值得单独提醒。
第一,二次成本曲线的分段数要适中。分段太少,线性化误差大,算出来的成本失真;分段太多,模型膨胀,求解变慢。我一般取3到5段,基本能覆盖工程精度需求。第二,求解出来的功率指令在下发到现场设备前,务必跑一遍精确潮流校核。线性化DistFlow模型在高负载率场景下和精确潮流会有明显偏差,特别是线路末端电压可能被高估,不做校核直接下发,风险不小。第三,要在日前计划基础上叠加日内滚动修正。光伏波动剧烈的夏季,一个固定的日前计划根本撑不到晚上,必须以15分钟或1小时为周期滚动刷新,让调度方案跟随最新预测走。
还有一点容易被忽略:两阶段鲁棒优化的结果不是一套固定功率计划,而是“第一阶段决策+第二阶段响应规则”。实际执行时,要把这个响应规则转化成储能功率随光伏偏差按比例调整的控制逻辑,或者柴油机爬坡速率随负荷偏差动态修正的联锁逻辑。如果只把第一阶段决策下发给设备,那本质上还是把鲁棒优化用成了确定性优化,白白浪费了模型处理不确定性的能力。
最后我在项目里体会最深的一点是:两阶段鲁棒优化不是要去精确预测未来,而是要在承认“未来不可精确预测”的前提下,提前设计一套在多种场景下都不至于崩盘的调度规则。微电网调度永远面临稳定性和经济性的两难,鲁棒优化给的不是一个“完美答案”,而是一个“尽量不坏的选择”。通过调节不确定性集合的宽窄、预算值的大小、可调资源的比例,这套思路可以被调教得既安全又不至于太亏钱。希望这篇梳理能帮你少走一点弯路,后续我再找机会把C&CG算法一步步封装成可复用代码的过程写出来,到时候直接拿着你的微电网数据试跑一遍。