资讯详情

资讯详情

储能容量衰减下的虚拟电厂多时间尺度调度建模与Matlab复现

我接触过不少做虚拟电厂调度方向的课题掐指一算真正把储能容量衰减这个因素认真建模并纳入多时间尺度调度框架的研究并不算多。很多复现版本为了省事把储能当成一个“恒定效率、恒定容量、随便充放”的理想设备跑出来的结果看起来风平浪静可一旦放到工程现场储能老化带来的实际可用容量缩水会让整套调度方案直接失效。这篇博文围绕“在考虑储能系统容量衰减的同时整合发电与多用户负荷的灵活性”这一核心思路把多时间尺度调度的骨架、储能衰减的建模细节、灵活性资源的数学表达以及Matlab代码的复现路径完整拆解一遍。这篇内容适合三类人准备复现顶刊算法作为毕设或小论文基础的在校研究者正在搭虚拟电厂仿真平台、需要把储能衰减写进调度模型的工程师以及想理解多时间尺度调度为什么比单层优化更贴近实际运行的读者。我会尽量用“能跑通、能改参、能出图”的标准来写每一步都说明背后的取舍逻辑而不是丢一堆公式让大家自己猜。1. 多时间尺度调度到底补上了什么短板储能衰减与灵活性整合的动机1.1 为什么储能容量衰减会让常规调度方案失真储能电池在虚拟电厂里的角色很微妙它既是削峰填谷的执行器又是平抑风光波动的缓冲器还是为系统提供备用容量的安全垫。但在绝大多数常规调度模型中储能被近似成一个理想化容器容量固定、内阻不变、循环寿命无限。这种假设在单个时间断面上误差不大可一旦运行周期拉长到月、季度乃至年衰减的累积效应就会暴露出来。锂离子电池的容量衰减主要来自两个层面一是循环过程中活性锂离子的持续损耗二是电极材料和电解液界面的副反应。工程上最直观的表现就是同样的充放电倍率下电池每完成一次深度循环可用的最大容量都会轻微下降。当累计循环次数达到某个阈值时容量会明显滑落到初值的80%甚至更低。对调度决策而言这意味着同一个SOC指令在电池生命周期的早期和晚期对应着完全不同的可用能量和功率支撑能力。如果不把衰减写进模型优化器会在电池“身体状况良好”时安排的充放电策略放到电池中后期就会因为实际容量不足而出现功率缺口严重时会导致负荷削减或弃风弃光。多时间尺度调度的核心动机之一就是把这种“越用越少”的约束动态化。日前尺度安排储能充放电计划时要考虑当前寿命状态和预期的循环损耗日内滚动时根据实际运行轨迹修正对剩余容量的估计实时调整阶段则根据最新的SOC和健康状态做出最后的功率平衡动作。三个时间尺度共享同一个衰减模型才能保证决策链条的一致性。1.2 多时间尺度不是“三层各自优化”而是预测精度和决策时域的耦合风光出力和用户负荷的预测误差随时间尺度变化非常明显提前24小时的中期预测误差可能在20%左右提前4小时的短期预测误差能减小到10%以内提前15分钟的超短期预测误差则通常更小。多时间尺度调度的本质逻辑是把不确定性的“包袱”拆散到不同决策阶段去背。日前阶段承担的是最重的结构性决策哪些机组开机、储能充放电的基准曲线大致怎么安排、可平移负荷安排在哪个时段。这一层不需要精确到分钟级别因为此时预测误差还很大做得再精细也是自欺欺人。日内阶段拿到更新后的预测数据把日前计划的偏差通过储能的重新安排、可中断负荷的调用以及机组出力调整来修正。实时阶段则处理残差由储能快速响应和可调节负荷兜底。这三层的关系不是简单的“上级下指令、下级执行”而是通过滚动优化框架形成闭环。日前计划给日内提供初始状态和边界参考日内优化结果回传给日前层作为约束松弛的依据实时的实际运行数据又反过来更新储能健康状态和社会负荷基线。这个信息流设计是整个算例能否复现出理想结果的关键。1.3 多用户负荷灵活性被很多复现版本低估的“软资源”标题里特意强调“多用户负荷的灵活性”这在实际建模里往往比发电侧灵活性更容易被忽略。发电侧灵活性相对集中、特性清晰而负荷侧分散在不同用户手里响应速度、可调幅度和舒适度约束千差万别聚合起来非常麻烦。多用户负荷灵活性可以从两个维度理解。第一是时间维度有些负荷可以整体平移时段比如工业电解槽、洗衣房有些只能削减功率但不能转移时间比如空调、照明还有些是刚性负荷必须随时满足比如医院手术室设备。第二是价格和激励维度用户愿意为了电价优惠调整用电行为但每个用户的可调度容量和舒适度容忍度不同。把这些差异用数学语言表达出来就是一个个可平移区间、可削减比例和响应意愿系数。把负荷灵活性与储能调度放在同一个优化框架里能产生明显的互补效应。储能的优势是响应快、调节能力强缺点是成本高、有衰减损耗负荷灵活性的优势是分布广、边际成本低缺点是用户行为不确定。日前调度中可以把一部分可平移负荷挪到风光出力高峰减轻储能压力日内场景下让可中断负荷承担秒级到分钟级的短时功率缺额避免储能频繁深度充放导致寿命损耗。这个“源网荷储”协同的整合效果正是这类论文的核心贡献点。2. 储能容量衰减建模从“恒定容量”到“老化感知”的数学转化2.1 衰减模型的两种常用档次经验公式与半经验机理在虚拟电厂的调度优化框架里储能衰减模型要兼顾精度和可求解性完全意义上的电化学机理模型比如基于SEI膜生长、锂离子浓度分布的PDE模型是不现实的因为优化求解器无法处理这样复杂的内嵌非线性动态。实际复现中一般用两类模型。第一类是经验循环寿命模型基于电池厂家提供的循环寿命数据拟合。典型形式是单次循环的容量衰减率与当前放电深度呈指数正相关累计衰减量等于循环次数乘上单次衰减。这种模型结构简单很容易通过分段线性化嵌入混合整数线性规划是顶刊论文里最常见的选择。第二类是半经验老化模型在经验公式基础上引入温度、充放电倍率、SOC区间的影响因子。比如某些文献用到的Arrhenius形式的温度修正项以及电流倍率对衰减速率的幂律修正。这类模型精度更高但非线性更强一般需要引入辅助变量和线性近似来处理。对复现而言我建议先从第一类入手。原因很简单论文图表里展示的调度结果能否复现很大程度上取决于储能约束的数学表达是否与原文一致。经验模型的参数少、形式直观且多数顶刊附录里会给出具体的衰减系数取值比对起来方便。半经验模型更适合在跑通基础版之后作为扩展实验来做。2.2 放电深度与循环寿命的耦合关系如何进入约束储能循环寿命与放电深度的关系是一条典型的非线性下降曲线放电深度10%时电池可以循环上万次放电深度80%时循环寿命可能只有两三千次。调度优化器如果忽略这一点就会倾向于让储能每次都深度充放——因为深度充放能最大化利用储能容量、减少向电网购电的成本。但长期来看这会让电池迅速老化更换成本反而远超省下的电费。在数学表达上这条关系曲线通常用幂函数或对数函数拟合。以简化模型为例设电池在第t个调度时段完成了从SOC_start到SOC_end的充放电过程对应的放电深度DOD可以用SOC跨度的绝对值来描述循环次数按相同DOD归算为等效应力次数。容量衰减则通过一个线性或分段线性的增量函数累加进下一个调度周期的容量上限。这里有个关键细节调度周期内储能可能处于连续小幅充放状态直接用相邻两个时刻的SOC差值来估算DOD会造成误差。稳妥的做法是把连续充放电过程按“从峰值到谷值”的完整周期进行切分再计算等效循环次数。在Matlab实现里可以用一个状态机记录SOC曲线上的极值点把不规则的充放序列转换为一组等效应力循环再去匹配循环寿命曲线。2.3 衰减如何影响目标函数和可行性边界把衰减写进模型之后至少有三个地方会发生变化。首先是储能容量边界不再是常数。每个调度周期开始时当前可用容量等于额定容量乘以健康状态系数健康状态系数随累计等效循环次数下降。如果某天储能承担了大量深度循环第二天规划时容量上限就要相应调低这会直接影响日前计划里储能在晚高峰的可用电量。其次是目标函数里要加入老化成本项。老化成本的经典计算思路是将当前寿命状态下的剩余总循环次数对应的总价值分摊到每一次循环上得到单次循环成本再乘以本次调度的等效循环次数。这一项进入目标函数后优化器就会在“多用储能省钱”和“省着用储能避免老化”之间自动权衡。最后是约束的耦合性。衰减模型让储能系统的当前状态依赖于历史运行轨迹这本质上是一个带记忆的动态系统。在多时间尺度框架下日前、日内、实时三个层级的优化器必须共享同一套健康状态记录否则会出现日内层以为储能状态很好、实际容量却已经因前几轮深度调度而缩水的错位。从复现角度看这几处改动并不需要重构整个优化模型只需要在储能模块的约束生成函数里增加状态变量和对应的参数更新逻辑。很多代码框架里储能约束是独立封装的新增衰减逻辑的改动范围就能控制得很小。3. 三层调度框架的代码骨架日前预安排、日内滚动校正、实时闭环调整3.1 日前调度模块最重的结构化决策日前调度在整个三层框架里占据“定基调”的位置。它的决策变量包括各机组未来24小时的启停和出力计划、储能充放电基准功率曲线、可平移负荷的搬移后时段安排、可削减负荷的削减比例以及向外部电网的购售电计划。时间分辨率常用1小时决策时域为24个时段。在Matlab中日前模块的核心结构是一个带24个时段的优化问题。目标函数包含火电机组煤耗成本、启停成本、储能运行与老化成本、负荷响应补偿成本、购售电费用以及弃风弃光惩罚。约束条件包括功率平衡、机组爬坡、储能SOC动态、容量衰减等式、负荷平移前后总电量守恒、可削减负荷的比例上下限以及联络线功率约束。这个阶段最需要注意的是负荷平移的“电量守恒”逻辑。可平移负荷不是凭空消失的电量而是某个用户在某时段用电需求整体搬到另一个时段。所以建模时通常引入一个整数变量表示平移后的新开始时段再通过一个时间窗内的等式约束保证总用电量不变。这个约束写错优化结果里就会出现电量凭空多出来或消失的违背物理规律现象。3.2 日内滚动模块用更新预测修正日前偏差日内滚动调度的核心是“模型预测控制”思想。每隔一定时间间隔比如1小时或4小时基于最新的短期预测数据重新求解一次未来4到8小时的优化问题并把第一个时段的决策下发给执行层。每次滚动求解时SOC的初始值来自实际运行反馈而不是日前计划的理论值。日内模块的目标函数在日前结构基础上增加了偏差惩罚项。因为日前计划已经安排了机组组合和用户负荷协议日内阶段不宜大范围推翻这些决定否则会带来频繁调节成本和用户不满。一般的处理方式是允许储能充放电功率和机组出力在日前计划附近波动但每个单位偏差都要付出代价偏差越大惩罚越高。在代码实现层面滚动优化需要处理好几个状态传递问题。第一个是日前计划中某些变量是整数变量比如机组启停、负荷是否平移进入日内阶段后默认继承日前结果不再重新优化只对连续量做修正。第二个是每次滚动求解的时段数缩短后终端的边界条件要处理得当避免优化器因为“看不到远期”而做出短视的大功率动作。常见的处理办法是在终端加一个SOC目标范围约束把跨时段电量衔接问题交给下一轮滚动去解决。3.3 实时调整模块秒级到分钟级的响应与不平衡处理实时调整在整个时间尺度层级中时间颗粒度最细一般是5分钟或15分钟一个决策点。它的主要任务是消化超短期预测仍然存在的误差以及应对突发性的负荷变动。由于时间窗口短这个阶段的可调资源范围也相应收窄机组爬坡来不及大幅变化可平移负荷几乎无法参与储能的快速功率响应和可削减负荷成为主力。实时模块的目标函数最简单核心就是最小化时段内的不平衡功率同时考虑储能和可削减负荷的调节成本。如果结算规则考虑了实时电价那么目标函数里还会包含实时市场购售电费用。复现时要注意实时阶段尽量不要重新求解一个完整优化问题因为5分钟的决策窗口对求解速度有要求。更符合工程习惯的做法是用查表或规则策略做基础分配只有当预测误差超过阈值时才触发一次小规模的优化求解或者求解一个极小规模的线性规划变量只覆盖储能功率和可削减负荷调整量。4. 多用户灵活性资源建模与源网荷储协同的逻辑4.1 负荷分类与灵活性参数的数学表达多用户负荷建模的第一个动作是分类。按照响应特性我习惯把负荷分成四类刚性负荷、可平移负荷、可削减负荷、可转移且可削减的复合灵活负荷。刚性负荷的功率在任何时段都必须即时匹配在模型里就是一个固定的预测序列不参与任何优化。可平移负荷需要指定持续时间和允许平移的时间窗比如某工厂的大型设备每天需连续运行3小时允许在9:00到17:00之间任意安排但一旦开启就不能中断。可削减负荷允许在特定时段内削减一定比例功率但每个时段削减量不能超过用户设定的舒适度上限同时全天累计削减电量也不能超过协议值。对每个用户还要定义一个响应意愿系数用来反映其价格敏感性。这在目标函数里体现为响应补偿成本的权重差异有些用户给一定补偿就愿意参与调节有些用户则需要很高的激励才愿意让出用电弹性。模型里可以把这一系数与削减量相乘构成一个分段的线性补偿费用。4.2 时间尺度与负荷资源的分层匹配策略不同类型的负荷在三个时间尺度上的可调度性完全不同。日前阶段最适合安排可平移负荷因为提前一天通知用户对生活生产影响较小用户配合度高。日内阶段以可削减负荷为主因为预测偏差出现后需要调节的功率量级和持续时间已经相对明确削减几十分钟的空调负荷比较可行。实时阶段则主要依赖快速响应的可中断负荷比如工业辅助设备、部分照明负荷响应速度要求在分钟级以内。这个分层匹配策略在建模时通过“约束的时域边界”来实现。比如可平移负荷的决策变量只在日前模块中出现日内和实时模块直接继承日前安排的搬移结果可削减负荷的削减比例在日内模块允许调整但实时模块只能在一个更小的带宽内微调。这种约束边界的设计既符合用户的真实响应能力也避免了优化器在短时间尺度里使用现实中不可能实现的灵活性资源。4.3 源网荷储协同的耦合约束灵活性互补的具体表现源网荷储协同并不只是一个概念口号在代码层面它表现为一组跨资源类型的耦合约束。最典型的耦合约束出现在“能量平衡备用约束”里。系统备用需求可以看作一个总量约束而备用来源可以多样化火电机组的旋转备用、储能的上备用容量、可削减负荷的备用响应容量。把不同来源的备用单位成本做成目标函数里的系数之后优化器自然会根据经济性选择用哪种资源提供备用。储能深度充放会导致老化成本上升时可削减负荷就会在备用供给中占据更大比例反之当负荷响应补偿成本偏高时储能就会承担更多调节任务。另一个耦合点是“爬坡协调”。风光出力的骤升骤降会对系统爬坡能力形成冲击火电机组爬坡慢储能爬坡快但容量有限可削减负荷本质上可以看作一个“负功率快速下调”的资源。多时间尺度模型把这三类资源的爬坡特性和调节成本放在统一坐标系下比较得出最优的组合策略。复现这类耦合约束时我建议先把约束拆解为“每类资源的独立约束”和“跨资源的关联约束”两部分。独立约束写到各自资源模块里关联约束放在主程序里的约束拼接部分。这样后期调整时不会因为改一个资源的边界而牵动整个模型。5. Matlab代码复现的整体架构从数据生成到结果可视化的完整链路5.1 代码模块划分与调用流程一个可复现的Matlab代码工程至少应该包含数据准备、场景生成、日前优化、日内滚动、实时调整、结果可视化六个独立模块外加一个主控制脚本串联流程。我在复现时通常这样组织文件结构主脚本负责设置总模拟天数、调度时间尺度、滚动窗口长度等顶层参数然后顺序调用各模块。数据准备模块读取或生成风电、光伏、负荷的预测序列和误差分布。场景生成模块通过蒙特卡洛抽样得到若干组场景用于模拟预测不确定性。日前优化模块核心是一个构造求解模型的函数输入预测数据输出24时段的决策计划。日内滚动模块在给定日前计划后按固定周期循环求解。实时调整模块在每个决策点根据最新的误差修正功率指令。这样的分层结构带来一个直接好处每个模块可以被单独调试。我把整条流水线跑通之前会先把日前优化函数单独拎出来用一组固定数据测试它能否在几秒内收敛、SOC轨迹是否满足等式约束。确认单模块无误后再联调查错效率会高很多。5.2 目标函数和约束条件的YALMIP编码要点YALMIP是Matlab里构建优化模型最顺手的工具之一尤其是处理混合整数线性规划和二次约束问题时。虚拟电厂调度模型里含有整数变量机组启停、负荷搬移时段选择和连续变量功率、SOC、容量状态等模型天然是一个混合整数规划问题。用YALMIP编码时有几个容易踩的坑。第一个是SOC动态约束的时间索引写法。SOC(t1) SOC(t) eta_c * Pch(t) * dt - Pdis(t) / eta_d * dt 这条等式如果写成矩阵形式需要特别注意充电和放电不能同时为正。通过添加二进制变量或者使用互补约束来限制否则求解器可能给出“一边充电一边放电”的荒谬结果。第二个是衰减模型的非线性项处理。容量衰减与当前健康状态和DOD的关系如果直接写进约束会遇到非线性表达式导致求解器报错。实用的做法是提前在模型外计算好一组DOD-衰减率的参数表通过sos2或分段线性函数把非线性关系线性化再以线性约束形式塞进模型。第三个是求解器选项设置。CPLEX和Gurobi在求解混合整数规划时性能差异不大但参数微调影响很大。我习惯把MIP gap设置为0.5%到1%不要为了追求完美最优解把求解时间拖到分钟级。调度场景下的近最优解完全够用且滚动优化每轮都从头求解时间预算非常宝贵。5.3 场景生成与不确定性处理的方法选择场景生成的质量直接影响多时间尺度调度结果的说服力。常用的方法是基于预测误差的历史数据拟合分布然后用蒙特卡洛抽样生成多条风电、光伏和负荷场景。抽样时要注意时间和空间相关性相邻时段的风速误差不是独立同分布而是存在时间滞后相关性不同位置的多个风电场之间也有关联性。忽略了相关性场景就会过于分散导致优化结果偏向保守。简单而有效的做法是使用场景树加场景削减技术。先生成一大批初始场景然后通过距离度量合并相似场景保留有代表性的若干条。这样既保留了不确定性分布的主要特征又避免了求解规模爆炸式增长。Matlab中可以用现有的场景削减工具包或者自己写一个基于概率距离的迭代合并函数实现成本很低。5.4 结果指标与图表呈现如何证明模型有效复现结果能不能支撑论文结论关键看几个指标系统总运行成本、弃风弃光率、储能健康状态变化轨迹、负荷响应参与度以及各时间尺度下的功率不平衡量。把衰减模型参与前后对比观察总成本和储能寿命损耗值的变化。一个合理的结果是储能老化成本计入后调度方案中储能的循环次数明显减少总运行成本小幅上升但全生命周期成本反而下降。可视化方面我常用的图包括三时间尺度联合的功率平衡堆叠图、SOC与容量衰减双纵轴图、可平移负荷搬移前后对照图以及各调度层级的成本分布饼图。这些图不要只画最优场景应该挑选典型场景比如高风光渗透日、负荷尖峰日、阴雨无风日各画一组展示调度策略的鲁棒性。6. 复现过程中的高频踩坑点与调参经验6.1 电池健康状态与调度时间步长不匹配这是我在复现中最先遇到的坑。如果衰减模型是基于“每次完整循环”来计算容量损失但调度时间步长是15分钟那么一个跨多个时段的充放电过程怎么折算成等效循环次数就成了头疼的问题。有些人直接把SOC变化量除以2当作半次循环但这对部分充放电情况误差很大尤其是在SOC在一个时段内反复振荡的场景下。我的处理办法是在储能模块里增加一个状态累积器。每当SOC曲线经过一个完整的上升沿和下降沿就提取这次摆动幅度作为循环深度更新寿命状态。如果调度周期结束时SOC还处于某个上升/下降中途就把已经累积的部分折半计入。实现不算复杂但能让衰减计算更贴近物理实际结果也更稳定。6.2 日前与日内衔接处出现不可行解三层调度最常出的问题是日内优化在继承日前计划时发现约束冲突。原因往往是日前安排的可削减负荷削减量过大到了日内阶段用户侧实际响应能力达不到或者储能的实际SOC偏离日前理论值较多导致爬坡约束无法满足。排查思路是查“约束来源”而不是只看优化器的报错。先在日内模块里加载日前计划检查边界变量是否越限再检查储能SOC初始值是否与日前末尾时段的SOC衔接最后看可削减负荷的削减量继承逻辑是否写成了“复制所有变量”而不是“复制决策结果”。这类bug通常出在代码的数据传递环节而不是模型本身有问题。6.3 权重系数对平衡结果的敏感度多目标中不同成本项的权重设置会显著改变资源调度偏好。比如老化成本系数设置得过低优化器会毫无节制地用储能导致SOC轨迹在上下限之间反复横跳看起来功率平衡漂亮实际上电池生命周期大幅缩短。系数过高又会走向另一个极端储能基本闲置全部调节压力压给火电和负荷系统的经济性和环保性都变差。调参时不要一次改一个系数后盲跑我习惯先做敏感性扫描固定其它参数单独让某个成本系数在一组离散值之间变化记录总成本和储健康状态的对应关系曲线。找到拐点后就停手拐点附近通常就是比较合理的取值区间。这种方法虽然要跑很多次实验但结果可比性清晰写论文做图表也省力。6.4 结果验证的三个层次复现出来的结果自己都不信很难说服别人。我一般从三个层次做验证。第一层是物理律一致性检查所有时段的功率平衡等式残差应当接近于零SOC曲线应当落在[0,1]区间且首尾衔接成立可平移负荷的总电量在搬移前后应当完全一致。第二层是退化场景对比把衰减模型中的健康状态固定为1多时间尺度框架退化为单层日前调度结果应该和常规模型的输出基本吻合。第三层是边界条件测试设置风光出力为0或负荷翻倍观察优化器是否给出符合直觉的保守调度方案。这三层验证全部通过后我才会认可这版代码的可靠性然后才开始改场景、换数据、做敏感性分析。最后分享一个小经验这类带储能衰减的虚拟电厂调度模型代码实现难度本身不算高真正费时间的是把衰减过程与三个时间尺度的状态传递打通。建议调试时先从“单日、两时间尺度”的简化版开始确认储能衰减逻辑跑通、结果合理之后再逐步扩展到完整的日前-日内-实时滚动框架。这样一步步来出问题的概率会小很多。
觉得有用,分享给同行:

为您的企业打造数字门面

稳重轻奢商务风格,端正雅致视觉,长效耐看不易过时。

立即咨询 →