ARTICLE DETAIL

资讯详情

深耕郑州网站建设与运营推广的一线实战洞察。

储能调峰调频联合优化建模:MATLAB+CVX求解全流程解析

储能调峰调频联合优化建模:MATLAB+CVX求解全流程解析 我最早做储能优化的时候第一版模型是把调峰收益和调频收益分开算的。结果方案评审时被问了一个问题同一台储能把一部分功率容量留给调频之后调峰收益肯定要变少这两者之间的最优边界在哪里当时答得支支吾吾因为分开建模根本回答不了这个问题。后来狠下心来把调峰、调频塞进同一个优化框架用MATLABCVX做联合求解才算把这件事彻底想明白。这篇就把完整思路、数学模型和可跑的代码框架整理出来给正在做储能配置或运行策略的朋友一个参考。这篇文章适合三类人一是做储能项目前期收益测算的需要回答装多大、怎么运行回本最快二是做储能EMS或能量管理算法开发的需要把调峰调频策略落地成可求解的数学问题三是写论文或做课题的学生需要一套清晰、可复现的联合优化模型作为基线。全文不追求大而全重点放在为什么这么建模和代码里具体怎么处理这两件事上。1. 调峰和调频的时间尺度战争为什么必须联合建模1.1 调峰在优化什么功率平移与电价套利的统一调峰的本质是时移。电网负荷有峰谷差储能做的就是在低谷充电、高峰放电把能量从低电价时段搬到高电价时段。从运行策略角度看调峰收益主要由两部分构成一是分时电价下的峰谷套利二是削峰填谷带来的容量补偿或需量电费节省。分时电价套利的数学本质很简单就是一个能量搬移问题总充入电量受效率和容量双重约束放电电量不能超过充入电量乘以效率时段的充放电时机决定了收益上限。这也是为什么很多模型用充放电状态变量SOC递推约束就能把调峰描述清楚。削峰填谷稍微复杂一点它关心的是净负荷曲线的形态目标是把峰值压低、把谷值抬高。在独立储能电站的测算里这个收益通常按峰谷差降低的容量价值或减少的需量电费来折算。不过对运行策略模型来说只要负荷曲线已知削峰填谷和电价套利在数学上可以统一成同一个优化目标只是价格信号不同而已。1.2 调频在优化什么容量预留与里程响应的互换调频的物理过程和调峰完全不同。调峰关注的是能量调频关注的是功率。电力系统频率波动是秒级的事储能参与调频时真正赚的钱来自两块一是调频容量费——你承诺在某个功率区间内随时响应AGC指令调度给你按容量结算二是调频里程费——你实际响应了多少调节里程按里程结算。最关键的约束来了调频容量是预留出来的。你承诺了10MW的调频能力这块功率不能随便去干调峰的活因为AGC指令随时可能来。这就是联合优化里最核心的耦合关系——同一台储能功率容量到底分多少给调频、留多少给调峰。1.3 联合后的收益结构两块收入如何互相牵制把两块收入放在一起后目标函数长这样调峰收入充放电压差收益调频容量收入预留容量费调频里程收入响应里程费减去运行成本循环损耗或寿命折损。但这两块收入不是简单相加的关系因为约束在打架。调峰想多充电、多放电需要功率窗口大调频想多留容量也需要功率窗口大。总功率就这么大你给调频留了10MW调峰的最大充放功率就只能用剩下的部分。除此之外SOC也会互相影响调频响应是双向的预留了容量之后SOC的可用区间会被压缩因为必须留出足够空间应对AGC双向指令。这样一讲联合建模的必要性就清楚了单独算调峰收益你会把全部功率拿去套利单独算调频收益你会把全部功率都报成调频容量。这两种策略单独看都合理放在一起必然是错的。联合模型的价值就是自动找到那个平衡点在功率分配和SOC管理上做出全局最优决策。2. 储能本体的建模边界先把能做什么写成数学约束2.1 功率平衡、充放互斥与SOC递推的核心公式储能建模的第一步是把物理特性写成约束。以下是我至今在用的基础模型MATLAB代码里可以直接抄% 储能基础参数 E 20; % 额定容量 20 MWh Pmax 10; % 额定功率 10 MW eta_ch 0.95; % 充电效率 eta_dis 0.95; % 放电效率 SOC_min 0.1; % SOC下限 10% SOC_max 0.9; % SOC上限 90% SOC0 0.5; % 初始SOC T 96; % 调度周期时段数15min一个点 dt 0.25; % 时段时长 h核心约束如下% 每个时段内充/放电功率同时受功率上限和调频预留容量约束 Pch Rcap Pmax; % 充电通道充电功率 调频预留 额定功率 Pdis Rcap Pmax; % 放电通道放电功率 调频预留 额定功率 % 充放电互斥同一时段不能同时充放电 Pch M * u_ch; % u_ch 1 表示充电 Pdis M * (1 - u_ch); % u_ch 0 表示放电 % SOC递推下一步SOC 当前SOC 充电贡献 - 放电消耗 for t 1:T-1 SOC(t1) SOC(t) (eta_ch * Pch(t) - Pdis(t) / eta_dis) * dt / E; end % SOC边界 SOC_min SOC SOC_max; % 末端SOC约束保证下一个调度周期能接续 SOC(T) SOC0;这里的充放互斥约束用了一个辅助二元变量u_ch配合一个大M常数实现。CVX里声明binary变量后这种写法是MIQP标准处理方式完全没问题。2.2 效率、自放电和循环寿命因素的取舍我在实际建模时对物理特性做了三层取舍每一层都有代价你得知道自己在放弃什么。第一层是效率。充放电效率直接进SOC递推公式这个必须保留否则峰谷套利会虚高跑出来一个不可能实现的收益率。这里要注意效率的两个方向不一样充电时电网给电池的能量要乘eta_ch放电时电池释放给电网的能量要除以eta_dis两个系数我都会标定不混用。第二层是自放电。对锂电池来说日自放电率通常不到1%在24小时优化周期里影响很小。如果做8760小时的全年连续优化自放电就不能忽略了需要在SOC递推里加一个衰减项。此处我们做典型日优化可以安全地把自放电忽略掉。第三层是循环寿命折损。这是最容易被初学者忽略的。每一次深度充放电都在消耗电池的寿命一个10MW/20MWh的储能如果每天满充满放日历寿命可能只有设计值的一半。我在目标函数里加了一个线性惩罚项每次充放电动作折算成等效循环成本用度电成本乘以充放电电量扣除。这样模型会自动避免过度频繁的充放动作。这个做法虽然不如疲劳模型精确但在优化框架里代价小、效果好工程上完全够用。2.3 一个可直接替换参数的10MW/20MWh基线模型上面这套参数组了我最常用的基线配置直接复制就能跑通。10MW/20MWh的意义在于额定功率下满功率运行2小时即充满或放空这是当前电网侧储能最常见的功率/容量配比之一容量时长2小时。这个配比下调峰套利的能量空间和调频响应的功率空间都有优化余地很适合用来分析耦合关系。我建议第一次跑模型时不要改参数先看结果是否合理再去替换自己的实测数据。换数据时最需要注意的是所有单位保持一致。我在代码里统一用MW、MWh、元/MWh时间用小时。如果用了kW和kWh数值会差1000倍CVX求解时容易出现数值问题报错也会让你误以为是模型写错了。3. 目标函数与约束条件联合优化模型具体怎么写3.1 调峰收入部分分时电价下的充放电决策调峰收入是最直接的一块它的公式是$$ \text{PeakShavingIncome} \sum_{t} (Pdis_t - Pch_t) \cdot price_t \cdot dt $$电价曲线price_t是外部输入分时电价、现货电价都可以只要给每个时段一个价格数字就行。但这里有一个很容易踩的坑模型会自动利用SOC末端约束做周期末放空式的投机。比如把SOC起点设为50%、终点也设为50%模型会倾向于先把电全部放光换成收益然后在最后一个时段用低价电充满把SOC顶回50%。这种做法在单周期优化里看起来没毛病但如果次日电价曲线变了今天的投机可能让第二天无电可用。解决方法是加上SOC(T) SOC0之后再额外限制每个时段的SOC变化幅度或者把优化周期拉长到48小时、72小时用滚动窗口来避免单周期短视。我实际做项目时更常用滚动优化每次只优化24小时但把SOC起点设为真实测量值优化结束后只执行第一个时段的决策然后重新求解。这样就能把投机行为自然消解掉。3.2 调频收入部分容量预留与里程折算调频收入比调峰复杂一点原因是它涉及两个价格信号容量价格和里程价格。容量收入比较简单是预留容量乘以容量单价再乘以时间$$ \text{CapacityIncome} \sum_{t} Rcap_t \cdot \pi_{cap} \cdot dt $$其中\pi_{cap}是调频容量单价单位是元/MW/h。里程收入是我当年建模时最纠结的部分。理论上它应该等于实际AGC响应里程乘以里程单价。但在运行策略层面AGC指令还没到来你根本不知道未来时刻的响应里程是多少。解决思路是用历史AGC信号做一个统计得到单位预留容量对应的期望里程系数。举个例子如果你预留1MW调频容量24小时历史上AGC下发到你这里的平均调节里程可能是30MWh那期望里程系数就是30MWh/MW/天。里程收入就简化为$$ \text{MileageIncome} \sum_{t} Rcap_t \cdot \lambda_{mile} \cdot dt $$\lambda_{mile}是每小时每MW预留容量对应的期望里程收益单位元/MW/h。这个简化在工程上是成立的因为AGC信号有统计规律中长期来看大数定律会收敛用期望值做运行决策和用实际信号做复盘差异不会太大。但如果你手里有真实的AGC信号序列更精确的建模方式是把调频响应环节拆成两个阶段先做日前/小时前的容量决策决定预留多少再做实时AGC响应的功率跟踪决定实际里程。我实际做的项目里第二阶段用的是MPC滚动控制第一阶段就是这里的联合优化模型两者配合得非常好。3.3 耦合约束同一块储能如何同时干两件事这是全篇最核心的部分。调峰和调频必须共享同一个储能本体所以不能把它们写成两个独立的模型再加总那没有任何意义。耦合约束体现在三个层面第一是功率耦合。我在2.1里已经写了Pch Rcap Pmax和Pdis Rcap Pmax。这个约束的意思是如果你预留了5MW调频容量那么调峰充电功率最多只能到5MW剩下的5MW是留给AGC指令的安全窗口。第二是SOC耦合。调频响应可能让SOC在任何方向上偏移所以预留调频容量后SOC区间需要额外收缩。做法是设置一个调频安全边界SOC_min Rcap * dt_c / E SOC SOC_max - Rcap * dt_c / E;其中dt_c是调频持续响应时间假设比如AGC要求储能能以额定功率持续响应15分钟那么dt_c0.25小时。这个边界的意思是无论AGC让你充还是让你放15分钟内你都有足够空间执行指令不会顶到SOC上下限。第三是爬坡耦合。储能PCS的爬坡速率极快很多系统能做到秒级满功率响应在15分钟时间尺度里可以忽略爬坡约束。但如果你的系统是飞轮电池混合储能或者有别的技术限制爬坡约束就需要单独加它会在时段之间形成一个隐形的功率变化上限对联合优化结果影响很大。3.4 末端SOC与连续性约束末端SOC约束前面已经提过但我还做了另一个处理不只是要求SOC(T) SOC0而是把每天的调频预留边界也带入末端保证下一个优化周期的起始SOC在安全区间内。代码写法是% 末端SOC落在安全区间内而非单一固定点 SOC_min Rcap(T) * dt_c / E SOC(T) SOC_max - Rcap(T) * dt_c / E;这样做的好处是如果某一天系统判断第二天有更好的调峰机会它可以选择今天不把SOC顶回50%而是让它落在40%~60%区间内给第二天的优化保留更多灵活性。这个细节在单日优化里看不大出来但如果你跑的是连续30天的滚动优化这个自由度能明显减少滚动窗口末端的收益损失。4. CVX代码落地从数学模型到可行代码的关键一跳4.1 CVX建模的核心代码直接可运行的框架现在进入正题——怎么把上面的数学公式变成CVX能求解的代码。以下代码是我实际项目里精简后的版本去掉业务噪声保留核心逻辑拷贝就能跑。%% 储能参与调峰调频联合优化 - CVX核心代码 % 变量声明T9615min粒度 cvx_begin quiet variables Pch(T) Pdis(T) SOC(T) Rcap(T) variable u_ch(T) binary expression peakshaving_income expression frequency_capacity_income expression frequency_mileage_income expression cycle_cost % 目标函数调峰收益 调频容量收益 调频里程收益 - 循环损耗成本 peakshaving_income sum((Pdis - Pch) .* price * dt); frequency_capacity_income sum(Rcap * pi_cap * dt); frequency_mileage_income sum(Rcap * lambda_mile * dt); cycle_cost c_cycle * sum(Pch Pdis) * dt; maximize(peakshaving_income frequency_capacity_income frequency_mileage_income - cycle_cost) subject to % 功率耦合约束 Pch Rcap Pmax; Pdis Rcap Pmax; Pch 0; Pdis 0; Rcap 0; % 充放互斥 Pch Pmax * u_ch; Pdis Pmax * (1 - u_ch); % SOC递推 for t 1:T-1 SOC(t1) SOC(t) (eta_ch * Pch(t) - Pdis(t) / eta_dis) * dt / E; end % SOC边界含调频安全边界 for t 1:T SOC_min Rcap(t) * dt_c / E SOC(t) SOC_max - Rcap(t) * dt_c / E; end % 末端SOC柔性约束 SOC_min Rcap(T) * dt_c / E SOC(T) SOC_max - Rcap(T) * dt_c / E; % 起始SOC 0.5 SOC(1) SOC0; cvx_end运行这个模型之前需要先设置好price、pi_cap、lambda_mile、c_cycle这些外部参数。c_cycle是循环损耗成本系数我一般取0.1~0.2元/kWh的等效损耗成本具体数值需要根据电池类型和厂家质保条款来定。4.2 求解器选择与数值稳定性处理CVX是一个建模框架真正干活的是内部的求解器。这个模型里因为有二元变量u_ch问题类型是混合整数二次规划MIQP不能只靠默认的SDPT3或SeDuMi解决需要支持整数规划的求解器。我的建议排序是这样的求解器授权适用规模备注Gurobi商业授权有学术版大最推荐MIQP性能极强T96的模型秒解MOSEK商业授权有学术版中大和Gurobi接近对SOCP支持更好SCIP免费中小免费里最好用的T96也能跑但慢一些GLPK免费小只支持LP/MILP不支持二次目标不推荐在CVX里调用Gurobi或MOSEK的方法很简单cvx_solver gurobi cvx_solver mosek放在cvx_begin之前即可。数值稳定性方面我分享几个亲身踩坑后总结的经验第一把单位换算好再建模。我见过有人用W和Wh做单位结果Pmax1000000SOC递推公式里的数值动辄上亿求解器内部数值条件数很差报出各种莫名其妙的警告。用MW和MWh就能避免这个问题。第二大M常数不要取太大。充放互斥约束里用到的M很多人图省事写成1e9这在CVX里很容易引起数值警告。正确的做法是取一个刚好覆盖变量上限的值比如M Pmax Rcap_max或者直接写Pmax——因为充放电功率的上限本来就不会超过Pmax。代码里我用的是Pmax这样约束更紧求解更快。第三小心CVX的警告信息。如果求解结束时出现Numerical problems或Ill-conditioned之类的警告别急着信结果。优先检查目标函数里有没有量级差距过大的项比如调峰收益是几千循环成本是几百但调频容量收益是几百万这种量级失配会导致求解器在数值精度上顾此失彼。我的做法是先跑一次不带调频的纯调峰模型和一次不带调峰的纯调频模型看两者的目标函数值是否都在同一数量级再去跑联合模型。4.3 跑通后必须验证的三件事模型跑通只是第一步我在交付报告前一定会做三件事来验证结果质量。第一件事检查功率时序是否平滑。如果相邻时段的充放电功率出现频繁跳变比如15分钟前还在10MW充电15分钟后直接10MW放电说明模型在用高频振荡钻约束的空子实际系统根本执行不了。这种情况通常是因为目标函数里没有加功率变化惩罚项或者SOC递推约束的离散化步长不合适。第二件事对比联合模型和独立模型的结果。我把联合模型里Rcap强制设为0就退化成了纯调峰模型把Pch和Pdis强制设为0就退化成了纯调频模型。如果联合模型的总收益小于任何单独模型说明约束耦合写错了模型把本应共享的资源弄成了互斥条件。这个对照实验我每次必做它能快速验证耦合逻辑是否正确。第三件事做一次灵敏度扰动测试。把某个输入参数比如电价曲线整体上调5%重新求解观察决策变量变化的合理性。如果电价涨了充电量应该增加或者放电量应该增加方向反了说明模型写反了。这种测试虽然简单但能抓住很多初学者容易犯的电价收益方向搞反的问题。5. 结果剖析与常见坑位模型跑出来的数字怎么读5.1 收益拆解调峰、调频到底各赚多少模型求解后我最先做的是收益拆解。以我给的10MW/20MWh参数配一组参考数据为例电价峰谷差0.7元/kWh调频容量单价80元/MW/h期望里程折算20元/MW/h联合模型跑出来的一天收益结构大致是这样的收益来源估算日收益元占比说明调峰套利8,000~10,00045%~55%与峰谷电价差强相关调频容量6,000~8,00030%~40%与预留容量比例正相关调频里程2,000~4,00010%~20%与AGC信号活跃度正相关减掉循环损耗-1,500~-2,500-10%电池寿命成本这些数字会随参数剧烈变化但数量级是准的。我见过很多测算报告储能收益里调峰占80%以上那通常是把储能当大号充电宝用。实际上在调频市场开放的地区调频收益往往比调峰更高联合模型会自动把更多容量分配给调频直到调频的边际收益低于调峰的边际收益这个平衡点才是全局最优。这里有一个特别反直觉的结论联合优化后的调峰电量通常会小于纯调峰方案但总收益会更高。原因是边际功率从低价值的调峰搬到了高价值的调频功率分配的边际收益趋同了。很多只算调峰收益的储能项目实际回报率被严重低估就是因为没算调频这块。5.2 灵敏度分析电价差、里程单价、容量参数怎么影响决策做项目收益测算时不能只给一个固定数字必须给一个区间。我的经验是对三个关键参数各做一组灵敏度扫描。第一个是峰谷价差。把价差从0.3元/kWh扫到1.2元/kWh你会看到调峰收益线性上升但调频预留容量会缓慢下降——因为价差越大单位调峰功率的边际收益越高模型愿意把功率从调频挪到调峰。这个趋势能直接帮你判断一个项目到底该主打调峰还是主打调频。第二个是调频容量单价。这个参数从50元/MW/h涨到150元/MW/h时Rcap会从接近0迅速攀升到满功率。但注意不是线性攀升因为受到SOC安全边界的限制Rcap越大SOC可用区间越窄调峰基本就放弃了。找到那个调频容量价格大于多少时储能应该全功率投入调频的拐点对市场报价策略很有参考价值。第三个是储能容量配比E/P比。我对比过10MW/10MWh1小时、10MW/20MWh2小时、10MW/40MWh4小时三组配置。结论很清晰E/P比越低调频占比越高E/P比越高调峰占比越高。原因是调频是功率型业务需要功率、不依赖能量调峰是能量型业务需要能量、靠时长吃饭。如果你在一个调频价格很好的市场做方案选择1小时时代配比的储能比2小时的IRR更高。这个结论对前期容量配置选型直接有用。5.3 我踩过的几个坑和对应解法第一个坑SOC递推公式里效率放错位置。我最早写SOC递推时把充电效率放在了放电项上结果模型疯狂充电但放电量很少SOC一路冲到上限目标函数异常高。这个错误很隐蔽因为单看SOC曲线形状是正常的直到我检查SOC曲线末端才发现它一直在90%附近贴着上限走。解法是逐时段手算一个SOC递推确认效率方向正确。第二个坑调频容量预留约束写成Pch Rcap Pmax时忘了Rcap是双向的。AGC指令可能让你充电也可能让你放电所以Rcap同时占用充、放两个方向的功率窗口。如果只在一个方向加约束模型会钻空子把Rcap设为满功率然后只在一个方向上预留另一个方向上的调峰功率照样满发。表面上看收益很高实际系统根本做不到。解决办法就是我2.1写的充、放两个方向都加同样的约束。第三个坑CVX中二元变量和连续变量连乘。如果试图在目标函数里直接写Pch * u_chCVX会报错或构造出非凸的问题。正确做法是把二元变量用在约束的开关控制里让连续变量和二元变量通过大M约束耦合而不是直接相乘。我见过不少新手在这里卡很久其实就是数学模型的线性化技巧没用到。第四个坑末端SOC约束写成硬相等SOC(T) SOC0后优化结果不稳定。因为单日优化里没有未来信息模型可能把最后几个时段的决策做得非常激进就为了凑够那个末端SOC。我后来改成柔性边界就是3.4写的区间约束结果稳定多了而且滚动优化的衔接也更好。6. 从单日优化到实际工程一些操作层面的补充6.1 参数标定用实际数据校准模型的几个关键点模型参数不是拍脑袋定的每一步都需要数据支撑。电价曲线可以直接从交易中心历史现货电价拿没有现货市场就按分时电价目录来。调频容量单价和里程折算系数需要根据当地调频辅助服务市场的结算规则来折算不同地区的规则差异很大。效率参数建议用储能PCS厂家提供的实测效率曲线不要直接用铭牌效率。我测试过同一台PCS在20%负载和80%负载下的效率能差5~8个百分点而这个差异对SOC递推有累积影响一天下来能差好几个百分点的SOC放大到收益上就是几个百分点的误差。循环寿命成本系数c_cycle的标定最容易被忽略。我用的方法是厂家质保书上找循环寿命曲线比如80% DOD下循环6000次用储能系统总成本除以等效总循环点数得到一个每充放一度电的等效损耗成本。这个数字通常落在0.1~0.3元/kWh之间。如果你做的项目电池成本很低这个系数可以适当调低如果用的是高能量密度锂电建议往高取。6.2 滚动优化把单日模型改造成实时调度策略前面提到的滚动优化实现思路我在实际项目里验证过效果很好。具体流程是当前时刻t0获取实测SOC、最新电价预测和调频容量价格。以当前状态为起点求解未来24小时T96的联合优化模型。只执行第一个时段未来15分钟的决策结果包括充放电指令和调频预留容量。到达下一个决策时刻回到第1步用新的实测数据重新求解。% 滚动优化主循环 for k 1:96 % 获取当前状态 SOC_now SOC_measured(k); % 更新电价预测此处用真实值做复盘实际项目用预测模型 price_forecast price(k:k95); % 若超出24h边界用最后一段填充补齐 % 调用优化函数返回第一个时段的决策 [Pch_opt, Pdis_opt, Rcap_opt] rolling_optimize(SOC_now, price_forecast); % 执行第一个时段的指令 execute(Pch_opt(1), Pdis_opt(1), Rcap_opt(1)); end这种策略在项目上跑的实时性完全没问题单次求解时间在Gurobi下通常不到1秒。如果你不想用商业求解器免费方案可以用SCIP时间会慢一些但也能接受。6.3 图形化分析怎么用一张图说清楚优化结果每次跑完模型我都要画三张图这三张图对判断结果合理性非常有帮助。第一张是功率时序图画Pch-Pdis净功率曲线和Rcap调频预留曲线第二张是SOC时序图第三张是收益累积曲线。figure; subplot(3,1,1); stairs(1:T, Pch, r); hold on; stairs(1:T, Pdis, b); stairs(1:T, Rcap, g); legend(充电功率,放电功率,调频预留); xlabel(时段); ylabel(功率 (MW)); grid on; subplot(3,1,2); stairs(1:T, SOC, k); hold on; yline(SOC_min, r--); yline(SOC_max, r--); legend(SOC); ylabel(SOC); grid on; subplot(3,1,3); cumulative_income cumsum((Pdis - Pch).*price*dt Rcap.*(pi_caplambda_mile)*dt - (PchPdis).*c_cycle*dt); plot(1:T, cumulative_income, b); xlabel(时段); ylabel(累计收益 (元)); grid on;记得在画图前让CVX求解的变量从内部作用域取出来用squeeze或直接赋值到工作区避免后面脚本访问不到。7. 模型扩展方向联合优化模型还能往哪走我这个框架做好了之后扩展起来非常方便。目前我在上面加过的扩展有四个方向都验证过可行。第一个是多储能联合优化。把N台储能的变量拼起来共享同一组电价和调频信号约束里加上每台储能的独立SOC和耦合的并网点功率限制。这样能处理多台储能在一个并网点下如何分配调峰调频任务的问题也能处理不同技术类型储能比如锂电飞轮的分工问题。第二个是加入新能源预测的不确定性。把光伏或风电出力的预测误差引入约束用鲁棒优化或场景随机规划处理。储能此时不只是赚调峰调频的钱还要负责平抑新能源波动模型从单目标收益最大化变成收益与风险的平衡。第三个是分时段的调频容量决策。前面模型假设全天调频容量单价相同实际上调频市场在不同时段价格差异很大比如早晚高峰调频需求高价格也高。把Rcap从全时段统一改成每个时段独立变量之后模型会主动在调频价格高的时段多预留容量、在价格低的时段把功率还给调峰。第四个是退化到储能容量配置优化。如果我把运行策略模型嵌套在一个参数扫描循环里对不同的E/P配比各跑一次联合优化把每种配置下的最优年收益算出来结合系统成本就能得到净现值或IRR曲线直接指导储能应该装多大。这个方法比单纯用经验公式测算是要靠谱很多的。我个人在实际操作中最深的体会是储能优化模型的难点从来不在算法多高深而在每个约束是否真实反映了物理系统的限制。很多看起来很漂亮的结果一拿到实际设备上就出问题根源都是建模时把某些不可能写成了可能。联合优化模型写清楚、跑稳定之后上面这些扩展都会变得非常快因为核心的储能约束和求解框架已经被验证过了。
返回列表