尧图网站设计 尧图网站设计YAOTU DESIGN
ARTICLE DETAIL

资讯详情

深耕网站设计与一线实操的经验洞察。

微电网经济调度中的鲁棒优化:建模、实现与工程落地全指南

微电网经济调度中的鲁棒优化:建模、实现与工程落地全指南 做微电网能量管理这几年我越来越觉得最磨人的不是优化模型建不出来而是预测数据总在“背叛”你——光伏中午还满发下午云一过来直接掉一半风电更是看天吃饭晚高峰需要它出力的时候它偏偏一动不动搞得调度员只能手动调储能和联络线。这种场景下随机优化、模型预测控制、鲁棒优化我都试过其中鲁棒优化算是我个人觉得“最硬核也最稳妥”的一条路线。这篇文章就把我近期用鲁棒优化做微电网经济调度的全过程整理出来从为什么必须和不确定性硬刚到数学建模、代码实现、参数调优再到后面怎么把成果讲清楚一次性说透。无论你是做微电网课题的研究生还是搞综合能源平台、智能微电网ppt方案的在职工程师这篇应该都能给你一些直接能抄的干货。1. 微电网调度为什么绕不开不确定性1.1 一套最基础的微电网长什么样先把我习惯用的微电网模型摆出来。它不算复杂但足够说明问题一个交流微电网里面包含一台燃气机组或者柴油机、一组光伏、一台风机、一套电化学储能以及和上级电网相连的联络线下面挂着一个区域负荷。调度目标很直接在满足负荷供电的前提下让系统一天的总运行成本最低。这里说的成本包括燃气机组燃料费、从上级电网买电的费用以及储能充放电带来的折算损耗反过来如果微电网富余电量卖给电网还能形成一笔卖电收益。能量管理系统EMS的核心任务就是做“日前调度”假设我们知道未来24小时的负荷、光伏和风电出力预测在机组启停、出力上下限、爬坡、储能荷电状态SOC等约束下制定每个时段的运行计划。听起来就是一个经典的经济调度问题线性规划就能解。但问题恰恰出在“假设我们知道”这五个字上。1.2 确定性优化的问题在哪如果把预测值直接当成真实值去做优化我把它叫“乐观调度”。乐观调度的典型翻车场景是这样的比如日前预测中午光伏出力10MW你在制定计划时把这10MW当成了“可靠出力”因此让燃气机组少发、储能少放电甚至可能还安排向电网卖电。结果第二天实际光伏只有3MW差额7MW怎么办储能最多补1MW联络线已经到上限燃气机组爬坡又赶不上最后只能切负荷或者紧急增购电代价相当大。负荷预测也是一样。工业园区的负荷受生产计划影响很大居民负荷在天气突变时也经常超出预测区间。任何一个环节的预测失准都会让开环调度方案失效。这里有一个关键认知对微电网调度来说预测误差本身不是最可怕的可怕的是调度方案没有为误差留出“安全余量”。而鲁棒优化要解决的就是这个问题——它在做决策时不是把预测值当作唯一确定的输入而是假设未来的不确定参数会落在某个集合内然后要求无论集合内哪个值真实发生调度方案都必须可行不能出现失衡或越限。1.3 鲁棒优化到底在“鲁棒”什么鲁棒优化和随机优化的最大区别在于对不确定性的描述方式。随机优化要给不确定性指定概率分布然后去优化期望成本而鲁棒优化更“硬气”它不跟你讨论概率它只问你一句话你能接受的不确定范围到底在哪你把光伏出力预测写成“10MW误差±30%”那鲁棒优化就按7MW到13MW这个区间来准备方案如果负荷预测写成“5MW误差±15%”调度就按4.25MW到5.75MW来考虑。它追求的目标是任何一个不确定参数落在这个集合里系统都扛得住。代价当然也有——解出的成本通常比确定性优化高高出来的部分就是“为不确定性买的保险”。好的鲁棒模型应该用尽量小的保险费用买到足够强的抗风险能力。所以后续我特别强调不确定性集的选择它直接决定结果质量。如果你之前只用过MPC滚动优化也可以把鲁棒优化和MPC组合起来用用MPC做反馈修正用鲁棒优化做日前计划的安全包络两者并不冲突反而是工程里很成熟的搭配。2. 鲁棒优化的建模细节从目标到对等模型2.1 目标函数怎么定我常用的目标函数是$$\min \sum_{t1}^{T} \left( C_{fuel} P_{G,t} C_{buy} P_{buy,t} - C_{sell} P_{sell,t} C_{ess} |P_{ess,t}| \right)$$其中$P_{G,t}$ 是燃气机组t时段出力$C_{fuel}$ 是单位燃料成本$P_{buy,t}$ 是从电网购电功率$C_{buy}$ 是购电电价$P_{sell,t}$ 是向电网卖电功率$C_{sell}$ 是售电电价$P_{ess,t}$ 是储能充放电功率取绝对值后乘以折算损耗成本 $C_{ess}$用来表示充放电循环对电池寿命的影响。这里有一个容易踩的坑$C_{buy}$ 和 $C_{sell}$ 通常不相等而且大多数场景下购电价比售电价贵所以在约束里不能只写一条联络线功率变量否则模型会自动把买和卖混成一条产生“低买高卖”的虚构套利空间。正确做法是把联络线拆成两个非负变量一个代表买电一个代表卖电并保证同一时刻至多一个大于0。目标函数里暂时不放弃风弃光惩罚。原因是在鲁棒约束下弃风弃光本身就是一种可行的调整手段如果放在目标函数里可能诱发优化器为了降低成本故意多弃反而不利于新能源消纳。更稳妥的做法是把它设成硬约束之外的软约束要么加高额惩罚要么在结果分析阶段再看。2.2 约束条件和不确定性集系统的约束大致可以分四类。功率平衡约束是每个时段的硬约束$$P_{G,t} P_{PV,t}(\xi) P_{WT,t}(\xi) P_{ess,t} P_{buy,t} - P_{sell,t} P_{load,t}(\xi)$$这里我用 $P_{PV,t}(\xi)$、$P_{WT,t}(\xi)$ 和 $P_{load,t}(\xi)$ 表示它们不是确定的数而是随不确定向量 $\xi$ 变化的函数。机组相关的约束包括出力上下限、爬坡约束、最小启停时间约束储能相关的包括SOC递推方程、充放电功率限制联络线约束包括交换功率上限和下级电网容量限制。真正让问题变复杂的是不确定性集 $U$。我实际用过三类盒式不确定集是最直白的它把每个不确定参数限制在一个区间$$U^{box} { \xi : \xi_i^{min} \leq \xi_i \leq \xi_i^{max} }$$椭球不确定集更像随机优化里的标准差理念适合用历史误差协方差矩阵去刻画但会让模型变成二阶锥规划求解稍慢。预算不确定集是最实用的一种它在盒式基础上加了一个全局预算约束$$U^{budget} { \xi : \xi_i^{min} \leq \xi_i \leq \xi_i^{max}, \sum_i \frac{|\xi_i - \xi_i^{nom}|}{\Delta \xi_i} \leq \Gamma }$$$\Gamma$ 是预算参数用大白话说就是虽然每个参数都可能取到最差值但不允许所有参数同时都取最差值实操中一般取4到8具体怎么定我放在第3节讲。2.3 从max-min到可计算的鲁棒对等模型有了不确定性集之后约束就变成“对集合内所有 $\xi$ 都成立”的半无限约束。直接扔给求解器是解不了的必须把这种带量词的约束转化成有限个确定性约束这一步叫鲁棒对等转换。以功率平衡约束为例如果我考虑的是最坏情况问题就变成$$\forall \xi \in U: \quad P_{G,t} P_{PV,t}(\xi) P_{WT,t}(\xi) P_{ess,t} P_{buy,t} - P_{sell,t} \geq P_{load,t}(\xi)$$注意它是“≥”而不是“”因为在鲁棒框架下严格等式很难对所有场景都成立。工程上允许系统在部分极端场景下通过储能削峰填谷来弥补只要不越界。这一步非常重要别在建模时写死成等式。对于盒式不确定集最坏场景非常好求如果不确定参数带正号比如光伏、风电出力增加对平衡是不利还是有利要看它出现在哪一侧直接把它的下界代入约束即可。我处理这个问题的标准做法是用对偶理论。核心思想是对每个不确定约束内层求“关于 $\xi$ 的最坏值”可以等价化成对偶问题然后把对偶变量并回到原模型中。对线性约束来说这个对偶变换是精确的不会丢解。以功率平衡约束为例假设只有光伏出力不确定令 $\xi \in [\xi^{min}, \xi^{max}]$且光伏在平衡式中符号为正那么最坏情况就是 $\xi \xi^{min}$所以原约束等价于$$P_{G,t} \xi^{min} P_{WT,t} P_{ess,t} P_{buy,t} - P_{sell,t} \geq P_{load,t}$$如果光伏符号为负比如它在等式左边作为负项就取 $\xi^{max}$。逐个判断符号这种办法很简单但只适用于所有不确定项最终都能线性化到“各自独立取上下界”的情形。如果加了预算约束 $\Gamma$就不能每个参数各自跑了得用排序法或者对偶变量。2.4 单阶段模型和两阶段模型怎么选实际工程里我经常用单阶段鲁棒模型做日前调度。所谓单阶段指的是所有决策变量在一开始就定好不考虑“看到不确定值后再调整”的后悔权。这种模型偏保守但是数学性质简单解起来很快。两阶段模型就不一样了它把决策拆成“这里不可调整的日前决策”和“那里可以基于实时场景调整的再调度决策”用数学语言写就是$$\min_{x} ; c^T x \max_{\xi \in U} ; \min_{y} ; d^T y$$这其实是一个三层优化结构通常用列与约束生成算法CCG或者Benders分解来解。CCG的思路很朴素先初始化一个稳定的主问题然后反复找最坏场景把对应场景的变量和约束加回主问题迭代直到收敛。但我必须提醒你两阶段模型建起来容易真正跑通很难。尤其是储能SOC的时序耦合变量和整数变量搅在一起时子问题要么变成混合整数规划要么出现对偶不可行调试周期非常长。所以我的建议是除非研究需要工程首版先上单阶段鲁棒等所有数据分析、汇报展示都跑通了再考虑两阶段升级。3. 实战一台旧笔记本也能跑的微电网鲁棒优化3.1 案例参数一览下面这个案例是我在某园区微电网平台上验证过的版本参数做了适当脱敏和简化但逻辑完全一致。时间分辨率取1小时调度周期24小时。对象参数数值燃气机组额定功率2 MW燃气机组出力下限0.2 MW燃气机组爬坡速率1 MW/h光伏预测出力区间0~3 MW具体见曲线风电预测出力区间0~1.5 MW储能容量1 MWh储能最大充放电功率0.4 MW储能充放电效率0.95联络线最大购电功率1 MW联络线最大售电功率0.5 MW负荷预测区间峰月6 MW谷月2 MW光伏和风电的“区间”怎么给我通常不是凭空拍脑袋而是取历史同一时刻预测误差的90分位数和10分位数作为上下界。比如过去30天每天中午12点光伏预测值和实测值误差最大的10%可以算出上界最小的10%算出下界这样不确定性集就有了统计数据支撑而不是主观臆造。3.2 Python CVXPY 实现步骤实现我选的是Python的CVXPY库求解器用开源免费的HiGHS做线性规划足够快。如果你有Gurobi或者Cplex授权直接换也行。第一步是定义不确定场景。对盒式不确定集来说最坏场景函数可以这样写import numpy as np import cvxpy as cp # 最坏场景构造根据约束中不确定项前的系数符号决定取上界还是下界 def worst_case_pv(coefficient, pv_low, pv_high): # 如果系数为正最坏是取下界系数为负最坏是取上界 return np.where(coefficient 0, pv_low, pv_high)第二步定义变量T 24 P_g cp.Variable(T) # 燃气机组出力 P_ess cp.Variable(T) # 储能有正有负正为放电 SOC cp.Variable(T 1) # SOC向量0时刻初值 P_buy cp.Variable(T, nonnegTrue) P_sell cp.Variable(T, nonnegTrue)第三步是把所有带不确定参数的约束做鲁棒对等。以功率平衡约束为例如果我把不确定性都归到光伏出力上那么最坏情况就是光伏取预测区间的下界# pv_min 是每个时段光伏出力的最坏情况 constraints [] for t in range(T): constraints.append( P_g[t] pv_min[t] P_ess[t] P_buy[t] - P_sell[t] load_forecast[t] )注意这里我故意写成了不等式。这样系统在极端情况下可以通过储能放电来填补差额而不是必须严格相等。第四步是储能SOC约束和机组爬坡约束constraints.append(SOC[0] 0.5) # 初始SOC 50% for t in range(T): constraints.append(SOC[t1] SOC[t] - P_ess[t] * 0.25) # 1小时分辨率容量1MWh constraints.append(SOC[t1] 0.1) constraints.append(SOC[t1] 0.9) constraints.append(cp.abs(P_ess[t]) 0.4) for t in range(1, T): constraints.append(P_g[t] - P_g[t-1] 1.0) constraints.append(P_g[t-1] - P_g[t] 1.0)第五步是目标函数cost 0 for t in range(T): cost fuel_cost * P_g[t] cost buy_price[t] * P_buy[t] cost - sell_price[t] * P_sell[t] cost ess_loss_cost * cp.abs(P_ess[t]) problem cp.Problem(cp.Minimize(cost), constraints) problem.solve(solvercp.HiGHS, verboseFalse)这套代码我跑了无数遍单次求解时间不超过0.5秒。对于24时段的日前鲁棒调度来说这个速度完全够用。3.3 结果对比确定性模型和鲁棒模型差多少我用同样的参数分别跑确定性模型和鲁棒模型最直观的差异在光伏出力偏差较大的时段。某天中午光伏预测出力2.8MW鲁棒模型认为最坏情况可能只有1.6MW左右于是提前安排了燃气机组在11点就开始升出力同时让储能早早就留了余量。而确定性模型只按2.8MW安排燃气机组在中午压得很低甚至停机储能也充满电待命。结果是当天下午光伏突然被云遮住确定性方案的系统出现约0.9MW的缺额只能紧急购电而鲁棒方案靠提前预留的机组爬坡空间和储能放电平稳过渡。成本对比我做过一个典型日测试模型总运行成本是否满足最坏场景确定性优化约4.6万元否出现缺额鲁棒优化盒式集约5.1万元是鲁棒优化预算集Γ6约4.9万元是允许部分参数非极端鲁棒方案比确定性方案贵约10%但避免了切负荷或紧急购电的高额惩罚。很多时候这10%就是“保险费”。3.4 不确定性预算Γ怎么定我认为这是整个鲁棒优化里最有艺术感的参数。Γ太小模型和确定性优化没什么区别起不到保护作用Γ太大系统过度防御成本暴涨储能负荷率低得离谱。我的做法是画一张“成本-风险曲线”把Γ从0扫到最大可能值记录总成本和最坏场景下的失负荷量。拐点附近就是推荐的Γ取值。所谓拐点就是“再增加一单位Γ成本上升加速但风险下降已经不明显”的位置。实际操作中我还做过一个经验公式参考设不确定参数的个数为N建议 Γ 初始取 $\sqrt{N}$ 到 $\sqrt{2N}$ 的区间。比方说有24个光伏时段不确定量$\sqrt{24}\approx5$可以先从Γ5开始扫。还有一点不能忘Γ选好之后在项目交付文档里一定要标清楚“这是基于历史数据90分位误差得到的”这样即便被质疑保守也能拿数据说话。4. 实操中的坑能救一个是一个4.1 数值尺度问题往往最坑我第一次用全千瓦单位建模变量动辄几千上万约束矩阵的条件数很不好。HiGHS直接报数值警告Gurobi倒是能解但解的精度让人心虚。后来我学乖了功率统一用MW储能容量用MWh费用统一用万元或者统一用元尽量让目标函数和约束的数值量级落在0.01到100之间。如果涉及SOC的递推注意时间步长带来的系数缩小比如1小时分辨率下$P_{ess} \times 1 h / 1 MWh$ 这个系数是1但如果分辨率改成15分钟系数就是0.25别漏掉。4.2 储能SOC的末端约束别忘储能SOC如果不加末端约束优化结果经常是最后几个时段疯狂放电把SOC放到底因为这样“看起来省钱”。但现实中第二天还要继续运行这种解根本不可执行。我习惯加上 $SOC_T \geq SOC_0$ 这样的循环约束表示日调度不消耗储能“家底”。代价是成本略有上升但调度方案更真实。如果你的平台允许跨日调度可以改成让末端SOC落在一定区间内比如初始SOC的±10%。4.3 最坏场景下的不可行问题鲁棒建模最尴尬的情况是模型本身不可行但你又不知道是参数问题、约束冲突还是不确定性集定义错了或者对偶转换错了。排查时有一个好用的调试顺序先把所有不确定参数全部固定在预测值上跑一遍确定性模型确认基础模型可行再把不确定性集逐个加入每加一个就检查一次可行性定位是哪类约束导致冲突最后检查对偶转换时有没有忘了%和符号变化尤其是对偶变量非负约束。如果第2步发现功率平衡约束不可行通常不是模型逻辑错而是你划定的不确定性集范围太大超出了系统“物理可调能力”。这时候需要回头和气象预测团队聊一下误差区间是不是取得过于保守或者适当调低Γ。4.4 盒式不确定性集太保守怎么办盒式集最大的问题在于它假设所有参数同时达到最差。实际中同一天中风速低谷和光照低谷同时出现的概率并不大。所以纯粹用盒式集调度方案会显得很笨——燃气机组一直提心吊胆地带高备用储能也始终不敢满充满放。预算集是治这个的良药。给不确定参数加上一个总的“异常程度预算”等效于告诉模型你允许几个参数同时调皮但不会全部调皮。偷懒的做法是把每个时段的预测误差都缩到90%分位再用Γ6去约束。4.5 避免用绝对值函数把线性问题搞复杂储能损耗成本里我写了 $|P_{ess,t}|$在CVXPY里写成cp.abs没问题内部会自动转成等价的线性规划。但如果你在别的框架里手写建模千万不要把绝对值留在非线性项里要么拆成两个非负变量要么引入辅助变量u_t P_ess[t]、u_t -P_ess[t]把目标改成C_ess * u_t这才是线性化的正规操作。5. 汇报与落地从模型到“智能微电网PPT”的距离5.1 算法做得再漂亮最后也要把价值讲清楚模型跑通只是第一步现实里还得面对领导、甲方或者评审专家。这时候平衡公式和对偶变量会瞬间把人劝退。我习惯把所有成果沉淀成一个智能微电网ppt风格的汇报材料核心只讲四张图。第一张是典型日调度曲线对比图。把确定性方案和鲁棒方案的机组、储能、联络线曲线画在一起标注在最坏场景下的差异性直观表达“鲁棒方案虽然贵一点但确实更稳”。第二张是成本-风险帕累托曲线。横轴是Γ大小纵轴是总成本再加一条虚线表示最坏失负荷量用曲线证明你的选择不是拍脑袋而是有数据支撑的权衡。第三张是不确定性集的可视化。我经常用一个时间序列误差带状图去解释蓝色预测曲线灰色误差带用红色虚线标出不确定性集边界。对非专业观众来说这张图远比“预算参数Γ”好懂。第四张是实时闭环流程图。讲清楚日前鲁棒调度和日内MPC修正的关系展示你是怎么做滚动更新的以及鲁棒优化的安全包络如何给日内调整留出空间。5.2 一份有价值的汇报该放哪些素材除了上面四张图我在文件夹里还固定存放三类东西一是一页“不确定性来源汇总表”把光伏、风电、负荷的预测误差来源和区间大小列全二是一页“方案参数表”包括Γ取值、最坏场景对应的具体时点和数值三是一页“结论页”用两三句话给出结论比如“在光伏出力偏差达35%的极端日鲁棒方案仍能保持供电可靠总成本仅增加8%”。做这类汇报树状图和表格比大段文字更有说服力。听众最关心的不是你的求解器多高级而是“这套方案比原来的强在哪多花多少钱有没有风险”。5.3 后续还能往哪扩展鲁棒优化不是万能药它和随机优化各有适用边界。如果你们平台历史数据很丰富而且能够获得相对可靠的预测误差分布可以考虑随机优化或者分布式鲁棒优化。分布式鲁棒优化是目前学术界和工业界都盯着的方向思路是“不确定性集合里不是所有概率分布都可信但我们要保证最坏分布下表现也不差”这个属于进阶版本可以在基础鲁棒优化吃透之后再接触。对工程落地来说更实际的扩展是把日前鲁棒调度的结果和日内模型预测控制联动起来构建“鲁棒优化做边界MPC做跟踪”的分层框架既能保证可靠又不至于因为过度保守损失太多经济性。我个人实际用下来的体会是鲁棒优化最打动人的一点是它把“不确定性”这种抽象的东西转化成了可以计算、可以调节、可以汇报的参数。你不需要神化它也不用畏惧它把它当成调度工具箱里一把专门应对最坏情况的尺子就好。最后再分享一个小技巧所有不确定性参数无论公式里多复杂第一步永远是用历史数据画区间图。区间画得难看后面的模型再漂亮也是空中楼阁。
返回列表