资讯动态

考虑需求侧响应的智慧楼宇多时间尺度调度策略与Matlab实现

发布时间:2026/10/16 11:01:00 来源:尧图企业网站定制
我是做建筑能源调度这一块的平时和不少团队聊下来发现大家都在同一个问题上卡壳楼宇侧的分布式光伏、储能、空调负荷、充电桩这些资源其实都很灵活但真要让它们参与电网互动或者单纯想降低楼宇电费只做一个“当天预测、当天优化”的单时间尺度调度根本不够用。预测误差、设备响应延迟、突发负荷变化任何一个环节没处理好调度方案就是废纸。所以我这次分享的项目就是围绕“考虑需求侧响应的智慧楼宇多时间尺度调度策略”完整搭了一套Matlab实现把日前调度、日内非滚动调度、日内滚动调度、实时修正四个层级串起来让楼宇能跟着电网信号和自身状态一步一步调整用能计划。这套东西适合谁如果你是做园区能源管理、微电网优化、建筑节能改造的工程师或者正在研究需求侧响应的学生哪怕你只关心怎么用Matlab把复杂的调度模型跑起来这篇内容都可以给你直接参考。我会把模型怎么建、代码怎么组织、求解器怎么配、结果怎么看全部拆开讲包括我踩过的坑。1. 问题拆解与多时间尺度调度思路1.1 为什么智慧楼宇需要多时间尺度调度先说一个最基本的事实楼宇不是单个设备它是多种柔性资源拼在一起的小型能源系统。光伏出力受天气影响分钟级就能波动十几个百分点空调和照明负荷跟着人员活动走工作日早上九点和下午三点差出一大截储能电池的SOC变化还有充放电效率、寿命约束。如果只用一个提前24小时做出的静态计划去执行那么面对实际运行时各种偏差这个计划几乎必然跑偏。我先画个场景给你感受一下。某栋办公楼早晨预测晴天、光伏满发日前方案安排午间多给储能充电。可实际上午十点来了一片云光伏出力骤降但是楼宇的空调负荷没降因为会议室人坐满了。这时候如果还按原来的计划从电网买电、给储能充电电费会非常高甚至可能碰到变压器容量越限。所以必须在日内、实时层面重新调整。多时间尺度调度的核心逻辑就是“粗粒度做规划、细粒度做修正”。日前调度拿到的是24小时的预测数据决定全天总体的购电曲线、储能充放电框架、需求响应参与时段日内调度拿到的是未来几小时更精确的预测数据在日前计划的基础上修订实时修正则针对分钟级波动只做局部、快速的调整。每一层的时间尺度不同、目标不同、约束不同但最终目标一致让楼宇在满足舒适度的前提下运行成本最低、响应信号执行到位。1.2 四层时间尺度各自职责与衔接这套策略包含四个时间尺度你千万别把它们理解成四个独立的程序它们是一环扣一环的。日前调度时间颗粒度一般是1小时优化范围为未来24小时。它要解决的是“明天大致怎么运行”的问题。输入是预测的室外温度、光照强度、基础负荷曲线、电价参数、需求响应邀约信号。输出是全天逐时的设备运行计划比如储能每个小时充/放电功率、空调温度设定值、可中断负荷的启停安排。日前调度用的预测数据误差较大所以策略上要留有余量不能把储能SOC卡到极限。日内非滚动调度可以把预测范围缩短到未来4~6小时时间颗粒度15分钟。所谓“非滚动”是指每次优化都从当前时刻开始覆盖未来一个固定的时间窗算完后执行这个窗内的调度指令但到下一个调度周期重新算命没用完的窗不延续。这种方式的好处是求解规模小、速度快适合在日内电网发布新的需求响应信号或者光伏短时预测大幅修正时重新优化。日内滚动调度和非滚动的区别在于优化窗口是“滑动的”。比如每15分钟触发一次优化但优化范围始终延伸到未来4小时当前时刻窗口右端也在右移。每次优化只执行下一步的指令其余部分的计划仅作参考。这样做能持续利用最新预测数据所以对负荷和光伏波动的适应性更好代价是求解频率高对代码效率和求解器要求更高。实时修正时间颗粒度可以到5分钟甚至1分钟。它不做全局优化而是在指令跟踪的框架下修正偏差。比如实际负荷比预测高了200kW储能和空调要如何微调去抵消这200kW这是个很典型的“反馈控制”或“模型预测控制底层”的问题。这四层之间的衔接很讲究。日前调度给日内调度一个“基准计划”和允许调整的边界日内滚动给实时层一个可执行的目标点和爬坡速率实时层则把实际执行结果反馈回上一层作为下一轮滚动修正的初始状态。如果每一层都只盯着自己的局部目标最后系统整体性能不会好。所以我在代码里把各层之间的状态接口统一管理这是整个项目最重要的架构设计。1.3 需求侧响应如何在各时间尺度落地需求侧响应不是简单“砍负荷”。它分为价格型和激励型。价格型就是分时电价、实时电价楼宇看到电价高就主动少用、低电价多充激励型是电网或聚合商在特定时段发出削减负荷邀约参与且达标了给补贴。标题里强调“考虑需求侧响应”所以调度模型必须显式包含需求响应带来的成本/收益项以及削减量约束。在我这套策略里需求响应是这样嵌入时间尺度的日前层电网给出明天的基线负荷和削减邀约时段、补贴单价。优化模型需要决策是否参与、每个邀约时段削减多少同时把削减后的负荷曲线作为后续所有优化的基准。日内层如果邀约时段临近电网允许修正削减量模型会根据最新负荷预测重新决策避免过度削减影响舒适度。实时层一旦确认参与削减实时修正就要确保实际功率不超过日内容确定的上限。如果实际负荷超了优先调整储能放电其次上调空调设定温度最后才考虑切可中断负荷。需求响应约束必须小心处理。很多初学者直接把削减量当成决策变量乘以补贴单价放进目标函数却忘了基线负荷是“不参与响应时的预测负荷”而基线本身也在变化。更稳妥的做法是分两条负荷曲线建模一条是不参与DR的设备自然功率另一条是实际调度后的功率两者之差就是削减量但这个差值有上下限和爬坡约束。我在代码里用了一个变量表示实际购电功率再将基线负荷预先计算好用辅助变量表示削减量做完线性化就不会报错。2. 调度模型构建与Matlab实现要点2.1 楼宇负荷建模光伏、储能、空调、柔性负荷模型要落地首先得把每种设备的数学模型写清楚。我用的是Matlab YALMIP这个组合在科研和工程验证里非常常见代码写起来接近数学表达式调试起来也比纯手写矩阵方便。光伏模型采用简化的出力计算用预测的辐照度和温度乘上额定容量再考虑一个效率系数。不需要做特别复杂的物理模型因为多时间尺度调度关注的是优化决策而不是光伏I-V曲线。代码里直接读预测序列P_pv_forecast即可。储能电池最基础也最容易写错。我这里用的模型是两状态变量SOC随时间更新充电功率和放电功率各为一个非负决策变量两者不能同时大于0用二进制变量隔离。效率上充电用收益效率放电用放点效率同时要满足SOC上下限、充放电功率上下限、每个调度周期首末SOC一致性。提醒一句日前调度如果要求24小时SOC首末相等会导致储能到晚上必须放空结束这不一定经济我看到很多文献这么写但实际项目里更应关注用户设定的“次日初始SOC目标”不一定强制末时段等于初始值。空调负荷这部分我用了等效热参数模型。把房间或楼宇整体等效成一个热容热阻回路室内温度变化由室外温度、得热、制冷功率决定。公式大概是C * dT_in/dt (T_out - T_in)/R Q_gain - P_c * COP离散化后变成一条差分约束。调度变量是空调功率或制冷量室内温度作为状态变量约束在舒适度区间内。要注意时间尺度不同离散步长不同模型参数并不完全一样。日前层可以用1小时间隔的近似的参数日内层用15分钟间隔更精确的参数实时层再用更快的动态校正项。这个“多速率模型”处理是项目里比较关键的点后续章节我会用一个表格说明。柔性负荷包括可转移负荷比如洗衣机、消毒柜可以在时段内平移和可中断负荷比如非重要插座电源可以削减掉一部分。可转移负荷建模需要整数变量表示启动时间用约束保证工作必须连续进行若干时段可中断负荷则只需给一个削减量上限。2.2 日前调度模型目标函数与约束全解析日前调度模型是一个混合整数线性规划MILP。目标函数我定义为全天的总运行成本最小包含以下项从电网购电的费用sum(C_grid(t) * P_grid_buy(t))其中电价是已知序列。需求响应收益的负值-sum(DR_price(t) * P_dr_cut(t))DR_price是削减单位功率的补贴。储能充放电造成的电池损耗成本这个往往被人忽略一般用lambda * (P_ch P_dis)等效值否则储能会被过度使用。柔性负荷调整的舒适度惩罚项如果允许温度设定值偏移要在目标函数里加一个很小的惩罚系数防止模型为了省电把空调温度调到极端而不切实际。约束至少有这几组功率平衡约束P_pv P_grid_buy P_dis P_base_load P_ac P_ch P_other P_dr_cut这里左边是无需求响应的供给右边是实际需求。注意需求响应的削减量在功率平衡里应该怎么放。我的处理是把削减前的自然负荷记为P_load_raw实际调度后购买功率满足总负荷再减去削减量即P_pv P_grid_buy P_dis P_load_raw - P_dr_cut P_ac P_ch这样更直观。储能运行约束SOC递推、功率上限、充放电互斥。空调热动态约束室内温度落在舒适区间。与电网交互约束购电功率上限避免超过变压器容量。需求响应约束削减量上下限以及削减时段的0-1参与标志。求解日前调度我用optimproblem还是yalmp都行但YALMIP的optimize用起来更快配合求解器推荐Gurobi或Cplex。没商业求解器的话可以用默认的linprog但遇到0-1变量就没办法所以我建议想办法装一个能求解MILP的求解器。如果实在没有某些求解器有免费社区版或者用intlinprog也能凑合。我在项目里用的是Gurobi300多个变量跑下来几十毫秒。2.3 日内滚动与日内非滚动调度的区别和实现日内非滚动调度和滚动调度的模型结构其实一模一样区别在于怎么调用求解器以及怎么管理时间窗。非滚动调度的流程设当前时刻为t预测范围为[t, t H]这里H4小时16个15分钟时段。求解这个窗口内的优化模型得到所有决策变量序列。只执行第一个时段t到t15min的指令到了下一个调度触发时间t15min重新用最新数据优化新的窗口[t15min, t15minH]。如果两次优化之间有电网下发的临时DR事件则把它作为新的输入塞进去。滚动调度流程同样每个周期触发一次但需要维护一个“计划池”。假设预测范围固定为未来4小时当窗口右移15分钟优化起点还是当前时刻终点是当前时刻4小时所以每次解出的窗口长度不变。上一轮求解得到的未来指令可以用来做参考但当前轮只需执行最新计划的第一个指令。要注意滚动优化里预测数据的更新频率和窗口长度要和滚动周期匹配否则会出现“求解时间过长导致执行时间到了”的尴尬情况。这两者最大的差异在于非滚动调度每一次优化都是“独立局部求优”不会参考上一轮计划所以如果预测变化平缓非滚动效果也够用滚动调度因为每次窗口重叠天然带有连续性不容易出现相邻时段计划跳变的现象。实际项目中如果楼宇参与需求响应时段较长我建议用滚动调度否则电价断崖时非滚动解容易出现充电/放电跳变。实现时有一个共通的坑滚动窗口的边界条件。比如窗口右端储能SOC没有给定终值模型为了让成本最小很可能在窗口末尾把电池放到最低。所以我们必须在滚动层加入“终端代价”或“终端SOC约束”。我的做法是在目标函数里加一个对窗口末SOC偏离当前计划值来自日前层的惩罚项。这样既不会破坏MILP线性性又能让滚动解平滑衔接。2.4 实时修正策略模型预测控制与反馈校正实时修正我实现的是MPC模型预测控制的简化版本。以5分钟为控制周期预测未来30分钟的局面6步优化目标是最小化实际购电功率跟踪日内计划购电功率的偏差同时尽量维持室内温度在舒适区间内并满足储能功率限制。实时层和日内层的区别在于日内层的决策变量包括许多在实时内无法快速变化的量比如可转移负荷的启动时刻我们只能把它当成已知量实时层控制的只有储能充放电功率修正量、空调功率修正量、以及可能的部分可中断负荷。目标函数通常写成min sum( w1 * (P_grid_actual - P_grid_ref)^2 w2 * (T_in - T_set)^2 w3 * delta_P_storage^2 )但需要注意YALMIP里二次函数处理起来慢一点实时性要求高时我会把它线性化成绝对值形式min sum( w1 * abs(P_grid_actual - P_grid_ref) w2 * abs(T_in - T_set) w3 * abs(delta_P) )再用辅助变量进行线性化。实时修正的效果用一句话概括它解决不了“过大的预测偏差”但能解决“普通扰动下的跟踪”。如果光伏出力偏差超过30%以上实时层再怎么调储能也很吃力这时候需要上层日内调度重新出方案。所以各层判断自己“管不管得住”很重要我在代码中加入了一个偏差检测模块如果实时修正的控制量达到边界仍无法跟踪就触发上层重新调度请求。这在实际工程项目里就是“事件触发滚动优化”比固定周期滚动更高效。3. 完整代码架构与核心模块实现3.1 数据准备与参数设置我用一个initParams.m脚本集中管理所有参数。这样调参时不用翻到每个数学模型里找。数据方面我准备了一个历史数据文件building_data.mat包含室外温度序列15分钟间隔覆盖3天光照强度序列基础负荷不含空调的插座、照明、电梯等序列实时电价序列需求响应邀约信息时段、最大削减量、削减补贴单价初始化时要注意单位统一。我在代码里所有功率都用kW时间间隔用小时电费用元。储能SOC用0~1小数。价格序列如果单位是元/kWh用的时候直接乘时间间隔。3.2 决策变量与目标函数核心代码以日前调度为例我建的决策变量向量长度为 N*N_var_per_step其中N是24个时段。典型代码如下省略业务无关细节% 决策变量定义 P_grid_buy sdpvar(N, 1); % 购电功率 P_ch sdpvar(N, 1); % 储能充电 P_dis sdpvar(N, 1); % 储能放电 SOC sdpvar(N, 1); % 荷电状态 P_ac sdpvar(N, 1); % 空调制冷功率 T_in sdpvar(N, 1); % 室内温度 P_dr sdpvar(N, 1); % 需求响应削减量 u_ch binvar(N, 1); % 充电状态0-1 u_dis binvar(N, 1); % 放电状态0-1 u_dr binvar(N, 1); % 是否参与DR目标函数就是一系列求和注意yalmip里expression写法objective ... sum(C_grid .* P_grid_buy) * dt ... - sum(DR_price .* P_dr) * dt ... sum(lambda_bat .* (P_ch P_dis)) * dt ... sum(lambda_temp .* abs(T_in - T_set_ref)) * dt; optimize(constraints, objective, sdpsettings(solver, gurobi));DR价格里对不在DR时段的时段价格直接写成0这样模型不会因为补贴为正而故意削减负荷。3.3 约束条件构建从物理设备到线性化处理功率平衡约束我写成等式但要小心实际运行时等式会过强。我习惯加一个小松弛变量比如constraints [constraints, ... P_pv P_grid_buy P_dis P_load_raw - P_dr P_ac P_ch slack];松弛变量slack只在约束不可行时非零目标函数里给它一个很大的惩罚系数。这样既能保证模型不因数据问题崩掉又能诊断是不是某时段约束矛盾。储能约束代码示例for k 1:N-1 constraints [constraints, SOC(k1) SOC(k) (eta_ch*P_ch(k) - P_dis(k)/eta_dis)*dt/Cap]; end constraints [constraints, ... P_ch P_ch_max * u_ch, ... P_dis P_dis_max * u_dis, ... u_ch u_dis 1, ... SOC_min SOC SOC_max, ... P_ch 0, P_dis 0];空调热动态约束离散化时注意系数单位。用热阻RK/kW、热容CkWh/K则差分方程C * (T_in(k1) - T_in(k))/dt (T_out(k) - T_in(k))/R Q_gain - P_ac(k)*COP整理成线性等式约束。这里的Q_gain包括设备得热和人员得热通常也作为预测输入。需求侧响应约束则需要DR标志变量和削减量上下限P_dr P_dr_max .* u_dr; P_dr P_dr_min .* u_dr; % 参与即至少削减多少 P_dr P_load_raw(k) * 0.9; % 不能超过基线负荷的90%3.4 日内滚动与非滚动调度实现框架我写了两个函数runDayAhead.m、runIntradayRolling.m。滚动函数的核心调用方式如下function [log] runIntradayRolling(params, dayAheadPlan) horizon 4 / params.dt_short; % 4小时预测15分钟步长16步 for k 0:totalSteps-horizon % 提取当前时刻的预测数据窗口为 k1 : khorizon windowData params.predict{k1}; % 将日前计划的窗口末端作为终端惩罚参考 terminalRef dayAheadPlan.SOC(khorizon1); % 求解优化模型 [plan_k] solveWindow(windowData, terminalRef, params); % 只执行第一个时段记录 log.P_grid(k1) plan_k.P_grid(1); % 到下一个滚动周期继续 end end这个框架里最容易出问题的是时间同步。比如预测数据是15分钟分辨率但是实时修正步长是5分钟那么滚动调度输出的第一个15分钟指令要被拆成3个5分钟参考值。我写了一个插值模块用斜坡信号把功率指令细化不至于出现突跳。3.5 实时修正模块与求解器配置实时修正控制我用mpcController.m。核心是把预测模型转换成状态空间形式然后在线求解。YALMIP可以直接对状态空间约束求解省却了手动推导状态转移矩阵的麻烦。控制周期Ts5min优化步数N_mpc6也就是预测未来30分钟。function [action] mpcController(state, ref, params) % state: 当前SOC、室内温度、实际光伏、实际负荷 % ref: 日内滚动给出的购电功率计划 u_ess sdpvar(6, 1); % 储能功率修正量 u_ac sdpvar(6, 1); % 空调功率修正量 x_soc sdpvar(7, 1); % 预测SOC轨迹 x_temp sdpvar(7, 1); % 预测温度轨迹 % 状态递推约束 % 目标跟踪ref购电功率小幅修正储能空调同时保证温度和SOC不越限 objective sum(abs(params.alpha * (P_grid_pred - ref))) ... sum(abs(params.beta * (x_temp(2:end) - params.T_set))) ... sum(abs(params.gamma * u_ess)); optimize(constraints, objective, params.options); action.ess value(u_ess(1)); action.ac value(u_ac(1)); end因为实时预测模型更简化所以实时MPC里的储能效率、热容参数可以比日内粗一些重点是速度快。Gurobi求解一个线性MPC问题大概几毫秒到十几毫秒实现5分钟周期控制绰绰有余。4. 典型场景仿真结果与分析4.1 场景设置说明为了验证这套策略我模拟了一个中等规模商业楼宇峰值负荷约850kW光伏装机300kW储能容量500kWh最大充放电功率200kW空调负荷峰值约250kW。分时电价采用峰谷平三段式峰时1.2元/kWh、平时0.8元/kWh、谷时0.4元/kWh。需求响应邀约设置在某日14:00-15:00最大削减量150kW补贴0.6元/kWh。对比方案是三组方案A仅日前调度日内不做任何调整实时不修正。方案B日前 日内非滚动调度4小时窗15分钟周期无重叠。方案C日前 日内滚动调度4小时滑动窗15分钟滚动周期 实时修正。为了模拟不确定性我在光伏预测上加入了均值为0、标准差为10%的正态噪声负荷预测加了5%的噪声。4.2 日前调度结果分析日前调度得到的总购电成本最低但它是在“完美预测”假设下得到的最优值实际执行时由于预测偏差成本大概率会偏离。典型结果是峰时电价时段储能放电、空调负荷被压到舒适度下限谷时充电。需求响应时段内日前计划削减了120kW也就是说它决定参与DR但没削减到150kW上限因为为了削减更多必须把空调温度再上调而舒适度惩罚抵消了补贴收益。这个结果很符合直觉。一个成熟的需求侧响应策略不会为了拿补贴把楼内温度调到28℃以上除非补贴单价非常可观。所以目标函数里舒适度惩罚项的权重很重要我设的是温度偏离1℃惩罚约等于0.5元/kWh实际情况要根据用户对舒适度的容忍度重新标定。4.3 日内滚动调度 vs 日内非滚动调度对比先看非滚动调度。因为每次优化只覆盖未来4小时并且不参考上一次结果某次优化会发现在窗口末尾电价较高时选择不充电到下个窗口初始又发现电价较低于是出现SOC计划“台阶式”突变。实际控制时储能不能在几分钟内从满功率充电切到满功率放电所以这种跳变在物理上不可能。因此非滚动在预测噪声较大时稳定性偏差。滚动调度则明显平滑得多。它每一次优化都从当前SOC出发并且上一轮的末端SOC目标传给了这一轮作为终端惩罚所以SOC曲线是渐变的。我把两种方案在相同噪声下跑了一天滚动方案的电费比非滚动方案低3%左右并且储能充放电次数少了近一半。这个结果说明如果楼宇只有一台储能、切除柔性负荷能力有限滚动调度的稳定性和电池寿命友好度都更好。4.4 实时修正效果分析实时修正主要看功率跟踪误差。在没有实时修正时实际购电功率与日内计划购电功率最大偏差接近90kW偏差主要来自光伏预测误差。启用实时修正后最大偏差被压到25kW以内平均值偏差小于10kW。储能SOC在修正过程中虽然会比计划多循环一点点但因为MPC目标里带了abs(u_ess)的惩罚它不会剧烈反应而是选择连续小幅调整。我特别测了一种情况某5分钟时段光伏突然跌了120kW且储能已经满充无法再充电MPC发现无法通过储能修正自动检测到控制量越界触发一次滚动调度请求。日内滚动层重新优化后把空调功率增加了一截并将可中断负荷削减了20kW解决了跟踪不了的问题。所以这套多时间尺度策略真正的价值在于上层解决“够不够”的问题下层解决“准不准”的问题中间有事件触发机制兜底。5. 常见问题与排查技巧实录5.1 求解不收敛或不可行多半是约束打架我遇到最多的问题就是YALMIP报“Infeasible problem”。十次里有八次是储能末状态约束太紧或者某时段功率平衡里负荷高估加光伏低估导致所需购电功率超过上限。排查方法很简单把约束分块注释掉先解不带终端SOC约束的模型看功率平衡是否可行再把终端SOC约束加上看差多少。另外加一个松弛变量能快速定位哪条等式不可行我习惯叫它slack_grid最终解出来后看哪几个时段松弛变量特别大就直接知道是那个时段供需矛盾。5.2 滚动窗口边界SOC怎么处理才能不跳变滚动调度如果不做终端惩罚窗口末尾储能大概率会被放到最低因为在该窗口内末尾充电的“效益”体现不出来模型只顾着把电省下来。我的做法是给窗口末端SOC加一个以日前计划SOC为参考的弱约束abs(SOC_end - SOC_ref) 0.05但要注意约束太紧可能不可行。更好的做法是在目标函数加惩罚而不是硬约束。我就是用sdpvar定义绝对值惩罚项权重别太大否则滚动层变成完全追着日前跑失去日内修正的灵活性。我调试下来权重设置为单位SOC偏差惩罚约等于0.1倍的最大峰谷电价差比较合适。5.3 需求响应削减量总是边界解如何合理化如果你在结果里发现削减量要么为0要么达到上限说明缺少中间约束。现实里削减负荷往往有分层成本断开某一层照明成本低调整空调成本高关闭部分电梯成本更高。应该把可削减资源分类建模每类有不同成本和上限目标函数里包含成本项模型自然会在不同类型间权衡。我在代码里用了三个削减变量类别P_dr_l1、P_dr_l2、P_dr_l3分别对应照明、空调、电梯成本递增上限不同。这样做出来的DR削减曲线就不会是“全有或全无”。5.4 实时MPC控制频率低或者延迟大怎么优化实时控制对求解时间要求高如果用了整数变量就很容易超时。我的建议是实时层完全避免0-1变量。储能不能同时充放但功率偏差不大时“同时充放”通常不会发生即使发生了也是因为求解器需要实际控制里直接丢弃其中一个即可。我把充放电互斥约束在实时MPC里去掉只保留状态递推求解速度从50ms降到5ms。带来的风险是理论解可能出现极小范围的充放并存但这个量级在实际功率指令执行时被低通滤波器滤掉了影响可忽略。另一个优化是预测模型的线性化误差。实时MPC用线性差分模型室内温度动态大步长下偏差大。我把预测步长降为5分钟同时滚动窗口只取6步也就是30分钟不让模型外推太远。更远处的扰动偏差通过每周期滚动更新自然校正。这套“短窗口高频滚动”的组合在工程上非常实用。5.5 代码层面要注意的性能陷阱单看一个MILP求解并不慢但如果做24小时日内滚动每15分钟一次、每次16个时段、每次包含数十个二进制变量一天下来144次求解速度不可忽视。我做了三处优化所有预测数据提前用向量化方式生成不在循环里重复读excel全部预载入。YALMIP建模时用repmat构建重复约束避免写慢速for循环。虽然代码可读性差一点但大幅提速。求解器选项里关闭日志输出gurobi.OutputFlag, 0只保留错误信息。实际跑下来日内滚动全天求解总耗时从十几分钟降到40秒左右这对需要反复调参的仿真很关键。6. 写在最后的几个实际体会这套多时间尺度调度策略我从模型设计到代码实现花了不少精力最有感触的一点是不要迷信“调度精度无限提高”。所有时间尺度都是因为不同物理过程的时间常数不同而存在的你不能指望一台MPC解决所有问题。日前决定战略日内做战术修正实时做动作微调这种分层控制思想在任何复杂能源系统中都适用不止是楼宇微电网、园区综合能源、工厂用能都能套用这套框架。另外Matlab YALMIP 的方案很适合做研究和原型验证但如果要落地到真正工程系统我建议把模型改用Python或者C重新实现并接上实时数据库和通信协议。Matlab的优势在于快速验证算法、对比不同方案这一步省了后面很大的试错成本。我见过一些人一上来就写硬编码的部署程序模型改一次要重写几十行这种在需要频繁迭代的科研阶段很不划算。最后再分享一个细节需求侧响应的基线负荷计算不同市场规则差异很大有的用“日前预测法”有的用“前几日平均法”。如果你在做真实项目一定先确认清楚规则再建模否则后面结算会出大问题。我的项目里基线和削减量的定义是相对灵活的可以通过参数配置切换计算方式这一点建议你保留。

读完文章,也想定制专属网站?

尧图设计师 24 小时内与您沟通定制方案

免费获取报价 →
↑