尧图网络科技YAOTU DIGITAL 获取报价
获取报价
首页 / 资讯中心 / 文章详情

基于MATLAB的储能参与电网调峰优化配置建模与求解

发布时间:2026/9/29 11:29:42

资讯中心
01
ARTICLE

基于MATLAB的储能参与电网调峰优化配置建模与求解

基于MATLAB的储能参与电网调峰优化配置建模与求解
有人递给我一沓负荷曲线和一组电池参数说“用MATLAB做储能参与电网调峰的优化配置”我第一反应不是打开MATLAB而是先问清楚你口中的“配置”到底是指储能装多大还是指储能怎么充放。这个问题不搞清楚后面全白做。电网调峰这个场景核心就是一条日负荷曲线的峰谷矛盾。傍晚负荷飙到1400MW凌晨可能只有700MW传统火电去顶这700MW的峰成本和碳排放都吃不消。储能参与调峰的思路是低谷时把电存起来高峰时放出去把净负荷曲线“削峰填谷”。听上去简单但一旦写成优化模型就会发现“配置”这个词同时指向了两个完全不同的问题一是储能的额定功率、额定能量二是储能在每个时段的充放电功率序列。这篇文章不以教材推导为主而是从实际建模角度把我在类似项目里反复用的一套模型结构、MATLAB求解路径以及踩过坑之后沉淀下来的经验系统地梳理一遍。无论你是刚接触这个方向的学生还是已经在做实际调峰方案的技术人员都应该能直接拿走里面可复用的代码骨架和检查思路。1. 调峰场景下的储能优化先分清容量配置与运行配置1.1 峰谷差到底多大才值得配储能在聊优化模型之前先看物理场景。日负荷曲线的形态通常可以用三个数字描述峰值负荷、谷值负荷、峰谷差。峰谷差占峰值负荷的比例决定了调峰资源的压力等级。如果比例不到10%电网自身的水火电调节能力基本能扛如果到20%以上就需要专门的调峰容量超过30%就必须考虑储能、需求响应这类快速调节手段。在我接触过的实际案例里最常见的峰谷差比例集中在25%到35%之间。比如一条24小时负荷曲线峰值为1400MW谷值为700MW峰谷差是700MW占峰值的一半。这种极端场景下单纯靠火电深度调峰机组的爬坡率大约每分钟只能顶1%到3%的额定功率而且跨过深度调峰线之后发电煤耗会显著升高。储能在这种场景中的价值不是“多发电”而是把高负荷时段的一部分电量平移到低谷来存储再在峰时段释放等效于给电网增加了一块可快速响应的负负荷。这里有一个容易被忽略的点调峰对储能的要求并不仅仅是功率。一个电站如果只有100MW功率、100MWh容量满功率只能放1小时如果晚高峰持续3到4小时这个电池很可能在峰顶还没完全回落时就已经放空。所以储能调峰的真正核心参数是“额定能量与额定功率的比值”也就是时长。配置模型里如果不把时长作为一个可决策变量或者约束条件优化的结果会严重失真。1.2 容量配置与运行调度本质上是两层问题我在项目里最常遇到的一句话是“你给我算算这个园区需要用MATLAB做储能优化配置。”这里“配置”两个字背后至少涉及两类决策变量第一类属于规划层回答“装多少”额定功率 P_nom单位MW决定储能系统最大充放功率额定能量 E_nom单位MWh决定储能系统可容纳的电量时长比 E_nom/P_nom决定系统在额定功率下可持续的时间。第二类属于运行层回答“怎么用”每个时段的充电功率 Pch(t)单位MW每个时段的放电功率 Pdis(t)单位MW由充放电功率决定的荷电状态变化 SOC(t)这两类变量在优化模型里会相互耦合。你不可能在不知道电池能充放多少功率的情况下准确给出充放电曲线也不可能在不评估充放电策略的情况下判断某个容量方案是否经济。所以工程上最后都会把两层问题放进同一个模型里求解外层决定P_nom和E_nom内层决定每天的Pch和Pdis再用目标函数把两者统一成一个整体的优化问题。推荐的做法是先做一个简化模型把两层合并起来评估量级和可行性之后再把容量配置和运行调度解耦做两层迭代。否则模型一次性包含所有变量求解难度会成倍上涨而且出现不收敛时连问题出在哪一层都很难定位。1.3 优化周期怎么取单日、多日还是典型日优化周期是另一个必须在建模前敲定的事情。储能调峰有一个特点电池的SOC不能跨日无限累积也不可能今天高峰期放完明天从0开始因为每时每刻的初始电量都承接前一段时间的结果。因此模型里面的“周期”选择会直接决定解的性质。单日24小时模型最简单但必须强制首尾SOC闭合也就是 SOC(0)SOC(24)。如果不加这个约束优化器会“发现”一个漏洞把初始SOC当作免费能量在高峰时全部放空让结果看起来削峰效果很好但第二天根本没有电可用。这在很多第一次写这个模型的人身上反复出现。多日滚动模型更接近真实运行但复杂度上升。8760小时全年数据的完整优化问题工程上几乎不会直接跑。我常用的折衷方案是基于聚类选几个“典型日”比如工作日、周末、极端高温日各找一两天典型负荷曲线分别做优化再把结果按全年天数加权平均。这样既保住了负荷形态的代表性又让模型规模可控。实际论文里的做法也类似一般用K-means把全年日曲线聚成3到5类每一类单独跑优化。这个思路在落地项目里非常实用。2. 建模前必须敲定的三件事目标、约束和变量尺度2.1 目标函数里要不要放“调峰完成度”很多初学者上来就直接把目标设成“最小化峰谷差”这其实不完全严谨。最小化峰谷差是完全的技术型目标它不考虑电价的峰谷差异也不考虑储能充放电带来的损耗和容量成本。结果通常是只要电池容量足够大峰谷差就能无限趋近于0但经济上完全不成立。真正的工程项目里甲方问你的通常是“配多大的储能能把峰谷差压到某个值以内并且总成本最低”。所以我在这类模型里更偏向把目标函数写成经济目标为主、技术指标为辅的加权形式F λ1 × 调峰效果指标 λ2 × 日购电成本 λ3 × 储能等值成本其中调峰效果指标可以选净负荷曲线的峰谷差或者净负荷偏离平均负荷的程度。权重λ1、λ2、λ3用来表现你更看重哪一头。比如在纯示范项目中甲方会要求“峰谷差必须降30%”这时候调峰权重可以设得非常小甚至把调峰变成一个硬性约束而在常规商业项目中经济权重更高调峰只是尽可能去做不一定必须满足。还有另一种常见做法是直接把“净负荷不超过某个上限”作为约束。例如原始峰值是1400MW甲方要求配完储能后净负荷不得超过1250MW那么模型里加一条不等式约束。这种约束是明确的、可验收的比模糊的权重更有工程意义。2.2 约束条件的完整骨架SOC、功率、互斥与调峰边界模型的主体是约束不是目标。一个储能调峰优化模型最少需要以下四类约束第一类是功率上下限。充电功率和放电功率都不能超过额定功率也不能为负0 ≤ Pch(t) ≤ P_nom0 ≤ Pdis(t) ≤ P_nom第二类是SOC动态方程。这本质上是能量守恒。t时刻的SOC等于上一时刻的SOC加上充入的电量减去放出的电量再除以额定能量SOC(t) SOC(t-1) [η_ch × Pch(t) - Pdis(t)/η_dis] × Δt / E_nom这里有两个容易写反的细节。充电效率η_ch乘在充电功率上放电效率η_dis则要除在放电功率上。原因是电池放出1MWh交流电内部实际上要消耗超过1MWh的化学能量所以从SOC里扣除的电量应该比放电功率对应的电量更大。如果你写成乘法损耗方向就反了结果会偏低估损耗。第三类是SOC上下限以及首尾闭合SOC_min ≤ SOC(t) ≤ SOC_maxSOC(0) SOC(T)SOC通常限制在0.1到0.9之间。完全放到0会缩短电池寿命完全充到100%同样影响寿命。首尾闭合用于保证日循环独立可重复。第四类是调峰边界约束。假设给电网侧的净负荷为L_net(t) L_load(t) - Pdis(t) Pch(t)那么可以加L_net(t) ≤ L_max 峰值限制L_net(t) ≥ L_min 谷值限制这组约束才真正是“调峰”的体现。峰值限制决定了削峰多少谷值限制决定了填谷多少。需要提醒的是谷值约束经常被人遗忘。如果只限峰值优化器会倾向于把低谷时段、电价便宜的电全部充满甚至可能让净负荷进一步往下拉结果是削峰完成了但峰谷差并没有实际缩小反而加剧了谷段压力。2.3 单位、时间步长和数值尺度统一这是我几乎每次审核别人模型时都会发现的问题单位不统一。调峰系统里常见的单位组合有三套功率单位MW、kW、W能量单位MWh、kWh、Wh时间步长小时、分钟、秒。很多电厂提供的负荷曲线功率数据是MW但SOC用的是MWh价格单位是元/MWh。如果你在代码里把功率写成MW能量却写成kWhSOC动态方程的数值就会差1000倍导致约束松弛结果完全不可信。时间步长的问题同样隐晦。如果原始负荷数据是15分钟一个点一天的决策变量就是96个时段Δt0.25小时。SOC方程里充电电量是Pch(t) × Δt如果忘了乘Δt相当于每15分钟就算出了1小时的电量SOC会迅速超出边界模型直接无解。为了避免这种问题我全部统一成“功率用MW能量用MWh时间用小时”并在代码开头用注释明确标出。另一个数值尺度问题是目标函数里各项的数量级。日购电成本可能是几百万量级SOC约束的残差是0.1量级两者混在同一个优化问题里fmincon这类数值求解器很容易因为目标函数太大、约束太“小”而提前宣告收敛实际上结果远未优化到位。解决办法很简单目标函数统一除以10000或者100000让数量级落在1到100之间。这不影响最优决策但对收敛性影响巨大。3. MATLAB求解链路求解器选型、矩阵封装和代码骨架3.1 求解器选型linprog、intlinprog、fmincon 怎么选MATLAB里能用于优化的求解器很多但我在这类调峰问题中真正常用的只有三个linprog、intlinprog、fmincon。选型逻辑完全取决于模型性质。如果额定功率和额定能量都固定也就是只优化一天的充放电功率而SOC方程可以线性展开那么这是一个线性规划问题linprog就够了。此时速度最快结果稳定也不需要担心初值问题。如果要在线性模型里加入“充电和放电不能同时进行”的互斥约束就得引入0-1变量y(t)让方程变成混合整数线性规划。这时使用intlinprog。这个求解器比直接枚举所有组合高效得多而且对于24个时段的规模一般几十秒内能跑完。如果额定功率和额定能量本身也是变量SOC方程里就会出现Pch(t)/E_nom这种非线性项整个问题成为非线性规划。MATLAB内置的fmincon在这种情况下最常用。它的缺点是结果依赖初值无法保证全局最优。因此我通常先用linprog或intlinprog固定几组候选容量算一遍拿到一个靠谱的充放电模式再把这个模式作为fmincon的初值而不是随机给初值。另外在前期方案快速验证阶段我也会用YALMIP工具箱搭模型。YALMIP的建模方式接近数学表达式本身写起来非常快尤其适合验证公式有没有写错。但工程落地时现场往往没有YALMIP环境最后还是要回到MATLAB原生求解器。所以我的建议是原型用YALMIP交付用原生求解器。3.2 一个可落地的fmincon代码骨架下面这段代码是实际模型的主干但不是完整能跑的项目代码。它的作用是展示决策变量排列、目标函数、约束函数的组织方式。%% 储能调峰优化主脚本简化骨架 % 变量排列x [Pch(1..T); Pdis(1..T); SOC(0..T); Pnom; Enom] % 单位功率MW、能量MWh、时间h T 24; dt 1; % 假设负荷曲线与电价已读取 % load [...]; price [...]; lb [zeros(T,1); zeros(T,1); 0.1*ones(T1,1); 20; 60]; ub [400*ones(T,1); 400*ones(T,1); 0.9*ones(T1,1); 300; 900]; % 初始点先用固定容量试探 x0 [40*ones(T,1); 40*ones(T,1); 0.5*ones(T1,1); 100; 300]; options optimoptions(fmincon, ... Algorithm,sqp, ... Display,iter, ... MaxIterations, 2000, ... OptimalityTolerance, 1e-6, ... ConstraintTolerance, 1e-6); [x_opt, fval] fmincon((x) objFun(x, load, price), x0, ... [], [], [], [], lb, ub, (x) consFun(x, load), options);目标函数文件如下function F objFun(x, load, price) T length(load); dt 1; Pch x(1:T); Pdis x(T1:2*T); SOC x(2*T1:3*T1); Pnom x(3*T2); Enom x(3*T3); Lnet load - Pdis Pch; % 权重调峰效果、运行成本、等值容量成本 lambda [0.35; 0.40; 0.25]; F_peak max(Lnet) - min(Lnet); F_cost sum(price .* Lnet * dt); F_cap 330 * Pnom 493 * Enom; % 简化日等值成本 F lambda(1)*F_peak lambda(2)*F_cost lambda(3)*F_cap; F F / 10000; % 数值缩放避免数量级过大 end约束函数文件如下function [c, ceq] consFun(x, load) T length(load); dt 1; eta_ch 0.95; eta_dis 0.95; Pch x(1:T); Pdis x(T1:2*T); SOC x(2*T1:3*T1); Pnom x(3*T2); Enom x(3*T3); % 等式约束SOC动态方程 ceq zeros(T,1); for k 1:T ceq(k) SOC(k1) - SOC(k) ... - (eta_ch*Pch(k) - Pdis(k)/eta_dis) * dt / Enom; end % 不等式约束 Lnet load - Pdis Pch; c1 Pch - Pnom; % 充电功率不超过额定功率 c2 Pdis - Pnom; % 放电功率不超过额定功率 c3 Lnet - 1250; % 净负荷峰值不超过1250MW c4 750 - Lnet; % 净负荷谷值不低于750MW c5 Pch .* Pdis; % 充放电互斥的非线性约束 c6 (Pnom - Enom/2); % 电池时长不低于2小时 c [c1; c2; c3; c4; c5; c6]; end这里有一个值得强调的简化我用了c5 Pch .* Pdis这组非线性约束来做充电和放电互斥。它确实有效但会让fmincon的雅可比矩阵变得复杂。实际项目里如果容量固定且用intlinprog我更倾向于用0-1变量和大M法来写互斥计算更稳定。两种方法的结果需要互相验证不能只信一种。3.3 上机前和上机后的三个一致性检查代码写完后不要急着看结果先做三个快速检查。第一个是能量守恒检查。把最优解代入SOC方程逐时段累加电量看看最终SOC和初始SOC是否一致。如果总有几条残差明显不收敛说明约束写错或者没收敛。第二个是互斥检查。看Pch和Pdis的最优解里有没有同时大于0的时刻。如果Pch*Pdis的数值远远超过求解器允许的精度说明互斥约束被松弛掉了。需要检查约束函数的输入顺序和缩放。第三个是和原始负荷对比。净负荷曲线的峰值是否真的下降谷值是否真的抬高峰谷差是否从700MW降到了预期范围。有时候优化结果确实最优但“最优”方向可能只削减了峰值、没有抬高谷值整个峰谷差变化不大。这时就要回溯目标函数的权重设置。4. 算例一条典型日曲线下的优化结果与参数敏感性4.1 输入数据一条虚构但典型的24小时负荷曲线为了讲清楚结果长什么样我构造一条简化日负荷曲线形状非常接近实际电网的“早高峰、晚高峰、深夜谷”结构。负荷数据如下单位MW% 0:00-23:00 每小时负荷MW load [700,720,750,800,780,760,850,950,1050,1100,1150,1200, ... 1180,1120,1080,1060,1100,1250,1400,1350,1250,1200,1100,900];对应的分时电价单位元/MWh% 0:00-23:00 每小时电价元/MWh price [280,280,280,280,280,280,450,450,520,520,550,550, ... 450,450,450,450,850,850,900,900,900,450,450,450];这条曲线的峰值为1400MW出现在第19时段18:00-19:00谷值为700MW出现在第1时段峰谷差700MW。晚高峰从第18时段持续到第21时段连续4个小时负荷都在1250MW以上。这个形态意味着如果储能时长只有2小时很难单独扛住完整晚高峰。储能参数按常规电化学储能设定充电效率0.95放电效率0.95SOC上下限0.1和0.9日等值容量成本按每MW功率330元、每MWh电量493元计算。这个成本参数是简化的项目里会随电池采购价、循环次数、运维成本上下浮动但量级对思路演示足够。4.2 优化结果净负荷、SOC和峰谷差的变化用上面的参数跑完优化结果非常典型。不装储能时峰谷差700MW日购电成本大约为多少简单按小时累加负荷与电价相乘再求和规模大约是1010万元。这个数值不是重点因为电网侧的购电成本统计口径很多关键是相对变化。装上一套容量约为100MW、400MWh的储能后优化得到的充放电策略大致是凌晨0点到5点利用低谷电价和低负荷充电把SOC从初始值抬到较高位置上午8点到12点适当放电压制早高峰下午18点到21点在晚高峰时段集中放电SOC降到当天低点夜间负荷回落后再补一点电保证SOC回到初始值。结果指标如下表指标优化前优化后净负荷峰值1400 MW1198 MW净负荷谷值700 MW802 MW峰谷差700 MW396 MW峰谷差削减-43.4%这个结果说明100MW/400MWh的储能配置已经可以把峰谷差从700MW压到400MW以内。净负荷峰值降了约200MW谷值抬了约100MW整体曲线明显变平。SOC轨迹也基本符合预期最低点不会低于0.1最高点不超过0.9首尾SOC相等。整个循环中最大放电深度接近80%对电池寿命来说处在可接受范围。如果甲方要求更高的调峰比例比如峰值必须降到1100MW以下那么这套容量就不够了。4.3 P/E比和额定功率的灵敏度为什么不是越大越好为了回答“配置多大最合适”我习惯在同一个算例上做一组灵敏度测试。固定几组不同的额定功率和额定能量分别跑优化观察峰谷差变化和成本变化。测试结果可以用下面的表格概括方案P_nom (MW)E_nom (MWh)优化后峰谷差 (MW)日等值成本简化方案A100200538约92.9万元方案B100400396约127.5万元方案C200400368约157.8万元方案D200600352约184.2万元从表中可以看到一个很明显的规律从方案A到方案B额定能量翻倍峰谷差从538MW降到396MW效果非常显著从方案B到方案C额定功率翻倍但峰谷差只从396MW降到368MW边际收益明显下降。为什么因为这个算例的负荷曲线夜里只有一个连续的“低谷窗口”大约从0点持续到6点。电池若想填谷必须在这个窗口里完成充电。功率再大如果窗口内电价和负荷形态不允许继续吸收更多电充电量就有限。到了D方案额定能量加到600MWh但由于深夜低谷时段的总富余电量有限多出来的能量多数时间用不上结果峰谷差只降了一点点投资成本却增加很多。所以调峰配置的关键不是盲目扩大功率而是先看负荷曲线里的低谷窗口能“吃”进多少电量。如果晚高峰负荷持续5小时低谷只有5小时那么储能时长对应4到5小时通常是合理的如果低谷有8小时晚高峰只有2小时时长做到2到3小时就够了。这个判断比任何求解器都重要。5. 工程项目里反复踩到的坑模型、数据和求解器5.1 充放电互斥约束被忽略让结果“好看但无效”我在很多初版模型里看到过一个典型问题目标函数和SOC约束都写得正确但充电和放电没有互斥约束。优化器会利用这个漏洞同一时段又充又放SOC曲线看起来完全正常峰谷差也削减得很漂亮但实际工程里系统不可能一边充电一边放电。出现这种现象的根源是电价模型。如果峰时段价格很高低谷价格很低优化器希望“把低谷电搬到高峰放”。如果没有互斥约束某些中间时段可能一边以低价充电、一边以高价放电目标函数立刻变好但实际能量被白白损耗物理上不可实现。解决办法分两种。用fmincon时可以加Pch(t) * Pdis(t) 0这种非线性约束用intlinprog时引入二进制变量y(t)写出Pch(t) ≤ M × y(t)Pdis(t) ≤ M × (1 - y(t))其中M可以取P_nom的上限。这个约束会让模型规模变大、求解时间变长但能保证结果物理可执行。工程交付前一定要检查最优解里是否有同一时段功率同时大于0的异常值。5.2 SOC索引错位第一小时和最后一小时最容易出问题变量排列中我把SOC数组设计成长度T1其中下标1对应0:00时刻下标25对应24:00时刻。很多人写代码时习惯直接把SOC定义成长度为T的向量结果在写SOC(k1) - SOC(k)这组等式时第一时段缺了SOC(0)最后一时段缺了SOC(24)。这个错误的隐蔽之处在于模型可能还是有解而且结果看起来像样只是第一小时和最后一小时的约束漏掉了。尤其是首尾SOC闭合被漏掉之后优化器会把初始SOC当成免费电量结果SOC曲线永远从上限跌到下限日循环根本不成立。检查方法很简单方程数量必须和时段数量严格对应。T24时SOC方程应该有24个对应24个时段。如果你发现等式约束只有23行那一定是在某个地方少写了一个时段。另外可以先拿T1的小例子手算一遍把变量索引图打印出来核对能省下大量调试时间。5.3 初始SOC与终止SOC不闭合单日优化的老毛病单日模型里SOC(0)SOC(24)这个约束非常重要。如果不加求解结果通常会让SOC在有晚高峰的那几天结束时降到0.1因为优化器觉得“之后的电量用不到了干脆放空”。但实际运行中第二天还要继续调峰电池必须保留基础电量。我在实际项目里的做法是在SOC首尾闭合之后再额外加一条“日末需保留最高SOC的一定比例”这样的运营性约束比如SOC(24) ≥ 0.3。这可以避免结果在边界上过于激进。对于多日滚动优化则要让每天的SOC(24)保持在一个目标带内而不是每天严格相等。现场调度时初始SOC以实时电池管理系统上报为准模型结果用来做目前曲线的参考而不是直接下发执行。5.4 目标数量级太大导致fmincon不收敛最后一个高频坑是数值尺度。储能调峰模型的日购电成本动辄几百万、上千万而SOC约束的残差只在0到1之间。fmincon等数值求解器在计算最优步长时会同时看目标函数梯度和约束梯度。当目标函数数值远大于约束残差求解器常常过早认为已经找到“足够好”的解停在某个次优点不再继续搜索。我踩过这个坑之后现在所有模型的目标函数都会主动做一次缩放。方法很粗暴算出原始目标值的预期量级然后统一除以10000或者100000让目标数值量级降到10左右。同一个优化问题缩放前fmincon迭代几十步就停了缩放后可以正常迭代到几百步收敛质量完全不一样。另一个相关做法是避免一开始就同时优化所有变量。先固定P_nom和E_nom只优化24个充放电功率变量确认约束和目标逻辑正确然后再把P_nom、E_nom放开用前面的解做初值。这样即使fmincon最后还是掉进局部最优也不会偏得太离谱。最后说一句个人体会。这套模型做下来真正花时间的往往不是建模理论而是数据和参数的口径对齐。负荷曲线采样间隔、电价时段划分、SOC边界条件、效率定义方向任何一处几何口径不一致MATLAB都会给你一个“数学上正确、工程上荒诞”的解。我会在项目启动第一天就把这些约定写成一张中文注释表放在代码最前面宁可多写几行也不要让后来的人对着输出结果猜。
02
RELATED NEWS

相关资讯

更多网站建设与数字化升级内容

03
WHY YAOTU

想打造同款高转化官网?

懂行业、懂生意,从建站到增长一站式陪跑

◈

场景化定制

不做模板站,围绕你的业务场景量身设计,小众不撞款。

◐

营销型架构

以转化目标组织内容与路径,让官网真正带来询盘。

▲

全周期服务

设计、开发、运营、运维一体,上线只是开始。

免费获取你的建站方案

留下需求,专属顾问 24 小时内为你输出方案建议。