ARTICLE DETAIL

资讯详情

深耕网站视觉设计与运营推广的一线实战洞察。

含共享储能的园区多类型负荷需求响应经济运行Matlab建模

含共享储能的园区多类型负荷需求响应经济运行Matlab建模 刚做完一个含共享储能的园区多类型负荷需求响应经济运行项目顺手把整个建模过程和Matlab实现思路整理了一遍。这个方向最近确实火——园区里既有光伏、又有储能还有一堆性质完全不同的负荷如何在满足生产生活需求的前提下把电费压到最低本质上是一个典型的日前优化调度问题而共享储能的加入又让这个问题的复杂度和实用价值同时上了一个台阶。如果你正在做综合能源、微电网或者园区级能量管理的课题或者手上正好有类似的Matlab仿真需求这篇文章应该能帮你少走不少弯路。整个项目的核心可以概括成一句话在一个有分布式光伏、外部电网、共享储能和多种可调节负荷的园区场景下用需求响应手段调整用电曲线通过数学优化求出一天24小时里每种设备、每类负荷的最优运行方案让系统总运行成本最低。听起来不复杂但真正动手做的时候光是共享储能怎么建模多类型负荷怎么统一描述需求响应补偿成本怎么定这几个问题就够折腾一阵子。下面我把整个项目的思路、模型、代码实现和调试经验完整过一遍。1. 这个课题到底在做什么园区、共享储能与需求响应1.1 为什么园区是需求响应的最佳试验场园区级场景这几年在学术界和工程界都特别受关注原因很简单它处在单栋建筑和大型工业用户之间的黄金位置。单栋建筑负荷太小储能和光伏装上去经济性不明显大型工业用户虽然负荷潜力大但生产工艺约束极其严格需求响应一旦影响产线损失可能远超电费收益。园区则不一样里面通常有办公楼、车间、实验室、充电桩、中央空调等多种负荷配电边界清晰有统一的物业管理或能源管理部门非常适合做集中优化调度。从数据角度看园区负荷曲线往往呈现出白天高、夜间低的典型形态同时光伏出力也在白天两者叠加之后会出现明显的净负荷峰谷。如果不做任何调节园区必须按照峰值负荷向电网报装容量还要在高峰时段支付高昂电费。引入需求响应之后柔性负荷可以在电价高峰时段主动压低用电可转移负荷可以挪到夜间低谷再开工充电桩可以错峰充电再加上储能削峰填谷整个园区的用电曲线会被抹平不少容量费用和电量费用都能降下来。做这个方向的人不管你是做毕业设计、发小论文还是接工程落地项目本质上都在解决同一个问题把不确定的用能行为和确定的优化目标拧在一起求出一个可执行、可解释的调度方案。园区这个载体足够复杂又足够可控所以特别适合作为研究场景。1.2 共享储能与传统储能有什么本质区别传统园区储能是自建自用模式园区自己掏钱买电池、装逆变器、做运维储能系统只为这一个园区服务。这种模式最大的问题有两个第一是初始投资高1000kWh左右的锂电储能系统加上PCS、BMS和施工动辄几百万很多园区根本算不过来账第二是利用率低如果园区夜间负荷很小储能充满电之后只能闲着设备折旧却一天没停。共享储能的核心思路是一个电池包服务多个用户。放在园区内部共享储能可以理解为园区里有A、B、C三栋楼或三家企业大家一起出资租用或共建一套储能储能系统在运行的时候统一调度充放电功率和容量按照各用户的需求动态分配。某栋楼白天生产任务重、电价又高储能就多放点电给它另一栋楼夜间有加班负荷光伏又没出力储能就在低谷电价时段充电然后夜间放给它。这样一来储能的总利用小时数远超单用户自建模式单位电量的储能成本明显下降。从建模角度看共享储能和传统储能的区别在于多了一层分配维度。传统储能只需要决策充放电功率和SOC共享储能还需要决策每一时刻储能给每个用户的电量分配比例。这听起来只是多了几个变量但会导致约束结构变复杂——各用户分配到的功率之和不能超过储能总功率上限各用户累计占用的容量不能超过储能总容量上限某些情况下还要考虑租赁费用和结算方式。在Matlab里实现的时候我习惯把共享储能建模成一组带下标用户维度的变量再加一组汇总约束这样求解器能直接处理不需要额外的迭代逻辑。1.3 多类型负荷到底多在哪里园区里的负荷绝不是一个数字那么简单。做经济运行研究的时候如果不区分负荷类型直接用一个总负荷曲线参与优化那需求响应根本无从谈起。实际项目中我一般把负荷分成四类第一类是刚性负荷比如消防设备、数据中心核心机柜、医院手术室用电这类负荷在任何时候都不能中断也不能转移在模型里就是给定曲线直接参与功率平衡。第二类是柔性负荷典型的是中央空调、电梯、照明系统它们可以在一定范围内降低功率运行比如空调温度从24度调到26度功率能降下来15%左右对舒适度影响可控这类负荷用可削减比例来建模。第三类是可转移负荷比如工厂里的喷涂线、热处理炉、园区的充电桩生产任务总量固定但开工时间可以整体挪动建模时要保证总用电量守恒。第四类是可中断负荷比方可中断生产线用户允许调度中心在特定时段切除部分负荷但切除的部分不再补回来用电量不守恒且需要支付中断补偿。不同类型负荷的响应速度、响应成本和舒适度损失都不一样这就决定了在优化目标里要给它们设置不同的补偿价格。工业可中断负荷的补偿可能要到0.8元/kWh以上空调柔性调节的成本可能只有0.2元/kWh充电桩错峰转移甚至可以通过电价差自然引导。建模的核心就是把这些差异用数学语言表达清楚让优化算法自己决定该削减谁的负荷、平移谁的负荷、什么时候充放电。负荷类型典型设备调节方式响应成本数学描述方式刚性负荷数据中心、消防不可调节无限大给定曲线柔性负荷中央空调、照明功率下调低可削减比例舒适度约束可转移负荷充电桩、热处理炉时段平移中用电量守恒时段约束可中断负荷部分产线直接切除高0-1状态补偿成本2. 经济运行模型的整体设计与思路拆解2.1 目标函数怎么搭才算完整经济运行优化的目标函数最常见的搭建方式是系统总运行成本最小化。如果只是求购电成本最小那模型非常简单但做出来的方案往往没法落地因为你可能为了让电费最低而让某些负荷完全不敢用、让储能拼命循环实际运行根本不会这样。所以我在项目里把目标函数拆成四个部分第一是购电费用也就是园区从电网买电花的钱用分时电价乘各时段购电量求和。第二是售电收益光伏大发而负荷很低时多余电量可以上网卖钱这部分是负成本方向别搞反。第三是储能运行维护成本可以按充放电电量折算也可以按充放电次数折算简单起见我通常取0.02元/kWh左右的固定系数。第四是需求响应补偿成本包括削减柔性负荷的补偿、转移可转移负荷的人工和效率损失补偿、切除可中断负荷的赔偿。这四部分加起来才是完整的系统运行成本。写目标函数时有几个细节要特别注意。第一单位必须统一购电费用是元、电量是kWh、电价是元/kWh如果时间分辨率不是1小时而是15分钟那么功率乘以电价之后还要再乘0.25这个最容易出错。第二售电收益的系数一般低于购电系数因为上网电价通常只有购电电价的一半左右如果设置不合理优化算法可能利用购售电价差套利结果看起来成本很低实际根本不可能实现。第三需求响应补偿成本不能设置得太低也不能太高太低了优化算法会疯狂削减负荷太高了又完全不舍得调用柔性资源失去需求响应的意义。我习惯把目标函数写成下面这种结构min F sum(price_buy(t) * P_buy(t) * dt) - sum(price_sell(t) * P_sell(t) * dt) sum(c_bess * (P_ch(t) P_dis(t)) * dt) sum(c_cut * P_cut(t) * dt) sum(c_shift * P_shift(t) * dt)这样写的可读性比较好调参的时候直接改系数就行。需要注意如果c_bess、c_cut这些系数和电价不是一个量级优化结果可能会被某个子项主导所以每次改完参数我都要先看一遍成本构成饼图确认各项占比合理。2.2 约束条件中最容易踩坑的三个地方目标函数搭好之后约束条件是真正决定模型质量的地方。我见过很多同学目标函数写得很漂亮但约束一加进去求解器就开始报infeasible或者解出来的方案匪夷所思。根据我的经验有三个约束最容易出问题。第一个是功率平衡约束。园区里所有电源出力之和必须等于所有负荷之和公式本身很简单P_buy(t) P_PV(t) P_dis(t) P_load_base(t) P_ch(t) P_sell(t)但这里要注意P_dis是放电功率相当于电源P_ch是充电功率相当于负荷千万不要把方向写反。还有P_load_base应该是所有刚性负荷和各类可调负荷调节前的总量可调节量需要单独列出来不要重复计入。第二个是储能SOC的初值和末值约束。日常调度中储能一般要求调度周期末的SOC回到初始值附近否则第二天没法继续运行。这个约束可以写成SOC(T1) SOC(1)。但加了这条约束之后优化问题会变得更紧储能必须在一天内完成一个完整的充放循环对容量配置和电价差都提出了要求。如果不加这条约束求解器通常会倾向于在最后一个时段把SOC放空结果虽然当天成本很低但实际运行根本接不上。第三个是可转移负荷的总量守恒约束。可转移负荷只是换个时间用总用电量不能凭空消失或增加所以必须加上sum(P_up) sum(P_down)这种约束。很多初学者会漏掉这条导致优化结果里负荷大量消失——其实就是用能总量少了电费自然降低了但这在物理上是不可能实现的。2.3 需求响应数学建模价格型与激励型该选哪种需求响应在模型里通常分为价格型和激励型两类我在实际项目中做过对比感触很深。价格型需求响应基于分时电价或实时电价用户看到电价高了会自动减少用电把负荷转移到低电价时段。它在模型中通常用需求价格弹性矩阵描述即每个时段的负荷变化量与多个时段的电价变化量线性相关。弹性矩阵模型很容易理解但它有一个麻烦它会引入电价和负荷的乘积项导致目标函数和约束变成非线性的求解起来特别费劲需要做线性化近似或者迭代逼近。激励型需求响应则更直接调度中心和用户签订协议用户承诺在某些时段削减或转移一定量的负荷调度中心支付补偿费用。这种模式在数学上非常好处理削减量和转移量直接作为决策变量补偿成本直接进目标函数整个模型可以保持线性用混合整数线性规划MILP就能求解。我的建议是如果你做的是偏理论的研究想展示电价机制对用户行为的影响可以用价格型弹性矩阵模型配合Matlab的优化工具箱做非线性规划如果你做的是园区实际运行方案、工程落地项目或者偏应用型的论文直接用激励型需求响应模型更稳妥。原因很简单激励型DR的物理意义清晰约束条件容易表达求解效率高而且实际园区签订DR协议时也基本都是激励型模式调度中心直接告诉用户明天下午2点到5点请压减100kW负荷补偿3000元。在Matlab代码里我通常把可削减负荷建模为连续变量把可中断负荷建模为0-1变量把可转移负荷建模为带守恒约束的连续变量这样既贴近实际又不会让模型过于复杂。3. 共享储能的建模细节与容量分配逻辑3.1 储能充放电的数学表达储能模型的核心是三个量充放电功率、SOC和充放电状态。充放电功率直接决定储能量变化快慢SOC表示当前电量占额定容量的比例充放电状态用来防止同一时刻既充电又放电——这在物理上是不允许的但如果你不在模型里加约束求解器为了多此一举赚取某个虚拟收益完全可能给你解出同时充放电的结果。防止同时充放电有几种处理方式。最简单的是用一组二元变量表示状态u(t) ∈ {0,1} P_ch(t) P_ch_max * u(t) P_dis(t) P_dis_max * (1 - u(t))当u(t)1时储能处于可充电状态P_dis被限为0当u(t)0时储能处于可放电状态P_ch被限为0。这个方法最直观也是我推荐在MatlabYalmip里用的方式。还有一种方式是通过目标函数里的成本系数来引导不出现同时充放电比如给同时充放电行为设置一个很大的惩罚项但这种方法不能严格保证满足物理约束只能算一种软处理工程上可以用做研究不建议。SOC动态方程是储能建模里最重要的公式SOC(t1) SOC(t) (η_ch * P_ch(t) - P_dis(t) / η_dis) * dt / E_max这里η_ch和η_dis分别是充电和放电效率通常取0.95左右dt是时间步长E_max是储能额定容量。注意P_ch和P_dis的单位是kWdt单位是h两者相乘得到kWh再除以E_max得到SOC的变化量。很多同学在这个地方忘记乘以dt或者忘记除以E_max导致SOC的变化幅度完全不符合实际。3.2 SOC更新与寿命损耗怎么权衡储能寿命损耗是经济运行研究中一个经常被忽略、但实际很影响结论的因素。你让储能每天做两次完整循环、深充深放电池衰减速度会明显加快折算成钱可能比峰谷套利的收益还高。所以完备的经济运行模型应该把寿命损耗成本也放进去。工程上常用的简化办法是给充放电功率加一个循环成本系数比如每充放1kWh电量产生0.05元的寿命损耗成本直接加进目标函数。这个系数的来源可以根据电池厂商的循环寿命数据估算假设电池循环寿命为5000次总吞吐电量为5000×E_max kWh电池更换成本为1500元/kWh×E_max那么单位吞吐量的寿命损耗就是1500/50000.3元/kWh左右。这只是粗略估算实际还要考虑DOD深度对循环寿命的非线性影响——深度越深寿命衰减越快。如果你想把寿命损耗建模得更精细可以用一个随DOD变化的成本系数但这会让模型变成非线性。我在实际项目里的处理方式是先做一次不考虑寿命损耗的优化观察典型日的充放电深度如果DOD长期超过80%就把寿命成本系数提高重新优化。通过两三轮迭代基本能找到一个兼顾经济性和电池寿命的权重点。这种方法虽然不完美但胜在简单、可解释写论文时也能自圆其说。3.3 共享比例、租金费用与利益分配的处理方式共享储能和普通储能建模最本质的区别在于你需要回答储能给谁用了多少。项目里我用的方法是给每个用户建一套独立的储能变量再加一组共享汇总约束。假设园区里有A、B两个用户共享一套额定容量1000kWh、最大功率500kW的储能。定义每个用户独立的SOC_A(t)和SOC_B(t)独立的充电功率P_ch_A(t)和P_ch_B(t)独立的放电功率P_dis_A(t)和P_dis_B(t)。然后加共享约束P_ch_A(t) P_ch_B(t) P_ch_max P_dis_A(t) P_dis_B(t) P_dis_max SOC_A(t) SOC_B(t) 1 % 总SOC按容量加权不超过100%这样建模的好处是优化算法可以自己决定每个用户何时用储能比如A用户白天电价高峰用电量大储能就多放给AB用户夜间负荷高储能就在白天多充电、夜间放给B。各自独立的SOC也能避免一个用户把储能占满另一个用户没电可用的情况。至于租金费用和利益分配学术研究里常用两种处理方式。一种是运营商视角即以整个园区总成本最小为目标把所有储能成本和收益统一核算最后再按各用户的用电量占比等比例分摊费用这种方式实现最简单。另一种是用户视角即每个用户只优化自己的用电成本共享储能作为公共资源通过价格机制分配这种方式更贴近真实市场但需要迭代求解均衡复杂度明显上升。做课题或者小论文用第一种就够了需要的话可以再加一层事后Shapley值分摊让论文的贡献度分析章节更丰满。4. Matlab代码实现从数学公式到可运行程序4.1 代码整体架构与文件组织Matlab实现这一块我强烈建议不要把所有代码塞在一个文件里。项目写大了以后你会发现数据初始化、模型构建、求解、结果分析混在一起改一个参数要找半天。我习惯把工程拆成几个模块main.m主入口设置全局参数依次调用数据加载、模型构建、求解、结果输出data_load.m加载负荷、光伏、电价等输入数据统一转换成列向量build_model.m定义决策变量写目标函数和约束solve_model.m调用求解器处理求解状态提取结果plot_result.m画图输出关键指标如果你用的是Matlab自带优化工具箱不需要额外安装求解器那build_model里直接用optimvar定义优化变量用optimproblem定义问题。如果你用的是Yalmip——这也是做学术优化调度最主流的工具——那build_model里直接用sdpvar、binvar定义变量写目标和约束的时候非常接近数学表达式写完以后用optimize一行求解可以无缝切换Gurobi、Cplex这些商用求解器。我自己的开发环境是Matlab R2022b加Yalmip最新版求解器用GurobiT24时段的共享储能MILP模型一般几秒到十几秒就能收敛到1%以内的gap完全够用。4.2 核心调度代码分段讲解下面我把核心的调度建模代码贴出来这是一个同时包含共享储能、柔性负荷削减、可转移负荷和光伏的简化版本逻辑清晰可以直接跑通后再按自己的场景扩展。%% 参数初始化 T 24; % 调度时段数 dt 1; % 时段长度h E_max 1000; % 储能额定容量kWh P_ch_max 250; % 最大充电功率kW P_dis_max 250; % 最大放电功率kW eta_ch 0.95; % 充电效率 eta_dis 0.95; % 放电效率 SOC_min 0.1; SOC_max 0.9; SOC_init 0.5; % 分时购电价元/kWh假设4个时段类型 price_buy [0.35*ones(1,7), 0.85*ones(1,5), 1.2*ones(1,2), ... 0.85*ones(1,4), 1.2*ones(1,3), 0.55*ones(1,3)]; price_sell 0.4 * price_buy; % 上网电价 % 负荷和光伏示意数据实际从data_load读入 P_load_base [800 780 750 720 700 710 750 850 950 1050 1100 1150 ... 1180 1200 1150 1080 1000 950 900 860 840 820 810 800]; P_pv [0 0 0 0 0 20 80 200 350 480 550 580 ... 560 500 420 300 180 80 10 0 0 0 0 0]; c_cut 0.6; % 柔性负荷削减补偿元/kWh c_shift 0.1; % 可转移负荷调整补偿元/kWh c_bess 0.02; % 储能运维成本元/kWh %% 决策变量 P_ch sdpvar(1, T); % 储能充电功率 P_dis sdpvar(1, T); % 储能放电功率 u binvar(1, T); % 充放电状态1为充0为放 SOC sdpvar(1, T1); % 储能SOC P_buy sdpvar(1, T); % 电网购电 P_sell sdpvar(1, T); % 向电网售电 P_cut sdpvar(1, T); % 柔性负荷削减量 P_shift_up sdpvar(1, T); % 可转移负荷增加量 P_shift_down sdpvar(1, T); % 可转移负荷减少量 %% 目标函数 obj sum(price_buy .* P_buy * dt) - sum(price_sell .* P_sell * dt) ... sum(c_bess * (P_ch P_dis) * dt) ... sum(c_cut * P_cut * dt) sum(c_shift * (P_shift_up P_shift_down) * dt); %% 约束条件 C []; % 储能SOC动态 C [C, SOC(1) SOC_init]; C [C, SOC(T1) SOC_init]; % 调度周期末回到初值 for t 1:T C [C, SOC(t1) SOC(t) (eta_ch*P_ch(t) - P_dis(t)/eta_dis) * dt / E_max]; C [C, SOC_min SOC(t1) SOC_max]; C [C, 0 P_ch(t) P_ch_max * u(t)]; C [C, 0 P_dis(t) P_dis_max * (1 - u(t))]; end % 功率平衡 for t 1:T C [C, P_buy(t) - P_sell(t) P_pv(t) P_dis(t) - P_ch(t) ... P_load_base(t) - P_cut(t) P_shift_up(t) - P_shift_down(t)]; end % 柔性负荷削减约束 C [C, 0 P_cut 0.15 * P_load_base]; % 削减不超过15% % 可转移负荷守恒与限幅 C [C, sum(P_shift_up) sum(P_shift_down)]; % 总用电量守恒 C [C, 0 P_shift_up 0.2 * P_load_base]; C [C, 0 P_shift_down 0.3 * P_load_base]; %% 求解 ops sdpsettings(solver, gurobi, verbose, 0); diagnosis optimize(C, obj, ops); if diagnosis.problem ~ 0 error(求解失败: %s, yalmiperror(diagnosis.problem)); end %% 结果提取 P_ch_opt value(P_ch); P_dis_opt value(P_dis); P_buy_opt value(P_buy); P_sell_opt value(P_sell); P_cut_opt value(P_cut); P_shift_up_opt value(P_shift_up); P_shift_down_opt value(P_shift_down); SOC_opt value(SOC);这段代码是我做类似项目时的标准框架。有一点需要说明我在功率平衡里把P_cut放在负荷侧含义是削减后的负荷为P_load_base - P_cut把P_shift_up放在右边含义是可转移负荷转入导致园区总负荷增加P_shift_down则是负荷减少。方向要自己理清楚否则求解结果会莫名其妙。代码里用了sdpvar和binvar需要提前安装Yalmip工具箱如果不想装Yalmip也可以用Matlab自带的optimvar和intlinprog替代但表达式写起来会啰嗦不少。4.3 求解器选型与参数调整求解器选型直接决定你的模型能不能在可接受的时间内得到好解。我对比过几款常见求解器的表现求解器类型获取方式适用规模实际体验Gurobi商用学术免费大速度快数值稳定首选Cplex商用学术免费大老牌速度和Gurobi相当intlinprog内置Matlab自带中小简单场景够用大规模偏慢SCIP开源免费中可解MILP速度弱于商用如果你只是做毕设、课程设计用Matlab自带的intlinprog就够了如果是要跑大量算例对比分析建议申请Gurobi学术版配合Yalmip使用非常丝滑。安装完以后用yalmiptest命令可以检查Yalmip是不是正确识别到了Gurobi。求解参数调整方面我一般会设置两个关键参数一个是MIP gap默认是1e-4对于园区调度这种规模的问题设成0.01即1%的优化间隙就够了求解时间可以快好几倍另一个是TimeLimit防止某个算例卡死在那里我的习惯是设600秒超时之后取当前最优可行解做对比实验时尤其重要。还有一个小技巧如果模型求解总是报infeasible可以尝试把约束拆开逐个注释掉再求解定位是哪条约束导致不可行。Matlab的Yalmip有一个check命令求解完后可以逐条检查约束残差我调试的时候经常用它。4.4 结果可视化与指标统计调度结果算出来以后一定要画图。图不仅能让你自己检查结果有没有异常也是论文、报告里的重要内容。我通常画四张图第一张是功率平衡堆叠图横轴为1-24时段纵轴为功率把光伏出力、储能放电、电网购电作为正方向堆叠起来把负荷、储能充电作为负方向画出来这样一眼就能看出系统是否每个时段都平衡。第二张是储能SOC曲线和充放电功率画在同一张图里、左右双纵轴可以直观看到储能低谷充电、高峰放电、SOC平滑过渡的效果。第三张是需求响应前后负荷曲线对比图蓝色为原始负荷曲线红色为响应后的等效负荷曲线这两条线之间的面积差就是需求响应的总调节量评审专家很喜欢看这张图。第四张是电价和购电功率的对照图能直观反映园区是否在低电价时段多购电、高电价时段少购电。指标统计方面至少需要计算总购电成本、总售电收益、储能运维成本、需求响应补偿成本、峰谷差降低比例、储能日均循环次数、各类负荷响应电量占比。这些指标我一般汇总成一个表格输出到Excel或者直接在命令行打印方便对比不同方案。5. 实际调试中遇到的高频问题与排查实录5.1 求解结果不收敛或求解时间过长这个是我被问得最多的问题也是自己做项目时反复踩的坑。症状通常是求解器日志刷了半天gap一直在10%以上下不来或者干脆在TimeLimit内找不到可行解。最直接的原因往往是整数变量太多了。可中断负荷的0-1状态变量、储能的充放电状态变量、可转移负荷的启停变量这些一多MILP的搜索空间呈指数增长。排查思路可以按下面几步走。第一步先看LP松弛解也就是把整数变量全部放宽为连续变量求解一次如果LP松弛解都不可行那肯定是约束写错了跟整数无关。第二步把时间分辨率从1小时改成2小时T从24变成12看看问题规模降下来之后能不能求解如果可以说明是规模问题而不是模型问题。第三步检查有没有不必要的整数变量比如储能充放电状态可以用放电功率P_dis和充电功率P_ch的互补约束简化但要注意替代方案是否真的能保证物理意义。实际项目里我把可转移负荷的建模从每小时都能自由转移改成按三个固定时间窗整体转移整数变量减少了一半求解时间从几分钟降到了十几秒效果显著。5.2 配置数据单位混乱导致结果离谱有一类问题特别隐蔽就是你跑出来的成本数值大得离谱比如一天电费要几个亿或者SOC曲线一会儿跳满一会儿跌到零。这种问题十有八九是单位或者量纲出了问题。我说一个自己的真实经历有次我把电价单位用成了元/MWh而负荷是kW结果目标函数里每个时段的费用计算值差了1000倍整个经济性分析全部作废。从那以后我在写目标函数之前都会先手工抽一个时段做一遍量纲核算确认kW × h × 元/kWh 元这个链条是通的。还有一个常见问题是SOC直接用绝对值kWh而不是比例0-1导致SOC约束写成了SOC_min SOC(t) SOC_max这些数字完全对不上。我的建议是统一用比例值建模即SOC范围是0到1储能容量E_max单独放一边计算SOC变化量时再除E_max这样不容易出错。另外要特别注意dt如果T9615分钟分辨率dt就是0.25很多人在SOC动态方程里忘了乘dt导致储能一小时内充了4倍的电量结果自然离谱。5.3 需求响应参数过激导致负荷曲线倒挂需求响应参数设置不当会出现一个很有意思的倒挂现象优化算法为了省钱把大量可转移负荷堆到深夜某个低电价时段结果那个时段的负荷比原来的晚高峰还要高形成一个新峰。这在数学上是合理的——因为那个时段电价确实低——但在实际场景中根本不可行变压器容量、配电线路都可能过载而且生产任务集中到深夜也不现实。解决办法就是在模型里加约束限制调节后的等效负荷不能超过原始负荷最大值或者给每个时段设置一个负荷上限。更实用的是对可转移负荷设置单时段最大转移比例和转移窗口限制比如只允许在早上8点到晚上10点之间转移不允许挪到凌晨。我做园区项目时可转移负荷比例一般控制在原负荷的20%到30%之间超过这个范围优化结果虽然电费很低但可执行性很差调度员是不会采纳的。5.4 共享储能与多主体利益分配的矛盾共享储能建好以后如果能降低整个园区的总成本按理说应该皆大欢喜。但实际算完账你可能会发现整体成本确实降了12%但其中某个用户因为它的负荷特性和储能共享方式成本只降了3%甚至比不共享时还高。这种情况下即便系统整体最优该用户也会反对这个方案。解决这个问题有两条路线。一条是在优化模型里加入个体理性约束也就是要求每个用户共享后的成本不高于其单独优化时的成本但这条约束会让模型变得非常紧有时甚至找不到可行解。另一条是先用整体优化算出总成本再用合作博弈里的Shapley值方法进行成本分摊。Shapley值能保证每个用户分摊的成本不超过其边际贡献数学上公平性有保证但计算复杂度较高用户数量多的时候不容易实现。我个人的建议是做学术研究可以用Shapley值展示分配机制的合理性做工程落地更实际的办法是先整体优化再按各用户净负荷占比或储能使用量占比进行简单分摊简单透明用户更容易接受。6. 项目后续还能怎么扩展做完一版能跑通的模型之后别急着收工。这个课题可以扩展的方向其实非常多我这里列举几个已经有很多人在做的思路供你参考。第一个方向是从确定性优化扩展到不确定性优化。光伏出力和负荷预测不可能完全准确实际运行时会发现调度方案和实际运行有偏差。你可以用场景法生成多个光伏出力场景或者用鲁棒优化描述最坏情况把确定性MILP扩展成随机规划或鲁棒优化模型。扩展之后代码的核心框架不用变把参数从确定性值改成场景和概率权重就行。第二个方向是引入碳排放约束或碳交易机制。现在很多园区都被要求控制碳排放经济运行不再只看钱还要看碳。可以在目标函数里增加碳成本项或者在约束里增加碳排放上限这能让论文的政策视野更完整也更容易结合当下的双碳热点。第三个方向是日内滚动优化。把日前调度改为每15分钟或1小时滚动一次每次都根据最新的光伏和负荷预测结果重新求解未来4小时的调度方案形成模型预测控制的闭环。这个方向工程价值很高做出来以后可以直接对接实际的园区能量管理系统。第四个方向是多园区互联。单个园区的共享储能毕竟容量有限如果多个相邻园区通过共享线路互联储能资源和负荷资源可以在更大范围内共享削峰填谷的效果会更好。当然模型复杂度会上升需要处理多主体、多线路的约束但这正好也是当前研究的热点。这些扩展方向不需要从零开始都是在已有模型上做增量修改。我的建议是先把基础版本的模型吃透跑出几组可靠的对比结果再挑一个方向做深化。这样整个项目的层次感会好很多不管是写论文还是做答辩都更有底气。最后再分享一个个人心得。做这类优化调度项目最容易陷入的误区就是追求模型越来越复杂却忽略了结果的可解释性。模型写得太复杂求解出的最优方案如果连你自己都解释不了每个时段为什么这样调度那评审专家或者现场调度员更不会接受。我在实际项目中吃过这个亏后来学聪明了先用一个简单的模型跑通全流程确定成本结构和结果量级合理再逐步加入共享储能、可转移负荷这些复杂模块每加一个模块就对比一次结果差异确保每个模块的贡献都是可解释的。这个方法推荐给你能省掉大量反复排查的精力。
返回列表