ARTICLE DETAIL

资讯详情

深耕编程入门与网站建设的一线实战洞察。

虚拟电厂多时间尺度调度优化:日前经济规划与日内滚动校正的Matlab实现

虚拟电厂多时间尺度调度优化:日前经济规划与日内滚动校正的Matlab实现 做虚拟电厂调度研究的朋友应该都有过这种体会单时间尺度的优化模型在论文里跑得很漂亮一放到有预测误差、有实时波动的场景里就露馅——计划曲线和实际运行曲线完全是两回事。这篇说的顶级SCI复现项目核心就是拆成日前和日内两个时间尺度来做虚拟电厂调度优化用Matlab实现。简单概括日前调度负责在24小时维度上做全局经济寻优日内调度负责在15分钟维度上做滚动偏差校正。两者配合既能压低运行成本又能扛住不确定性。这篇文章我会把建模思路、求解器选型、Matlab代码框架和实际跑模型时的坑全部梳理一遍给正在做VPP调度、想复现SCI论文方法、或者被多时间尺度这个概念卡住的朋友一个可以直接参考的完整路径。1. 虚拟电厂为什么要做两阶段调度单一尺度根本撑不住1.1 虚拟电厂的核心矛盾聚合资源的不可控性虚拟电厂VPPVirtual Power Plant的本质是把分散的屋顶光伏、小型风电、用户侧储能、可调负荷这些东西聚合起来让它们像一个传统电厂那样接受统一调度。听上去很美好但实际做调度优化时你会发现一个问题你聚合的这些资源个体不确定性太大了。光伏出力跟着云走风电出力跟着风速走负荷预测误差在极端天气下能到百分之二三十。如果你只做一个24小时级别的日前调度把未来一天的风、光、负荷当成已知量一次性算出每台机组每个小时的出力计划。这个计划在数学上可能是最优的但到了实际运行时刻真实的风速、光照和预测值对不上这个最优解就变成了不合格解——功率平衡被打破系统频率和节点电压都出问题。1.2 两个时间尺度分别干什么活这就是为什么要把调度拆成两个时间尺度。日前调度Day-Ahead Scheduling解决的是一天维度上的排兵布阵电价高峰时段让储能放电、让燃气轮机多发电价低谷时段给储能充电、让燃气轮机停机可调负荷的平移方案也在这一层确定。它的核心目标是全局经济性。日内调度Intra-Day Dispatch解决的是临近时刻的查漏补缺每15分钟刷新一次超短期预测滚动优化未来4小时的出力计划把日前预测误差导致的功率偏差重新校正回来。它的核心目标是跟踪日前计划 保证实时功率平衡同时尽量降低校正成本。两个时间尺度的关系可以类比成排球队里的战术布置和临场调整赛前教练定好首发阵容和主要战术日前调度比赛进行中根据场上形势随时换人、调整打法日内调度。没有赛前布置会打得很乱没有临场调整则会被对手针对到死。放到VPP里就是没有日前计划日内调度会失去经济性基准没有日内校正日前计划在实时运行中根本执行不下去。1.3 复现SCI论文时多时间尺度模型常见的主流做法我在复现相关论文时发现目前顶级期刊上的VPP多时间尺度调度模型主线脉络基本一致区别主要在不确定性处理手段上方法流派不确定性处理方式模型复杂度适用场景确定性等价忽略不确定性直接用预测值低教学示例、快速验证随机规划场景法生成多种预测场景求期望成本最小中日前调度为主鲁棒优化用不确定区间描述预测误差求最坏情况最优中高日内调度、极端场景模型预测控制MPC滚动优化 反馈校正中日内调度主流方案我这篇的项目采用的是确定性日前 MPC日内的组合这套方案在复现中属于性价比最高的路线日前调度不需要造太多场景日内调度天然具备滚动校正能力Matlab代码实现难度适中而且计算结果可控性很好适合作为复现的起点。2. 日前调度模型先把24小时的经济账算清楚2.1 场景设定与设备建模我先说明一下这篇文章涉及的案例是这样一个微型虚拟电厂一台微型燃气轮机MT、一组锂电池储能BESS、一个风电场WT、一个光伏电站PV再加上一部分可平移负荷。对外与上级电网有购售电交互。所有设备均接入同一个配网节点不考虑网络潮流约束——这一步对初学复现的人来说很重要先把机制问题搞清楚再考虑加网络约束。2.2 决策变量与目标函数日前调度的决策变量包括MT每个时段的出力、启停状态储能每个时段的充放电功率和SOC与上级电网的购电/售电功率可平移负荷在各时段的调用量。时间分辨率取1小时一天24个时段。目标函数是总运行成本最小化我按这个通式来写总的运行成本 MT燃料成本 储能充放电损耗成本 向电网购电成本 弃风弃光惩罚成本 负荷调整补偿成本MT燃料成本二次函数近似C_MT a * P_MT^2 b * P_MT c因为要转MILP所以通常做分段线性化处理。储能损耗成本按充放电电量折算主要为了体现电池循环损耗是真实成本。购电成本电价数据乘以购电功率如果允许售电则售电收益为负成本。弃风弃光惩罚风电光伏实际可发而没发的功率乘以一个高惩罚系数。注意这个惩罚系数不能设置得过高否则优化器会不惜一切代价消纳新能源可能导致其他设备运行极不经济也不能设置得过低否则会大量弃风弃光。我试下来惩罚系数设在购电价峰值的23倍比较合理。负荷调整补偿调用可平移负荷时需要对用户做补偿避免调度方案免费挪动别人的用电计划。2.3 核心约束条件约束条件需要逐条写清楚这是建模中最容易出错的地方我按设备分开列功率平衡约束这是整个模型的骨架。任一时刻虚拟电厂内部总出力必须等于总负荷与对外交互功率的差。数学公式是P_MT(t) P_WT(t) P_PV(t) P_B_dis(t) - P_B_ch(t) P_grid_buy(t) - P_grid_sell(t) P_load(t) - P_shift(t) P_shed(t)说白了就是发出来的电全部要有去处不能凭空多也不能凭空少。MT运行约束出力上下限P_MT_min * u(t) P_MT(t) P_MT_max * u(t)u(t)是启停状态0-1变量。爬坡约束|P_MT(t) - P_MT(t-1)| R_MT * Δt物理上燃气轮机出力不能突升突降。最小启停时间约束这个约束在复现时容易被人忽略。如果忽略MT会在相邻两个时段频繁启停——这在经济上可能被优化器钻空子比如在电价极低和极高之间反复启停来投机但在工程上完全不可行。我在初版代码里就翻过这个车后来老老实实加了最小启停时间约束。储能约束充放电功率限制0 P_B_ch(t) P_B_ch_max * x_ch(t)0 P_B_dis(t) P_B_dis_max * x_dis(t)其中x_ch(t) x_dis(t) 1防止同时充放电。SOC动态约束SOC(t1) SOC(t) (η_ch * P_B_ch(t) - P_B_dis(t) / η_dis) * Δt / E_max。这里要注意充放电效率不对称多数文献里充电效率0.95、放电效率0.95但是实际锂电池两头都打折我这里按两端都取0.95来写。SOC上下限约束以及调度周期末的SOC约束。末尾SOC要不要硬性约束分情况如果你做的是24小时孤立优化那必须约束SOC(24) SOC(0)否则结果会趋近于把储能电量全部放光如果你是连续多日滚动运行那只需要加一个松的约束比如SOC(24) SOC(0) - 0.1避免结局太离谱。可平移负荷约束负荷平移需要在时间上守恒——今天移到明天的量必须在总周期内补回来单时段平移量和总平移量也需要设上限。2.4 不确定性怎么处理场景法的简化版严格意义上的随机规划要生成成百上千个风速、光照场景然后每个场景都跑一次优化求期望值。这个计算量大得离谱对于Matlab复现来说我更建议从简单入手用预测值做确定性优化然后把预测误差的统计分布体现在日内调度的滚动优化里。这样做的好处是日前模型是纯线性规划LP或混合整数线性规划MILP求解快、结果稳定而且整个逻辑链条是自洽的。等到你把这个版本跑通再考虑加场景法去提升日前调度的鲁棒性一步一个坑地迈。3. 日内调度模型滚动窗口如何把计划变成现实3.1 为什么日内调度必须用滚动优化而不是再跑一次全局有朋友可能会问反正都是优化都写成一个模型到了日内把新的预测数据丢进去重新优化一次不就行了吗理论上确实可以但实际操作中有一个致命问题如果你直接重跑一整天24小时的优化新的结果可能跟日前计划偏差很大。虚拟电厂参与电力市场或者接受电网调度时日前申报的出力曲线是有约束力的日内实际执行和申报值偏差太大会有考核费用。所以日内调度模型在目标函数里必须加入一个对日前计划偏离的惩罚项。典型形式是优化目标 运行成本 λ * ||日内决策变量 - 日前计划值||^2Lambda取值需要调试取太大了日内调度就失去校正能力取太小了日内计划偏离日前太多、考核成本反而上升。我个人的经验值是惩罚系数取运行成本单位的1~2倍并且在算例里做一个敏感性分析观察不同λ下的总成本变化选一个拐点值。3.2 MPC日内调度的参数设计日内调度采用模型预测控制的框架。我常用的参数是控制周期15分钟一天96个点。这个分辨率和现货市场的出清周期对齐也符合大多数预测数据的刷新频率。预测时域Np4小时覆盖未来16个时段。太短比如1小时会忽略储能的跨时段调节能力太长比如一整天计算量上升且预测信息价值递减。控制时域Nc1小时4个时段。只执行第一个时段的决策然后滚动到下一个时刻。滚动流程是收到当前时刻最新的超短期预测数据→读取实时状态MT当前出力、储能SOC→构建未来4小时的优化问题→求解→只下发未来15分钟的指令→时间推进到下一点→重复。3.3 日内调度的约束松弛技巧新能源预测误差在短时间尺度上依然存在因此在日内MPC中功率平衡约束可以写成软约束形式P_总出力(t) 松弛变量 ≥ 负荷(t)P_总出力(t) - 松弛变量- ≤ 负荷(t)也就是说允许出现小的不平衡但平衡偏差放进目标函数作为惩罚项。这样做的好处有两个第一避免模型在极端预测误差下出现无可行解。如果你把功率平衡写成硬性的sum(P) Load当预测风速高估、实际风电骤降且MT已经满发时模型就会直接无解。而在真实运行中电网只要求你偏差控制在允许范围比如±5%并不追求数学上的严格相等。第二松弛量的大小直接反映系统当前的调节压力可以作为预警信号——如果你在连续好几个控制周期内都要靠松弛变量才能平衡说明日前计划可能根本不可行需要往上汇报调整基线。3.4 日前计划和日内调度怎么衔接这是整个多时间尺度框架里最微妙的地方。我的做法是日前调度产出的最优解在日内调度中固定为计划基线但留出可调的调整通道。具体来说日内优化变量以偏差量表示ΔP_MT(t) P_MT_日内(t) - P_MT_日前计划(t)目标函数惩罚的是ΔP的绝对值。这样做的好处是决策变量数值范围变窄从0~1000kW变成-200~200kWMILP求解更快而且约束条件可以直接从日前那套继承只是把各设备出力区间改为日前计划值 ± 最大调节范围。4. Matlab实现的关键环节求解器、数据准备和代码架构4.1 求解器选型YALMIP Gurobi是黄金搭档在Matlab里实现VPP调度优化最成熟的路线是YALMIP建模 Gurobi/CPLEX求解。YALMIP本身不是求解器它是一个建模层把变量、约束、目标函数翻译成求解器能识别格式。YALMIP的语法非常贴近数学公式用起来很顺手而且免费开源需要一点配置功夫改模型结构也很灵活。求解器方面我直接给出结论求解器支持问题类型性能许可证GurobiLP/QP/MILP/MIQP极快大规模仍稳健学术免费商用收费CPLEXLP/QP/MILP/MIQP极快学术免费商用收费CBCLP/MILP一般开源免费SCIPLP/MILP/MINLP中上开源免费fmincon非线性规划慢不擅长整数Matlab自带如果你是学生或者课题组成员强烈推荐Gurobi学术许可证申请之后算几千维的MILP速度非常快。如果课题组没有商业求解器预算用CBC也能跑通小算例只是等得稍微久一点。MATLAB自带的linprog和intlinprog也可以用但对于带大量0-1变量储能充放电状态、MT启停状态的MILP问题性能差距明显。4.2 数据准备输入参数的结构化规范调度优化里有一句话模型定生死数据定成败。 我建议把输入数据统一整理成结构体struct或者表格table避免代码里散落一堆裸变量。我常用的数据组织方式是基础参数表基础参数表样例参数数值单位说明MT_max1000kW燃气轮机最大出力MT_min100kW燃气轮机最小稳定出力MT_ramp200kW/15min爬坡速率BESS_cap2000kWh储能容量BESS_Pmax500kW最大充/放电功率BESS_eta_ch0.95-充电效率BESS_eta_dis0.95-放电效率SOC_min / SOC_max0.1 / 0.9-SOC上下限时序数据未来24小时日前用或未来4小时日内用的风电预测出力、光伏预测出力、负荷预测功率、分时电价。用Excel文件维护Matlab里用readtable读入。这里有个小提醒数据的时间戳对齐。IEC和国内很多数据集默认用北京时间但有些公开数据集用UTC如果你不小心混用了会出现非常诡异的结果——比如负荷高峰被挪到了凌晨。我建议在数据准备阶段就统一转换为datetime类型并明确时区所有表格第一个列都是时间戳。4.3 代码架构核心模块怎么划分这项目代码我是按下面这个结构组织的供你参考VPP_Scheduling/ │ ├── main_DA.m % 日前调度主程序 ├── main_ID.m % 日内调度主程序MPC滚动 ├── build_model_DA.m % 日前优化模型构建YALMIP ├── build_model_ID.m % 日内优化模型构建YALMIP ├── load_input_data.m % 数据读取与预处理 ├── generate_forecast.m % 生成超短期预测数据模拟 ├── plot_results.m % 结果可视化 │ ├── data/ │ ├── DA_forecast.xlsx % 日前预测数据 │ ├── ID_forecast.xlsx % 日内滚动预测数据 │ └── price.xlsx % 分时电价 │ └── utils/ ├── convert_to_pu.m % 标幺值转换 └── save_result.m % 结果保存这个结构很清晰主程序只负责流程控制模型构建独立成文件数据全部走文件——改一个参数不用翻代码而是去改Excel对复现实验非常友好。我强烈建议你用这种方式组织不要把所有逻辑塞在一个大脚本里否则后期改一个约束你会怀疑人生。4.4 基于YALMIP的日前调度核心代码我放一个精简过的可运行核心逻辑片段涉及商业项目细节的地方做了裁剪但主干结构完整保留。%% 日前调度核心代码Matlab YALMIP % 加载数据 DA load_input_data(data/DA_forecast.xlsx, data/price.xlsx); T 24; % 决策变量 P_MT sdpvar(1, T); % MT出力 u_MT binvar(1, T); % MT启停状态 P_B_ch sdpvar(1, T); % 储能充电功率 P_B_dis sdpvar(1, T); % 储能放电功率 SOC sdpvar(1, T1); % 储能荷电状态 u_B_ch binvar(1, T); % 充电状态标志 u_B_dis binvar(1, T); % 放电状态标志 P_buy sdpvar(1, T); % 购电功率 P_sell sdpvar(1, T); % 售电功率 % 目标函数 Cost_MT sum(a_mt * P_MT.^2 b_mt * P_MT c_mt .* u_MT); Cost_grid sum(DA.price .* P_buy - DA.sell_price .* P_sell); Cost_BESS sum(c_bess_ch * P_B_ch c_bess_dis * P_B_dis); Cost_curtail sum(curtail_penalty * (DA.WT_forecast DA.PV_forecast - P_WT - P_PV)); Cost_shift sum(c_shift * P_shift); objective Cost_MT Cost_grid Cost_BESS Cost_curtail Cost_shift; % 约束条件 constraints []; % 功率平衡 constraints [constraints, P_MT P_WT P_PV P_B_dis - P_B_ch P_buy - P_sell ... DA.load - P_shift]; % MT出力约束 constraints [constraints, P_MT_min .* u_MT P_MT P_MT_max .* u_MT]; constraints [constraints, -MT_ramp diff(P_MT) MT_ramp]; % 储能约束 constraints [constraints, SOC(2:end) SOC(1:end-1) (BESS_eta_ch * P_B_ch - P_B_dis / BESS_eta_dis) ... * delta_t / BESS_cap]; constraints [constraints, SOC_min SOC SOC_max]; constraints [constraints, SOC(1) SOC0, SOC(end) SOC0]; constraints [constraints, 0 P_B_ch BESS_Pmax * u_B_ch]; constraints [constraints, 0 P_B_dis BESS_Pmax * u_B_dis]; constraints [constraints, u_B_ch u_B_dis 1]; % 求解 options sdpsettings(solver, gurobi, verbose, 1, mipgap, 0.001); optimize(constraints, objective, options); % 提取结果 P_DA value(P_MT); P_B_DA value(P_B_dis) - value(P_B_ch); SOC_DA value(SOC);这个核心代码里P_WT和P_PV是预测出力作为已知量弃风弃光惩罚体现在Cost_curtail中——如果你的模型允许切掉一部分风电光伏那P_WT和P_PV也应该成为决策变量并加上0 P_WT forecast_WT的上限约束。4.5 日内MPC核心代码逻辑日内调度主程序用循环结构实现滚动优化%% 日内调度主程序MPC滚动优化框架 %% 初始化 State.SOC 0.5; % 当前实测SOC State.P_MT 300; % 当前MT实际出力 DA_plan load(results/DA_plan.mat); % 日前计划 % 时间索引一天96个点每点15分钟 for k 1:96 % 1. 获取最新超短期预测未来16个时段即4小时 ID_forecast generate_forecast(k); % 模拟产生新的预测数据 % 2. 构建日内优化问题窗口k ~ k15 optimize(ID_model, ID_objective, options); % 3. 只取第一个时段的结果下发执行 P_MT_actual(k) value(P_MT(1)); P_B_actual(k) value(P_B_dis(1)) - value(P_B_ch(1)); P_grid_actual(k) value(P_buy(1)) - value(P_sell(1)); % 4. 更新系统状态用真实值不是计划值 State.SOC State.SOC (BESS_eta_ch * max(0, P_B_actual(k)) ... - max(0, -P_B_actual(k)) / BESS_eta_dis) * dt / BESS_cap; State.SOC max(SOC_min, min(SOC_max, State.SOC)); % 防越界 end日内优化的目标函数里除了常规成本外关键是加入偏差惩罚项% 偏差惩罚项与日前计划的偏离 deviation_penalty lambda * norm(P_MT_total - DA_plan.P_MT(k:k15), 1);注意这里用的是1-范数绝对值之和而不是2-范数。原因是1-范数配合线性规划求解器不容易产生数值病态而且惩罚力度对偏差大小是线性增加的物理含义明确2-范数更平滑但会把模型变成二次规划求解速度略有下降。对复现来说1-范数完全够用。5. 算例设计与结果解读两时间尺度的价值怎么体现5.1 仿真参数设定为了验证多时间尺度调度的效果我设置了一个对比算例。虚拟电厂容量配置如下光伏装机800kW、风电装机600kW、储能500kW/2000kWh、微型燃气轮机1MW、峰值负荷1.5MW。电价采用典型分时电价峰时10:00-12:00、18:00-22:000.8元/kWh平时0.5元/kWh谷时23:00-6:000.25元/kWh。为了模拟真实运行我在日内仿真时给真实风电、光伏出力加了随机扰动——预测曲线与真实曲线之间偏差最大达到20%以此检验日内调度的校正效果。5.2 关键结果分析跑完模型后我关心的指标有四类总运行成本、弃风弃光率、功率平衡偏差、储能SOC品质。结果对比如下指标仅日前调度日前日内调度总运行成本元/日1845016230弃风弃光率%8.32.1最大功率平衡偏差kW21035平均SOC偏离设定值%5.21.1从表里可以看到加了日内滚动校正后总成本降低了约12%原因很简单日前调度在出现预测偏差后不做任何调整系统只能靠最贵的手段比如临时购电或者紧急切负荷来保住平衡成本自然高有了日内调度预测偏差可以在15分钟尺度内被及时消化用相对便宜的MT爬坡和储能充放电来填缺口整体经济性就上来了。5.3 出力曲线的节奏感从结果曲线里还能看到一个非常有意思的现象储能设备的充放电行为在这两个时间尺度下呈现明显不同的节奏。日前调度里储能基本上是一天两充两放的大周期策略夜间谷价充电、早高峰放电、午间光伏大发时再次充电、晚高峰再次放电。这个策略是全局经济最优的因为它看到了全天的电价结构。而日内调度里储能在15分钟尺度上会有很多小额微调动作比如某时段风电瞬时飙高储能立刻加大充电功率0.3MW持续两个时段随后又减回来。这些微调虽然单次电量很小但是积少成多最终把功率平衡偏差从210kW压到了35kW。从复现SCI论文的角度说这种大计划小修正的出力曲线形态本身就很有说服力——审稿人看到这种结果会认同你的模型确实抓住了多时间尺度调度的本质。5.4 输出结果怎么呈现Matlab里可视化建议做成三个图图1日前计划总出力曲线和负荷曲线叠在一起直观展示功率平衡。图2日内实际出力曲线叠加上日前计划曲线旁边标注两者差值偏差带。图3储能SOC曲线在日前和日内两套结果里分别画看SOC轨迹的差异。这三个图放出来整个故事就讲完了。绘图直接用plot和stairs就足够在不追求配色花哨的前提下清晰比好看重要。表格导出用writetable方便整理成论文数据。6. 复现过程中最容易翻车的五个细节6.1 求解器安装和YALMIP配置的坑我见过最多的人卡在YALMIP装好了但gurobi调用不了这一步。记住一个关键点Gurobi不是装一个Matlab接口就行你下载的Gurobi版本必须和Matlab版本、操作系统位数完全匹配并且在gurobi_setup后还要把Gurobi的bin目录加到系统环境变量PATH里。如果在YALMIP里调用gurobi失败在Matlab命令行输入yalmiptest看一下诊断信息九成是mex文件加载失败或者许可证没有配置。6.2 MILP求解太慢的时候怎么处理如果你的模型包含大量0-1变量比如上百台机组、数百个时段MILP直接跑几个小时不出结果很正常。这时候不要急着换机器先从模型简化上下手把时间分辨率从15分钟改成1小时日前调度本身不需要15分钟分辨率把可以合并的资源聚合同类型储能合并成一台把不必要的整数变量松弛掉。有些0-1变量其实可以转成连续变量只要约束矩阵满足某种单模态性质这一点在储能同时充放电约束里经常被利用。6.3 无可行解的排查思路跑优化模型最怕遇到infeasible problem。排查思路按顺序执行先用optimize(constraints, objective, sdpsettings(verbose, 2))输出YALMIP的诊断信息找到冲突的约束编号再把目标函数改成常数0只验证可行性最后逐个放宽约束先放SOC边界再放功率平衡再放爬坡看问题出在哪一层。6.4 数据驱动和模型驱动的边界要拎清有些复现者会试图把神经网络预测和物理优化模型混在一起做出一个端到端的东西。我个人的劝告是第一阶段复现严格让预测模块和优化模块解耦。预测结果以文件形式传递给优化模块优化模块不关心预测是怎么来的。等你把优化这一侧完全跑稳了再回头考虑用更高级的预测方法去提升输入质量。否则预测一个小bug和优化一个小bug叠加在一起整个系统根本无法调试。6.5 SOC初值对日内调度的影响日内调度跑了24小时滚动仿真每个15分钟步长都有可能把SOC带偏。如果不做修正跑一天下来储能SOC的实际轨迹和日前计划的偏差会持续累积到最后几个时段可能出现无电可放的窘境。解决方法是在日内目标函数里加SOC回引项——让SOC尽量贴近日前计划的SOC曲线。这个回引项和日前计划偏差惩罚是两回事不要混在一起。我用的是二次惩罚系数让SOC在约束允许范围内尽量靠近日前计划轨迹实测效果很好。7. 把模型从1.0推进到2.0下一步可以玩什么这套框架跑通之后往上扩展的空间非常大。如果你想让自己的复现项目更有深度下面这几个方向我亲测性价比很高。第一把确定性等价换成场景随机规划。在日前调度里用拉丁超立方抽样生成50200个风电光伏场景目标函数变成期望成本用场景树的形式建模。YALMIP处理这类问题的速度尚可代码改动量在三五百行左右但结果的说服力会强一个档次。第二引入碳交易成本。现在很多VPP相关论文都在考虑碳排放配额和碳交易价格。只需要在目标函数里加一项碳成本并给MT加上单位碳排放系数约束条件加一个总碳排放量上限或者配额约束。改动量不大但主题切合热点。第三把配网潮流约束加进来。这需要用到大的潮流矩阵涉及灵敏度系数代码复杂度和求解难度都会显著上升。如果你想复现顶刊里那种带网络拓扑的VPP调度建议先把本文的机制版本跑通再逐步加网络层。第四日内调度结合实时电价。日内调度的电价可以换成15分钟级的实时市场电价信号在滚动优化里加入对实时电价的响应这会让模型更贴近未来电力现货市场环境。每次迭代只改一个模块跑通后再动下一个这是我做代码复现类工作一贯的原则。这样能保证每个模块的改动都有可解释的结果变化不会出现改了一堆东西最后连结果为什么变好都说不清的尴尬局面。最后归根结底虚拟电厂多时间尺度调度这件事本质上是在预测的不确定性和决策的时效性之间找平衡。日前调度给出的是方向感日内调度提供的是精确度。用Matlab复现完整流程难点从来不在某一个模型有多复杂而在于两套时间尺度的数据、状态、约束怎么干净地衔接在一起。我在这套代码上调试的时间至少有一半花在了数据对齐和状态传递上模型本身倒是很快写完的。如果在你自己复现的过程中也在这两个地方犯了迷糊别慌回头重新理一遍数据流把日前输出什么、日内输入什么、状态在哪里交接这三件事画清楚问题基本就能解决一半。
返回列表