十年匠心定制 · 商业建站与技术教学双线并行 咨询热线:400-886-1026 service@lmnt.cn
ARTICLE DETAIL

资讯详情

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

储能参与现货与调频市场的双层交易决策Matlab实现

储能参与现货与调频市场的双层交易决策Matlab实现 从现货市场红利到辅助服务溢价储能的双层套利逻辑并不复杂——难的是把“策略”用数学语言讲清楚再用Matlab跑通。这篇我直接把建模思路、KKT转化、代码框架和踩坑记录全摊开讲。储能参与现货电能量-调频辅助服务市场的双层交易决策研究(Matlab代码实现)电力现货市场全面铺开之后储能这套生意的算账方式彻底变了。以前靠容量租赁、靠政府补偿就能过日子现在必须学会在现货电能量市场里“低买高卖”在调频辅助服务市场里“卖反应速度”两边同时下注才能把一块电池的价值榨干净。但问题也跟着来了储能的充放电行为会影响市场价格市场出清价格又反过来决定储能收益这种“互为因果”的关系用单层优化根本说不清。所以这两年“双层交易决策”成了储能运营优化的热门方向基本套路是上层储能运营商定申报策略下层模拟市场出清两者迭代求解最终找到利润最大化的投标方案。这篇文章我想把这套方法彻底掰开揉碎讲清楚。内容包括双层模型为什么能解决储能参与两个市场的联合决策问题上层和下层分别怎么建模如何用KKT条件把双层问题转化成单层可解问题以及在Matlab里怎么用YALMIP配合Cplex/Gurobi落地实现。内容虽然偏学术但我会尽量用工程化、实操化的口吻来讲适合正在做储能经济性评估、电力市场方向研究的学生也适合储能项目前期做收益测算的工程师参考。就算你之前没接触过双层优化跟着这篇文章走一遍也能知道这个模型在干什么、代码该怎么搭。1. 项目全景与决策思路拆解1.1 储能同时参与两个市场的业务逻辑先理清楚储能在这两个市场里到底靠什么赚钱这是建模的基础。现货电能量市场本质是让储能做“时间的搬运工”。低谷时段电价低储能充电高峰时段电价高储能放电。收入等于高峰放电视同的批发价格减去低谷充电成本再扣掉损耗和电池老化成本。这部分收益的多少取决于电价峰谷价差、充放电效率、以及你能否精准预测每个时段的出清价格。调频辅助服务市场玩的就是另一套逻辑了。电网频率需要时刻维持在50Hz附近新能源占比越高频率波动越大需要的调频资源越多。储能因为响应速度快毫秒级到秒级、调节精度高天然适合做调频。调频市场的收益通常分两块一块是按调频容量给补偿你把手里的功率容量“预留”出来不管用不用都能拿钱另一块是按调频里程给补偿你实际动了多少按调节里程结算。而且很多现货市场比如部分省份的两个细则或调频辅助服务规则会引入性能指标储能的调节速率、响应时间、精度都很优秀综合性能系数往往比火电高一大截同等容量下拿到的调频收益是火电的几倍。关键点在于这两个市场不是独立的。储能的总功率是有限的你拿去调频的容量就不能同时用来做现货套利反之亦然。更微妙的是调频动作本身也会改变储能的SOC影响后续的充放电能力。所以正确的做法不是“先算套利、再算调频、然后相加”而是把两个市场的决策放到一个模型里统一优化让每一度电、每一千瓦容量都分给边际收益最高的用途。1.2 为什么单层优化解决不了这个问题如果储能规模很小小到它的投标量对市场价格几乎没影响那问题很简单给定预测价格曲线直接优化充放电和调频容量分配就行。这是一个标准的线性规划或混合整数规划一天24个时段或96个时段跑起来非常快很多商业储能EMS就是这么干的。但当储能规模大到一定程度——比如一个百兆瓦时的独立储能电站参与省级现货市场——情况就变了。你在低谷时段集中充电低谷电价可能被顶起来你在高峰时段集中放电高峰电价可能被压下去。你的策略行为本身会改变市场价格价格又会反过来影响你的收益。这就是典型的博弈问题单层优化直接把价格当常数处理得出的结论要么过度乐观要么干脆失真。这种场景下需要的是双层优化模型。上层是储能运营商的决策问题目标是它自己的利润最大化决策变量是申报到现货市场的能量价格曲线或量价曲线、申报到调频市场的容量和里程报价。下层是电力市场出清问题系统运营商会根据所有市场成员的申报以社会福利最大化或购电成本最小化为目标出清得到现货价格、调频容量出清量和调频里程出清量。这两层嵌套在一起才是完整的策略性投标模型。1.3 双层决策模型的行业价值与适用边界这个方向的研究价值不仅是“写一篇好论文”那么简单。对储能投资方来说双层模型能更准确地评估项目在电力市场环境下的真实收益测算报价策略对收益的影响避免用“价格接受者模型”算出来的乐观结果误导投资决策。对市场运营机构来说储能策略性投标行为的研究能帮助评估市场力风险改进市场规则。对科研来说它是电力市场、运筹优化、储能技术三个领域的交叉点理论深度和实践价值都有。但我得提醒一句双层模型复杂度高不是所有场景都需要上。如果你只是做一个10MW以内的用户侧储能或者一个小型工商业储能项目储能容量对市场价格的影响微乎其微老老实实用单层模型就行省时省力且结果可靠。双层模型适合独立储能电站、大型新能源配储、以及做市场策略研究的场景。先搞清楚自己的需求边界再决定要不要上这套方法论。2. 核心建模细节与求解原理2.1 上层模型储能运营商的利润最大化上层模型的目标函数就是把前面说的收入项和成本项全部考虑进去做成一个可以求最优的数学表达式。收入项包括现货电能量市场的套利收入、调频容量补偿收入、调频里程补偿收入。成本项包括电池充放电老化成本可以简化为与充放电电量和循环深度相关的线性成本、运维成本以及如果申报了调频容量但实际调用时因为SOC约束或其他原因没能履约的惩罚成本。目标函数写出来大致是max Σ_t ( π_t^E * P_t^dis - π_t^E * P_t^ch π_t^R * R_t π_t^M * M_t ) - Σ_t ( c_cycle * (P_t^ch P_t^dis) c_om * P_t^dis )其中π^E是现货市场出清价P^dis和P^ch是放电和充电功率π^R是调频容量补偿价格R是申报的调频容量π^M是调频里程补偿价格M是实际可能被调用到的调频里程这里通常用预测值或期望值。上层模型的决策变量通常包括现货市场的申报曲线参数比如报量报价中的报价系数调频容量申报量R_t调频里程报价或申报里程M_t储能自身的充放电计划P_t^ch、P_t^dis。约束条件同样不能少。最基本的有功率上下限约束0 ≤ P_t^ch ≤ P_max0 ≤ P_t^dis ≤ P_max充放电功率与调频容量的耦合约束P_t^ch R_t ≤ P_maxP_t^dis R_t ≤ P_maxSOC递推约束SOC_t SOC_{t-1} η_ch * P_t^ch * Δt - P_t^dis / η_dis * ΔtSOC上、下限约束SOC_min ≤ SOC_t ≤ SOC_max周期始末SOC一致性约束可选看研究场景是否需要日内循环。请注意调频容量会同时“占用”充电和放电两方向的能力。这是储能参与调频的典型约束。调频服务要求储能具备向上和向下双向调节能力所以实际能响应的功率会跨越当前工作点也就是说如果处在充电状态它能通过降低充电功率甚至反向放电来提供上调频如果处在放电状态它也能通过降低放电来提供下调频。这会大大增加建模的维度但工程上常用简化处理直接要求充放电功率加上调频容量不超过额定功率。2.2 下层模型市场出清的数学表达下层是市场出清模型。以现货电能量市场为例假设系统内有常规火电机组、新能源机组和储能市场运营机构以系统总购电成本最小化为目标在满足功率平衡和各机组出力约束的前提下出清。下层模型用简化形式描述如下min Σ_t Σ_g ( c_g * P_{g,t} ) Σ_t ( c_sto * P_t^dis - c_sto * P_t^ch ) 调频容量成本 调频里程成本 s.t. Σ_g P_{g,t} P_t^dis - P_t^ch 新能源出力 负荷需求 (对偶变量: λ_t) P_g_min ≤ P_{g,t} ≤ P_g_max (上下限约束乘子条件不一) 爬坡约束 储能充放电约束 调频容量需求约束下层模型的输出是各时段的电价λ_t功率平衡约束的对偶乘子以及储能申报的调频容量是否被出清、调频里程的出清价格等。这里有个非常重要的细节在双层输电框架下下层模型的变量比如储能的充放电功率P_t^ch和P_t^dis并不是上层直接任意指定的——它们必须由市场出清决定。上层能做的只是“申报”通过改变申报参数比如报价斜率、容量报价等来影响下层出清结果。所以建模时请注意同一个物理量在上层和下层里可能各有自己的变量最后通过“申报参数耦合”关联起来这是双层模型比较容易搞混的地方。调频辅助服务市场的下层模型和电能量市场类似只是增加调频容量约束。通常可以简化为系统需要满足某个调频容量需求R_req储能和火电机组按报价竞争这部分容量。表达式大致是Σ R_g R_sto R_req (对偶变量: μ_t)而出清后储能获得的调频容量是R_sto对应的补偿价格是μ_t或者按边际出清价结算。2.3 用KKT条件把双层问题改成单层问题直接求解双层优化问题非常困难因为它是一个NP-hard问题。实践中常用方法是把下层问题用它的KKTKarush-Kuhn-Tucker最优性条件替换从而把双层问题转化成带互补约束的单层数学规划问题专业名称叫MPECMathematical Program with Equilibrium Constraints。思路是既然下层是一个凸的线性规划那么它的全局最优解一定满足KKT条件。所以我们可以把“下层求解”替换成“下层KKT条件成立”然后把这组KKT条件作为约束追加到上层问题中。这样上层目标函数不变下层被“吸收”成了约束集合。KKT条件包括三部分拉格朗日函数对各变量的一阶偏导为0平稳性条件原始可行性条件和拉格朗日乘子非负约束对偶可行性互补松弛条件不等式约束的松弛量与对应的对偶乘子相乘等于0。以最简化的下层LP问题为例min cx s.t. Ax ≤ b x ≥ 0它的KKT条件可以写成拉格朗日函数L cx λ(Ax - b) - μx其中λ和μ是对应上下层约束的对偶乘子。然后需要满足梯度条件c Aλ - μ 0互补条件λ_i * (Ax - b)_i 0μ_j * x_j 0非负条件λ ≥ 0μ ≥ 0Ax - b ≤ 0x ≥ 0。把这些条件全部转化为上层模型的约束原来的双层问题就变成了一个单层但带有互补约束的非线性优化问题。Matlab里可以配合YALMIP直接用求解器处理。需要注意互补约束让问题仍然是非光滑的、非凸的很多商用求解器不能直接处理。这时候就需要用大M法把互补条件线性化引入0-1变量把MPEC转化为MILP或MIQP。对于线性互补条件这项转化是精确的。2.4 非线性项与互补约束的线性化处理双层模型转化为单层后会遇到两类麻烦的非线性项别慌都是成熟套路。第一类是互补条件。对大M法处理每个互补对比如λ * s 0其中λ ≥ 0s ≥ 0引入二进制变量z ∈ {0,1}要求λ ≤ M * z s ≤ M * (1 - z)当z0时λ必须等于0s可以自由当z1时s必须等于0λ可以自由。这精确刻画了λ * s 0前提是M取值足够大让约束不会主动截断可行域。但注意M不能取太大否则会造成数值病态。实际中我会先跑一次松弛版本看λ和s的大致量级再设定M。第二类是上层目标函数或约束里出现的双线性项典型如“现货价格 × 储能放电功率”其中现货价格是下层变量的对偶乘子放电功率是下层变量或上层变量两者相乘就是非线性的。处理方案不外乎几种用强对偶定理。线性规划最优时原问题目标值等于对偶问题目标值。利用这个性质可以把下层目标中出现的价格乘耦合项替换成对偶目标中的线性表达式。这是文献中常见且比较优雅的处理方式。用MCCormick包络近似。适用于双线性项x*y先用辅助变量w替代再通过多个线性不等式约束包络上下界逼近乘积。缺点是可能带来松弛误差结果未必全局最优。直接方案化申报策略。比如假设储能按固定容量申报不报价格这样上层决策就只包含容量类整数变量和下层变量之间的线性关系能显著降低非线性程度。真实市场中储能作为小规模主体也确实常被当作价格接受者这种做法有合理性。我在实际项目中第一选择永远是强对偶因为它精确且不牺牲可行性。只有当问题结构不允许时才考虑MCCormick或启发式方案。这个选择逻辑希望你记下来写论文和做工程都有用。3. Matlab实现与实操过程3.1 工具箱与求解器的选型Matlab环境下做双层优化推荐组合是YALMIP作为建模语言底层求解器备选Cplex、Gurobi或Mosek。YALMIP支持定义sdpvar、binvar变量支持目标函数、约束的直观表达还能自动识别MILP/MIQP结构并调用对应求解器。之所以不直接用Matlab自带的linprog或intlinprog写是因为KKT转化之后模型里会有一堆对偶变量、互补约束和二进制变量YALMIP的建模效率高出好几倍。安装配置上一句话总结YALMIP本身是纯Matlab脚本下载后加路径即可用Cplex和Gurobi需要安装对应版本并配置好Matlab接口。这里提醒一句版本兼容性是最大的坑建议参考官方文档中“Which versions are supported”章节避免Matlab、YALMIP、求解器三方版本打架。如果只想验证思路、数据规模也不大可以用Matlab自带的intlinprog做MILP求解。但做灵敏度分析或规模化时段数较多时还是上Gurobi或Cplex更省心。3.2 参数设定与测试场景准备搭建模型前先准备一套典型参数作为基准场景。下面这套参数是我常用的小型测试配置涵盖了一个1MW/4MWh储能电站参与市场的基本场景参数类别参数名称数值单位储能参数额定功率1MW储能参数额定容量4MWh储能参数充电效率0.95-储能参数放电效率0.95-储能参数SOC下限0.1-储能参数SOC上限0.9-储能参数初始SOC0.5-储能参数周期末SOC要求0.5-市场参数时段数24h市场参数调频容量需求0.5MW市场参数调频容量补偿价格20元/MW市场参数调频里程补偿价格10元/MW成本参数循环老化成本50元/MWh成本参数运维成本5元/MWh现货市场价格序列我会用一组典型的峰谷数据低谷200元/MWh凌晨2点到5点高峰800元/MWh晚上19点到22点其余时段400~500元/MWh之间波动。这个算例不大但足够跑通完整流程每一步的物理意义也直观。3.3 核心代码框架与关键步骤下面给出核心实现思路结构上就是一个“初始化参数 - 构建上层变量 - 构建下层变量和KKT - 组合求解 - 后处理”的流程。%% 参数初始化 T 24; % 时段数 P_max 1; % 额定功率 MW E_max 4; % 额定容量 MWh eta_ch 0.95; eta_dis 0.95; SOC_min 0.1; SOC_max 0.9; SOC_init 0.5; SOC_end 0.5; c_cycle 50; % 元/MWh循环成本 % 负荷需求、新能源出力、火电报价等这里以向量形式给出 % load_demand为24x1数组gen_cost为火电边际成本数组 % 此处略去具体赋值请替换为自己的数据 %% 定义变量 % 上层变量现货报价系数 alpha_t可正可负用于模拟报价策略 alpha sdpvar(T, 1); % 下层变量火电出力、储能充放电、调频容量、对应拉格朗日乘子 P_g sdpvar(T, 1); P_ch sdpvar(T, 1); P_dis sdpvar(T, 1); R_sto sdpvar(T, 1); lambda sdpvar(T, 1); % 功率平衡乘子即现货价格 mu_R sdpvar(T, 1); % 调频容量需求乘子 % ... 其他辅助变量 %% 约束1上层自身约束 Constraints []; Constraints [Constraints, SOC_min SOC_init cumsum(eta_ch*P_ch - P_dis/eta_dis)*0.5/E_max SOC_max]; % 这里0.5为时长1小时且容量4MWh的换算实际按Δt/E_max处理 Constraints [Constraints, P_ch R_sto P_max]; Constraints [Constraints, P_dis R_sto P_max]; % 始末SOC一致 Constraints [Constraints, SOC_init sum(eta_ch*P_ch - P_dis/eta_dis)*0.5/E_max SOC_end]; %% 约束2下层KKT条件以简化的市场出清为例 % 下层原问题min Σ c_g*P_g c_sto*(P_dis - P_ch) % 下层约束Σ P_g P_dis - P_ch P_res D_t % 下层约束0 ≤ P_g ≤ P_g_max, 0 ≤ P_ch ≤ P_max, 0 ≤ P_dis ≤ P_max, 0 ≤ R_sto ≤ R_max % 拉格朗日函数的梯度条件这里只展示功率平衡对应的部分 Constraints [Constraints, c_g lambda 0]; % 根据实际KKT推导此处仅为示意 Constraints [Constraints, c_sto - lambda mu_Pdis 0]; % ... 针对每个下层变量的梯度条件都需要逐条推导 % 互补条件的线性化 % 例如mu_Pdis * (P_max - P_dis) 0 转化为 z1 binvar(T, 1); M_big 1e4; % 大M值根据实际量级调整 Constraints [Constraints, mu_Pdis M_big * z1]; Constraints [Constraints, P_max - P_dis M_big * (1 - z1)]; %% 目标函数上层利润最大化 Objective sum(lambda .* (P_dis - P_ch) ... mu_R .* R_sto ... % 调频容量收益 - c_cycle * (P_ch P_dis) ... % 老化成本 - c_om * P_dis); % 运维成本 %% 求解 ops sdpsettings(solver, gurobi, verbose, 2); sol optimize(Constraints, -Objective, ops); %% 结果输出 if sol.problem 0 P_ch_opt value(P_ch); P_dis_opt value(P_dis); R_opt value(R_sto); price_opt value(lambda); else disp(求解失败); disp(sol.info); end上面代码是简化骨架真实项目需要补充每组约束的完整KKT推导和所有互补条件的线性化。建议初学时先只写现货市场、不带调频市场跑通后再叠加调频部分。一次把模型铺太大很容易陷进调试泥潭。3.4 结果分析与收益构成可视化求解完之后不要光盯着目标函数值。我会习惯性地输出几张图用来判断模型行为是否合理现货价格曲线和储能充放电功率曲线检查是否“低价充电、高价放电”调频容量R_t随时间变化的曲线看看它和现货套利机会是怎么权衡的SOC曲线确认没有越界并验证始末SOC一致收益构成柱状图把现货套利收益、调频容量收益、成本分开展示这样一眼就能看清利润主要来自哪里。我做过的一个典型测试结果是在峰谷价差明显时储能会把大部分容量用于现货套利调频容量只在现货价格较低或较高但价差不足的时段才多申报而在平段储能倾向于多报调频容量赚取补偿收入。这说明模型确实在做“边际收益比较”双层优化捕捉到了这个微妙的替代关系。从数值上看1MW/4MWh储能在上述参数下单日综合收益大约在几百元量级不算投资折旧其中调频容量补偿往往能贡献20%~40%的收益具体比例取决于调频价格水平。这个结论在不同市场规则下差异很大但有一点是通用的储能同时参与两个市场的收益一定大于单独参与任何一个市场因为容量利用率提高了。4. 常见问题与排查技巧实录4.1 模型求解极慢怎么定位瓶颈双层模型转化成MILP之后求解时间飙到几十分钟甚至几小时是常事。先别急着加求解器参数按下面顺序排查第一看整数变量数量。互补条件每引入一个二进制变量求解复杂度就上一截。24时段的模型如果下层约束数量有几十个二进制变量可能上百个这会严重影响效率。尝试合并互补条件、减少不必要的0-1变量。比如两个约束不会同时起作用时可以合并成一个互补条件。第二看大M取值。M太大线性松弛界太松分支定界效率极低。M太小可能截断可行域甚至导致错误。我的做法是先把互补条件当普通不等式松弛掉把λ≤Mz和s≤M(1-z)里的二进制变量z固定为0和1看各个变量的实际量级然后给每个互补对分别设M让M比实际量级大10倍左右。第三设置合理的求解器终止条件。比如给Gurobi设置MIPGap为1%或0.5%Physically实际工程场景不需要完美全局最优一个在1%范围内的次优解足以支撑决策。这能让求解时间缩减一半以上。4.2 KKT条件推导老是出错怎么办KKT推导是双层优化里最劝退的一步。我的经验是把下层模型写成“标准形式”——目标函数求min、约束全部写成≤0或者逐条列出等式与不等式——然后套模板求拉格朗日函数和一阶梯度。很多人出错是因为下层约束方向记反了或者乘子符号弄反了。打个草稿阶段的小技巧每写一条KKT条件就随手用一个小数值例子验证。比如两层模型都换成只有1个时段、2个变量的小问题手算或者调用Matlab的fmincon直接求数值解再用KKT条件反推对偶变量值对得上再继续扩展。基础不牢的话后面所有结果都不可信。4.3 结果总是不合理先检查这些“低级错误”最常见的问题恰恰是参数单位不一致。我见过有人把价格用元/MWh储能容量用MWh但充放电功率的时段转化系数忘了乘算出来SOC超出物理边界。还有把调频容量和电能量容量的单位搞混导致约束完全错误。其次检查约束的符号方向。特别是“P_ch R_sto ≤ P_max”这种耦合约束如果写成“P_ch R_sto ≥ P_max”模型会疯狂给储能“发钱”求解器还洋洋得意。最后看目标函数方向。我们最大化利润YALMIP中要写成“optimize(Constraints, -Objective)”如果忘掉负号结果就是最小化利润储能会故意在最贵的时段充电、最便宜的时段放电整个模型自洽但毫无意义。这个问题我踩过一次后来养成了先画SOC曲线、再看充放电功率是否符合“低充高放”直觉的习惯能立刻发现这类方向性错误。4.4 双层结果的合理性检查清单列一份我常用的结果合理性检查表你跑完模型后逐项打勾检查项合理的表现异常信号充放电方向低价充电、高价放电高价充电或价格倒挂时放电SOC范围始终在上下限内任意时刻越界始末SOC等于设定值或接近偏差过大调频容量非负每个时段都≥0出现负值容量耦合约束充电/放电功率调频容量≤额定功率违反约束目标值正收益且各分项金额在合理量级收益高得离谱或负得离谱价格与对偶乘子正数量级在真实市场价格范围内出现异常数量级这一套检查下来90%的建模bug都能暴露出来。4.5 实测中最容易踩的四个坑第一个坑忽略储能SOC自恢复约束导致的“周末效应”。很多模型只优化一天24小时强制始末SOC相等结果导致第二天早上8点储能“不得不充电”——因为模型为了完成日内循环提前预留了电量。如果做多日连续运营或月度仿真这个约束需要去掉或者改成周级SOC约束否则策略会严重失真。第二个坑调频里程补偿算得太乐观。调频里程不是你想申报多少就结算多少它取决于实际调度指令。多数研究用历史统计均值或预测值来估计但真实里程波动极大。稳妥的做法是加一个风险约束——比如保证调频里程收益不低于某个置信水平——或者把里程补偿价格打一个折扣留出安全裕度。第三个坑把储能老化成本简化成“单位电量固定成本”看似合理但纯充放电模式与调频模式的老化机理完全不同。调频模式下电池处于高频次、浅充浅放的工况循环寿命损失和深度充放电不同。如果调频收益占比很高建议对调频工况单独设置老化系数否则模型会高估调频收益导致过度申报调频容量。第四个坑在没有现货市场或现货市场规则尚未稳定的地区直接套用这个双层模型会失真。模型的前提假设是现货价格由市场出清产生如果当地还是政府定价或者偏差考核机制那么价格曲线不是你申报行为能影响的对象双层结构就不成立了。务必先确认市场规则再决定模型结构。5. 扩展方向与我的实操体会最后再分享一点个人的判断。这套模型跑通之后扩展方向其实很多如果想处理市场价格的随机性可以升级为随机双层规划或分布鲁棒优化核心变化是把下层出清放在多个风光出力场景下取期望如果想研究多个储能电站同时策略性投标的市场均衡问题可以把单层MPEC升级为EPEC均衡约束的均衡问题但求解难度会大幅提升一般需要对角化算法迭代逼近如果想结合储能BMS/EMS的工程细节比如把SOC估算误差、电池健康状态SOH纳入约束那么模型会更贴近实际但也会更“脆”参数稍微不对就容易无解。我个人的实操体会是别指望一上来就复现论文里那种几百个节点的复杂算例那是用来发表的不是用来理解的。第一步永远是把规模缩到最小——1台火电、1台储能、6个时段——把这个微型模型在纸上推导一遍KKT再在Matlab里跑通然后逐步加约束、加时段、加机组。这个过程虽然枯燥但能把双层优化的直觉真正“焊”在脑子里。做双层优化的另一个重要习惯是“准备两个求解释器”。YALMIPGurobi解决MILP主流程但遇到模型病态或数值问题时我会另外用Cplex或Mosek交叉验证。两个求解器结果差异很大时基本可以断定是模型建模问题而不是求解器问题。储能参与现货电能量和调频辅助服务市场的双层决策本质上就是在回答一个问题每一度电、每一千瓦容量今天到底该卖给“时间”还是卖给“频率”。把这个权衡做成模型、跑通代码之后你再看储能项目的收益测算、投标策略、市场规则影响评估视角都会完全不一样。
返回列表