简介:基于多时间尺度滚动优化的多能源微网双层调度模型,是一份面向电力系统、储能与新能源研究者的MATLAB/Simulink实现资料。模型将日前、小时级与分钟级调度纳入统一框架,通过滚动优化应对风光出力与负荷波动的不确定性,并利用上层全局决策与下层设备控制的层级结构,协调储能、分布式电源及主网交互,兼顾经济性与可靠性。压缩包共86个文件,包含48个.m脚本、36个.mat数据文件,以及1个PDF说明和1个TXT文档,整体约2MB;.m文件为主要算法与仿真实现,.mat文件用于存储典型日或场景数据,说明文档则用于梳理建模思路与使用方法。该资源已有74人学习,适合具备一定优化调度基础、希望复现或扩展多能源微网双层模型的工程师与研究生。通过研读模型源码与数据,可掌握多时间尺度滚动优化的建模流程、求解架构及参数配置方法,为后续开展低碳调度或园区级能源管理研究提供可直接修改的起点。
1. 多能源微网双层调度模型:滚动优化不是把MPC换个名字
做过微网调度的人都知道这种尴尬:日前模型劳心费力算出来的机组启停、购售电计划,到了第二天上午十点,光伏出力跟预测差了百分之二三十,储能SOC被实际负荷带着跑偏,整套方案在实时运行里基本作废。问题不在求解器,也没必要全怪预测,而是调度框架本身接不住波动——单靠一次开环优化,怎么都追不上风光负荷的持续性变化。这套「基于多时间尺度滚动优化的多能源微网双层调度模型」资源,解决的就是这个脱节:上层做日前全局决策,下层用滚动窗口逐时修正,让计划始终贴着实际运行状态走。适合正在做微网能量管理、综合能源系统优化调度的研究生和工程师,拿来当建模起点或对比基准都很顺手。
2. 多时间尺度调度拆开看:四个时间尺度各管一段,滚动窗口怎么设
调度的难度不在模型规模,而在预测误差会随时间拉长。提前24小时看,负荷预测偏差三到五个百分点是常态,光伏出力在天气多变时偏差百分之二三十也不稀奇;但把时间缩短到15分钟,预测精度能显著改善。这说明一个基本事实:决策越早,越难做准;决策越晚,越难顾全局。多能源微网(Multi-Energy Microgrid,以下简称MEMG)要把风电、光伏、储能、燃气机组和主网交互捏在一起,就必须让不同频率的决策各管一段。
2.1 日前、日内、实时:不同预测误差下谁说了算
常见的微网调度体系可以拆成三层,外加一层持续运行的滚动窗口。
| 时间尺度 | 前瞻长度 | 决策内容 | 预测误差常态范围 |
|---|---|---|---|
| 日前调度 | 24小时,1小时粒度 | 机组启停、购售电框架、储能基准曲线 | 负荷3%-8%,光伏10%-30% |
| 日内滚动 | 4-6小时,15分钟粒度 | 出力修正、储能充放电调整 | 负荷1%-4%,光伏3%-10% |
| 实时控制 | 秒到分钟级 | 自动发电控制、频率电压支撑 | 基本不需要预测 |
这是按机组物理特性做的分工。燃气机组启动要提前数小时,所以启停这类离散决策必须放在日前做;储能响应快,但充放电策略跨时段耦合,需要在日内尺度统一协调;光伏逆变器、储能PCS这类设备级响应,才归实时控制。这三层不是互相替代的关系,各层管各层的对象,分辨率不同、刷新频率不同、决策变量类型也不同。
多能源微网的复杂性在于:电能、热能和天然气负荷的时间常数不一样,储能的可调度时长又横跨小时级,如果只用单一时间尺度的优化,要么响应太慢、要么计算量失控。把滚动优化放在日内层,实际上是给了系统一个「每15分钟重新校准一次」的机制,正好卡在预测精度和计算可行性之间的平衡点。
2.2 滚动窗口机制:预测时域、控制时域与一次闭环
滚动优化在控制领域有个更常见的叫法:后退时域控制。核心操作是三个反复执行的步骤:在每个采样时刻,基于当前实测状态和最新预测,求解从当前到未来H个时段的一个有限时域优化问题;但只执行第一步的决策指令;等到下一个采样时刻,状态刷新、预测更新,再把窗口整体往前提,重新求解。
这里的细节决定了效果。开环日前调度是把整个24小时一次算完、一次全部执行,相当于在信息不完整的情况下把所有赌注都押上去。滚动优化则把不确定性问题拆成一串短时域子问题,每一步都在吸收新信息。从数学上看,滚动优化是有反馈的闭环策略:实测SOC、实测功率这些状态量在每个滚动周期都会覆盖模型里的预测状态,让偏差不会跨时段累积。
最容易被忽视的一点是「只执行第一步」。有些实现把滚动优化写成了「每15分钟重算一次24小时」,执行窗口内全部指令,那本质还是开环调度,只是重算频率变高,反馈路径并没有真正闭合。识别一份代码是不是真滚动,看两个地方:有没有在每步求解前注入实测状态,有没有只取第一步结果下发执行。
2.3 窗口长度和滚动步长:拍脑袋参数背后的依据
窗口长度H是滚动优化里最关键的参数,也是最容易靠感觉拍的一个。H太短,只能看到局部,储能可能来不及在低谷充电;H太长,窗口尾部的预测精度差,算出来的计划本身不可信。我一般按储能的可调度时长来定窗口下限——如果储能能支撑6小时充放,窗口至少覆盖6小时,否则SOC决策看不见终点。
更常用的取值是4到6小时。对15分钟一个时段来说,16到24个时段,模型规模适中,混合整数规划求解在十几秒内能收敛,正好卡进滚动周期。至于滚动步长,15分钟是工程上的默认值,因为它跟风光功率预测的刷新周期一致。如果步长比预测刷新快,状态是新的、预测是旧的,滚动优化的信息增益会明显打折。窗口向前看多少、每次走多远,这两件事建议显式写在参数文件里,后面调灵敏度分析要反复动它们。
3. 双层模型建模:上层盯交易、下层盯设备,核心在耦合变量
「双层」这个词在调度文献里经常出现,但含义并不统一。这个资源里的双层模型,结构上更接近「上层做日前全局决策、下层做日内滚动修正」的分层递阶调度:上层给出运行框架,下层在这个框架内吸收预测误差。两层的目标函数和约束虽然都在描述同一个物理系统,但决策变量类型、时间粒度和信息基础完全不同,这才是必须分开建的原因。
3.1 上层日前调度:机组组合与主网交易怎么建模
上层模型解决的是「明天怎么开设备」的问题。典型的多能源微网含燃气轮机、储能、光伏和风电,可能还有电锅炉或余热回收,但调度主线上最核心的是四类决策变量:机组启停状态、各时段机组出力、与主网的购售电功率、储能充放电基准曲线。
目标函数一般写成运行成本最小化:
- 购电成本减去售电收益,电价用分时电价序列;
- 燃气机组的燃料成本,按出力二次函数或分段线性化处理;
- 机组启动成本,只在启停状态从0变1时计费;
- 弃风弃光惩罚项,避免模型为了省钱把新能源压到最低。
约束侧的难点不在数量,而在时间耦合。功率平衡约束连接所有电源和负荷;机组爬坡约束把相邻时段的出力绑在一起;储能SOC递推式让每一时刻的状态都继承上一时刻;还有SOC日始日终相等这种全局约束——它要求储能一天下来不能越用越少,也不能无中生有。这些约束叠加在一起,形成一个典型的混合整数规划,用商业求解器能直接解。
3.2 下层日内滚动:参考值跟随与SOC修正
下层模型在日前计划已经定下机组启停框架的前提下运行。它拿到的输入有三样:最新的风光负荷预测序列、当前时刻的储能SOC实测值、上层传下来的日前计划参考值。下层要回答的问题是:接下来4小时内,每个15分钟时段各设备到底出力多少。
目标函数通常包含两部分。一部分是运行成本,跟上层类似,但视角更短;另一部分是偏离惩罚项,用于惩罚各设备出力对日前计划的偏差。这个惩罚项是双层模型成败的关键——它把上层意图传递到下层决策中。权重不是随便设的,需要按「上层计划比实时电价的决策优先级更高」来标定,通常要做到量级平衡,不能让偏离惩罚淹没运行成本,也不能小到可忽略。
下层约束和上层结构相近,但有两点区别:机组启停状态固定为上层的日前解,不再作为优化变量;储能SOC的窗口终点需要增加参考约束,一般是软约束,让SOC在窗口结束时尽量贴近日前计划的对应值,防止储能被滚到边界外。
3.3 双层怎么咬合:耦合变量、传递参数与求解次序
双层模型里上层的决策结果如何影响下层,是所有代码实现里最绕的地方。耦合不是发生在目标函数里,而是通过两组传递量实现:一是参考值,下层目标里的偏离惩罚项直接引用上层解;二是边界条件,下层滚动窗口的初始SOC取实测值,而实测值本身又依赖历史上层计划执行后的结果。
如果上层和下层各自独立求解、互不反馈,那就只是两个串联的优化问题,不是真正意义的双层。完整的双层递阶调度,需要在每个滚动周期把下层实际执行结果返回给上层,至少要做到两点:管理层的日前计划应当基于历史日内执行效果的统计偏差来校准,比如对日前预测的偏差程度做滚动修正;下层在滚动结束时则要向上层反馈实际可达的边界信息。在工程实现里,反馈一次的迭代足以应对大多数场景,反馈多轮的计算开销反而容易失控。
4. 从公式到代码:yalmip建模与双层求解的三段落地
模型写清楚之后,真正动手要把三块代码落地:日前上层、日内滚动下层、以及两层之间的衔接。这里给出我常用的实现框架,求解平台是MATLAB搭配yalmip,求解器用商用混合整数规划求解器。如果机器上只有开源求解器也能跑通,只是大M法处理互补约束时收敛会慢不少。
4.1 为什么选MATLAB加yalmip:三行声明变量,半小时建模
yalmip解决的最大痛点是用自然语法声明优化变量。sdpvar声明连续变量,binvar声明0-1变量,目标函数和约束直接按数学表达式抄下来,optimize一行求解,省掉大量手工拼接矩阵的重复劳动。调模型参数、换预测场景、改窗口长度都很快。这套组合在电气调度领域用得最多,遇到问题容易搜到案例,这也是我推荐用它复现这类模型的原因。
4.2 日前(上层)调度核心代码
上层模型用24个时段、每小时一个点来建。两台燃气机组,一台储能,外接主网购售电,风光和负荷曲线用历史数据或预测数据输入。
%% 日前上层调度模型 T = 24; % 日前调度时段数(小时) Ng = 2; % 燃气机组数量 % 决策变量 P_g = sdpvar(T, Ng); % 各机组出力 u_g = binvar(T, Ng); % 机组启停状态 P_ch = sdpvar(T, 1); % 储能充电功率 P_dis = sdpvar(T, 1); % 储能放电功率 u_ess = binvar(T, 1); % 充放电互斥标志:1充0放 P_buy = sdpvar(T, 1); % 从主网购电 P_sell = sdpvar(T, 1); % 向主网售电 SOC = sdpvar(T+1, 1); % 储能SOC曲线 % 目标函数:燃料成本 + 购电成本 - 售电收益 + 启动成本 start_up = binvar(T-1, Ng); % 记录是否发生冷启动 Constraints = []; Constraints = [Constraints, start_up >= u_g(2:end,:) - u_g(1:end-1,:)]; obj = sum(sum(c_g .* P_g)) ... + sum(price_buy .* P_buy - price_sell .* P_sell) ... + sum(sum(c_start .* start_up)) ... + sum(sum(M_curtail .* (P_pv_avail + P_wt_avail - P_pv - P_wt))); % 功率平衡 Constraints = [Constraints, sum(P_g,2) + P_pv + P_wt ... + P_dis + P_buy == P_load + P_ch + P_sell]; % 机组出力上下限与爬坡 Constraints = [Constraints, P_g <= P_g_max .* u_g]; % 启停约束 Constraints = [Constraints, P_g >= P_g_min .* u_g]; Constraints = [Constraints, P_g(2:end,:) - P_g(1:end-1,:) <= ramp_up]; Constraints = [Constraints, P_g(1:end-1,:) - P_g(2:end,:) <= ramp_down]; % 储能模型:充放电互斥与SOC递推 Constraints = [Constraints, P_ch <= P_ess_max .* u_ess]; Constraints = [Constraints, P_dis <= P_ess_max .* (1 - u_ess)]; for t = 1:T Constraints = [Constraints, SOC(t+1) == SOC(t) ... + P_ch(t)*eta_ch - P_dis(t)/eta_dis]; end Constraints = [Constraints, SOC(1) == SOC_init]; % 初始SOC Constraints = [Constraints, SOC(T+1) == SOC_init]; % 日始日终相等 ops = sdpsettings('solver', 'gurobi', 'verbose', 0, 'mipgap', 1e-4); optimize(Constraints, obj, ops);这段代码里,u_g和u_ess都是0-1变量,它们的引入把问题变成了混合整数规划。功率平衡约束里sum(P_g,2)是按行求和,得到每个时段的机组总出力。储能模型的充放电互斥用u_ess实现:当u_ess(t)=1时充电功率可以大于0而放电被压到0,反之亦然,避免求解器给出又充又放的无意义解。SOC的日始日终相等约束,强制储能一天内不能透支,这是日前模型和日内模型最重要的区别之一。
目标函数里的弃风弃光惩罚项M_curtail取值要大于任何发电收益,否则模型会在经济性驱动下主动弃掉新能源。这个M值本身就是个需要注意的参数,设太大会影响数值稳定性,设太小达不到抑制弃风弃光的效果,通常取最大单时段成本的十倍左右。
4.3 日内(下层)滚动优化核心代码
下层滚动以15分钟为一个时段,一天共96个时段。窗口长度取16个时段(4小时),每个采样周期滚动一步。预测数据在每步都刷新,储能SOC在每步用实测值覆盖。
%% 日内滚动优化主循环 H = 16; % 滚动窗口:向前看16个时段(4小时) N_roll = 96; % 一天96个滚动步 SOC_meas = SOC_day; % 实测SOC序列,初值取日前初始值 for k = 1 : N_roll idx = k : min(k + H - 1, N_roll); % 当前窗口覆盖的时段 L = length(idx); % 1. 状态注入:用当前实测状态覆盖模型状态 SOC_init_rt = SOC_meas(k); % 2. 最新预测与日前参考值 P_pv_hat = P_pv_forecast(idx); % 最新光伏预测 P_load_hat = P_load_forecast(idx); % 最新负荷预测 P_g_ref = P_g_day(idx, :); % 日前计划的机组出力参考 SOC_ref = SOC_day(idx); % 日前计划的SOC参考 % 3. 窗口内优化变量 P_g_rt = sdpvar(L, Ng); u_g_rt = u_g_day(idx, :); % 锁定日前启停方案 P_ch_rt = sdpvar(L, 1); P_dis_rt = sdpvar(L, 1); u_ess_rt = binvar(L, 1); P_buy_rt = sdpvar(L, 1); P_sell_rt = sdpvar(L, 1); SOC_rt = sdpvar(L+1, 1); % 4. 目标:运行成本 + 对日前计划的偏离惩罚 obj_rt = sum(price_buy(idx) .* P_buy_rt - price_sell(idx) .* P_sell_rt) ... + sum(sum(c_g .* P_g_rt)) ... + lambda_g * sum(sum(abs(P_g_rt - P_g_ref))) ... + lambda_soc * sum(abs(SOC_rt(1:L) - SOC_ref)) ... + lambda_trade * sum(abs(P_buy_rt - P_buy_ref(idx))); % 5. 约束搭建(窗口内) Constraints_rt = []; Constraints_rt = [Constraints_rt, sum(P_g_rt,2) + P_pv_hat + P_wt_hat ... + P_dis_rt + P_buy_rt == P_load_hat + P_ch_rt + P_sell_rt]; Constraints_rt = [Constraints_rt, P_g_rt <= P_g_max .* u_g_rt]; Constraints_rt = [Constraints_rt, P_g_rt >= P_g_min .* u_g_rt]; Constraints_rt = [Constraints_rt, P_ch_rt <= P_ess_max .* u_ess_rt]; Constraints_rt = [Constraints_rt, P_dis_rt <= P_ess_max .* (1 - u_ess_rt)]; for t = 1:L Constraints_rt = [Constraints_rt, SOC_rt(t+1) == SOC_rt(t) ... + P_ch_rt(t)*eta_ch - P_dis_rt(t)/eta_dis]; end Constraints_rt = [Constraints_rt, SOC_rt(1) == SOC_init_rt]; Constraints_rt = [Constraints_rt, SOC_rt(L+1) >= SOC_ref(end) - delta_soc]; % 6. 求解并只执行第一步 ops_rt = sdpsettings('solver', 'gurobi', 'verbose', 0, 'mipgap', 1e-3, 'timelimit', 10); optimize(Constraints_rt, obj_rt, ops_rt); P_exec(k, :) = value(P_g_rt(1, :)); % 下发第一步 P_buy_exec(k) = value(P_buy_rt(1)); SOC_meas(k+1) = SOC_rt(2) + 0.5; % 实际场景这里用采集值 end这个循环里最关键的是第1步和第6步。状态注入如果漏掉,滚动优化就退化成开环重算;只执行第一步如果改成执行全窗口,反馈机制就失效了。lambda_g、lambda_soc和lambda_trade三个惩罚系数需要一起标定:偏大,日内层会死守日前计划,失去修正预测误差的能力;偏小,日前计划被完全滚没,机组的运行点可能剧烈跳动。工程上常见的调法是先取运行成本量级的1%-5%,再看滚动结果的方差调整。
4.4 双层衔接:KKT变换与大M线性化,或迭代求解
把上层和下层真正写成一体,常见做法有二。第一种是把下层优化问题替换成其KKT条件(卡罗需-库恩-塔克条件),整体并入上层的约束,得到一个带互补松弛条件的数学规划(MPCC),再用大M法把互补条件线性化,交给求解器一次解完。第二种是把下层作为可行性检查,用迭代方式反复修正上层的偏差系数。
第一种更彻底,适合下层是线性规划且规模不大的场景。互补松弛条件的线性化写法如下:
%% KKT互补松弛条件的大M线性化 % 对下层问题的每条不等式约束 g_i(x) <= 0 引入对偶变量 lambda_i % 互补条件:g_i <= 0, lambda_i >= 0, lambda_i * g_i == 0 M = 100; % 大M值,按约束量级设定 for i = 1 : n_ineq z = binvar(1, 1); Constraints = [Constraints, g_i >= 0, g_i <= M * (1 - z)]; Constraints = [Constraints, lambda_i >= 0, lambda_i <= M * z]; end这段的逻辑是:当z=1时,g_i被压到0而lambda_i可以自由取正;当z=0时,lambda_i被压到0而g_i可以自由取负。两条边界用同一个0-1变量绑在一起,正好表达了「要么对偶变量为0,要么约束取等号」的互补关系。
大M线性化在实际求解中比想象中更容易翻车,M值取大会导致求解器数值病态,取小则污染可行域。如果下层约束的物理量纲差异很大,比如功率约束和SOC约束差两个数量级,建议先做标幺化处理,把所有约束归一到同一量级再去选M。在这个资源对应的问题规模下,MPCC路线对乘子的初值非常敏感,如果没有明确的物理意义指导初值设定,第二种迭代法反而是工程上更稳的起点。
5. 避坑清单:双层滚动调度最容易翻车的五个位置
双层加滚动,叠加了MPC和数学规划两套体系的坑。这里把踩过的和帮别人排查过的典型问题整理成清单,每条按现象、原因、解决的顺序展开,排查时可以直接对号入座。
5.1 大M法求解报数值错误:M值成了「玄学」
现象:MPCC模型在某些时段的解完全不可信,求解器返回numerical issues,或者同一个模型多跑几次结果不一致,甚至直接报不可行。把M从100改成10000后问题反而更严重。
原因:大M法要求M大于约束取值的任何可能上界,但过大的M会让约束矩阵的条件数恶化。求解器在浮点精度下无法区分「很大」和「无穷大」,互补条件被数值误差破坏。
解决:把所有约束先做标幺化,功率、SOC、电价统一归一到类似0到1或0到100的区间再选M。我一般在标幺化后把M设成约束最大可能取值的1.5倍,然后跑一次小规模算例验证互补条件是否严格满足。如果追求稳,换成yalmip自带的大M处理方式或直接声明互补条件,让求解器内部来处理这类约束。
5.2 滚动窗口末尾SOC漂移:储能被滚到越界
现象:滚动优化一天跑完,储能SOC曲线在晚间跌到下限以下,或者深夜出现连续多个时段的充电顶格。把SOC曲线画出来,发现它跟日前计划的SOC参考越走越远。
原因:每次滚动只优化未来4小时,窗口终点没有约束,储能没有动机为窗口外的时段预留电量。虽然代码里加了SOC_rt(L+1) >= SOC_ref(end) - delta_soc,但delta_soc放得太宽,约束形同虚设。
解决:把窗口终点SOC约束改成硬约束,SOC_rt(L+1) >= SOC_ref(end),同时把SOC参考从日前计划改为「基于当前实际状态修正后的目标曲线」。如果担心硬约束导致窗口内不可行,就在目标函数里加大lambda_soc到百倍量级,让终点偏移的惩罚远大于运行成本的经济性收益。
5.3 双层转单层时目标函数冒出双线性项
现象:KKT变换后模型规模没变大多少,但求解时间从几十秒涨到几十分钟,而且解的质量差。检查模型发现目标函数里出现了lambda .* 变量形式的双线性项。
原因:把下层问题的目标函数通过强对偶或KKT合并进上层目标时,对偶变量和原始变量相乘会产生双线性项。有些教程为了省事直接保留这个项,把线性规划变成了非凸问题。
解决:用强对偶定理替换下层目标时,检查下层目标是否存在双线性项残留。对于本文这种上下层都是线性规划的结构,强对偶条件obj_dual == obj_primal是一个线性等式,用等式约束代替双线性目标即可。如果下层包含0-1变量,强对偶定理不再适用,换迭代法更稳妥。
5.4 预测时间戳没对齐:滚动优化算了个寂寞
现象:滚动结果跟日前结果几乎一样,预测误差修正效果为零。以为是滚动窗口长度问题,调了半天H都没变化,查看数据发现每步用的还是日前的同一条预测曲线。
原因:风电光伏功率预测是定时刷新的,比如每小时整点生成一条未来4小时的预测序列。滚动步长15分钟,但预测数据4小时才刷新一次,中间三个步长用的还是旧预测,信息增益自然小。
解决:把预测刷新周期和滚动步长显式匹配。如果只有小时级预测,滚动步长就设为1小时;如果坚持15分钟滚动,预测模块要按15分钟频率输出。排查时直接在代码里打印每步P_pv_forecast的时间戳,确认是不是每步都在变。
5.5 下层自由度给太大:把上层方案完全滚没了
现象:机组出力曲线在日内滚动中来回波动,频繁出现与日前启停方案不一致的运行点,甚至出现「下层优化结果让某个时段购电量变成负的」这类违背物理直觉的结果。
原因:启停方案虽然被锁定了,但下层的购售电、充放电自由度若没有约束,偏离惩罚项的权重不够,下层会为了局部经济性完全推翻上层的全局决策。正常情况下日内滚动应该在上层方案的邻域内修正,而不是另起炉灶。
解决:给下层增加两个限制。一是购售电功率不得与日前方案方向相反,至少要在目标里加单边惩罚;二是让lambda_g覆盖机组边际成本的量级,把偏离惩罚做成「参考计划的影子价格」,而不是一个装饰性的小权重。
6. 跑完别急着收工:用偏差指标反向验证调度模型
模型能跑出最优解,不等于模型真的解决了问题。我习惯在调度仿真结束后,强制做一轮「计划对计划、计划对实际」的偏差审计,用三个指标判断滚动优化到底有没有生效。
第一个指标是日前计划与日内计划间的平均绝对偏差。对比同一时段的日前机组出力和日内滚动机组出力,算出MAE再除以平均出力。如果这个数超过30%,说明上层计划对下层的约束力太弱,惩罚系数需要上调;如果接近零,说明滚动优化的修正能力没发挥出来,惩罚系数需要下调。
第二个指标是日内计划与实际执行间的可执行率。把每个滚动周期真正下发执行的出力,跟第二天仿真的实际状态曲线一比,统计偏差超过5%的时段占比。这一步能抓出状态注入漏写、预测时间戳错位这类隐蔽问题。可执行率低于80%的模型,上层算得再准也落不了地。
第三个指标是成本对比。设三组实验:纯日前开环、滚动优化但不注入实测状态、完整滚动优化。三组分别跑一天,对比运行总成本。多能源微网里储能参与调峰时,滚动优化相对开环通常能省下几个百分点的成本;如果三组结果几乎重合,大概率是滚动机制没真正生效,回到第5章的清单逐条排查。
最后做一个灵敏度分析,把光伏预测误差从5%逐级加到30%,看滚动优化相对开环的收益曲线。误差越大,滚动优化的优势越明显。这条曲线是写报告、答辨时最有说服力的图,也能量化出这套双层调度模型的价值边界。从那以后,我每次跑完调度模型都强制走一遍这三步偏差分析,先看指标、再看曲线、最后才下结论,少走了很多弯路。希望帮到你。
本文还有配套的精品资源,点击获取