共享储能配容与调度这块,很多人一开始都会被“碳交易”“波动惩罚”“双层优化”这几个名词吓住,觉得是不是又是一个动辄几十个公式、跑一次要三天三夜的硬核模型。实际上拆开来看,这个题目本质上就是“算一笔账”:在满足安全稳定运行的前提下,储能电站到底配多大容量、充放电功率怎么安排,才能让整体经济效益最优,同时还能兼顾电网友好和低碳贡献。我这段时间仔细啃了这个方向,用Matlab搭了一套完整的配置-调度联合优化框架,把碳交易收益和网间交互波动惩罚都揉进了目标函数里,下面把整个建模思路、数学推导、代码实现和踩坑记录完整梳理一遍。
1. 项目整体设计与思路拆解
1.1 共享储能:从“自建自用”到“多用户共享”的商业模式转变
在聊优化模型之前,得先把“共享储能”这个商业形态讲清楚。传统储能电站大多是火电厂配储、新能源场站强制配储,或者某个大型工业用户自己建一套。这种模式的缺点非常明显:单个用户负荷曲线是固定的,储能系统一天可能只有两三个小时在满负荷运行,大部分时间处于低效闲置状态,投资回收期被拉得很长,经济性很难看。
共享储能解决的就是这个痛点。它的逻辑很接近共享单车和云计算:由一个独立运营商建设一定规模的储能电站,然后面向多个用户(比如三个风电场、两个光伏电站、若干工业负荷)提供容量租赁服务。用户按需租用一部分容量,用来平滑自己的新能源出力、削峰填谷、降低需量电费,运营商则通过租金回收投资。关键在于,多个用户的负荷曲线和新能源出力曲线之间存在时间互补性——光伏用户白天需要储能消纳,晚间负荷用户需要储能放电支撑,这种错峰效应让同一套储能系统可以在一天内完成多次充放循环,整体利用率大幅提升。
所以这个模型里的第一个核心决策变量就是储能电站的额定功率和额定容量,这属于“配置层”问题,通常以年为规划周期,采用典型日数据进行模拟。配置定下来之后,储能在每个时段到底充电还是放电、充放多少,这属于“调度层”问题,以小时为颗粒度。两个层次紧密耦合:配置大了投资成本高,配置小了又不够用,必须联合优化才能找到平衡点。
1.2 为什么同时考虑碳交易和电网交互波动惩罚
很多做储能优化的论文只考虑电能量套利和调峰服务收入,顶多再加一个容量租赁费,目标函数就是“收益-成本”,简单直接。但实际工程项目中,有两个因素绕不开。
第一个是碳交易。在碳约束逐渐收紧的背景下,储能本身虽然不产生碳排放,但它的运行状态会影响整个系统的碳排放水平。储能多充电、多放电,可以帮助新能源场站减少弃风弃光,替代一部分化石能源出力,从而降低系统碳排放;储能运营商可以基于这种减排贡献参与碳市场交易,获得额外的碳收益。这里的难点在于碳配额怎么算、节碳量怎么统计,模型里需要一套明确的核算机制。
第二个是电网交互波动惩罚。储能电站不是孤岛,它始终要通过公共连接点(PCC)与电网进行功率交换。如果储能充放电功率频繁剧烈变化——比如早上8点还在以满功率充电,9点突然切到满功率放电——就会导致并网点功率大幅波动,对电网调度和电压稳定造成冲击。电网运行方在实际中会对这种波动性提出约束或收取惩罚费用,这也是“两个细则”里并网运行考核的一部分。把这一项量化后加入目标函数,本质上是用经济手段约束储能的运行平滑性,让优化结果不仅“对自己划算”,还要“对电网友好”。
1.3 配置-调度耦合问题的总体框架
整个优化问题可以概括为一个两阶段决策结构:外层是年度的容量配置决策(额定功率P_rate、额定容量E_rate),内层是典型日内的运行调度决策(各时段充放电功率、SOC状态、电网交互功率)。两阶段之间的桥梁就是运行调度必须满足配置容量给定的边界条件,而配置方案的经济性评估又依赖于运行调度产生的最低运行成本或最大运行收益。
工程上解决这类耦合问题有两种主流思路:一种是直接建立单层大规模优化模型,把所有典型日变量的约束条件和目标函数全部写进去,一次性求解,优点是全局最优,缺点是可扩展性差、计算时间长;另一种是采用双层优化结构,上层优化配置、下层优化调度,下层通过KKT条件或强对偶条件替换后转化为单层问题求解,这种方案适合处理多个独立决策主体的博弈场景。我这套模型用的是前者——集中式联合优化,好处是模型清晰、Yalmip+Gurobi可以直接搞定、跑出来的结果也方便复盘。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 数学模型构建:从“拍脑袋”到“可求解”
2.1 目标函数:收益、成本与惩罚的博弈
先看目标函数。共享储能运营商的全生命周期年化净收益可以拆成四项:运行收益(储能充放电套利、给用户供电的售电收入)加上碳交易收益,再减去年化投资成本和运维成本,最后减去电网交互波动惩罚成本。用数学形式写出来就是:
max F = R_arb + R_carbon - C_inv - C_om - C_pen
这里每个分项都需要细化。
R_arb是电能量市场中的套利收益。储能从电网购电充电(电价低时)、放电上网或供给用户(电价高时),一个典型日内各个时段的净收益是P_dis(t)·π_sell(t)·Δt - P_ch(t)·π_buy(t)·Δt,再把全年所有典型日加起来。实际项目中还要把给用户供电的收益单独核算,用户按合同电价付费,运营商从电网低价充电后以协议价格卖给用户,赚的是价差。
R_carbon是碳交易收益。储能促进新能源消纳、减少化石能源出力的部分,按照碳配额规则折算成可交易的碳配额,乘以碳价,就是碳交易收入。这里我采用的核算方式是:先根据储能放出的电量中替代火电的比例计算减少的碳排放量,再折合成碳配额。
C_inv是年化投资成本,等于单位功率成本×额定功率 + 单位容量成本×额定容量,再乘以年化因子。年化因子通常用等年值法计算,假设储能寿命为10年、资金折现率为8%时,年化因子约等于0.149,这个数值可以直接用Matlab的crf函数算出来。
C_om是运维成本,一般按投资成本的一定比例(比如2%)取值,也可以按放电量折算,每kWh运维成本0.01-0.02元左右。
C_pen是电网交互波动惩罚。这个需要重点设计。电网交互功率P_grid(t)在相邻时段的变化量绝对值之和,即∑|P_grid(t+1) - P_grid(t)|,乘以一个惩罚系数λ_pen,就是波动惩罚成本。这个惩罚项的存在会迫使优化算法尽量让储能出力变化平缓,避免大起大落。
2.2 约束条件:物理规律与运行边界
储能模型跑不出来或者结果不合理,十有八九是约束条件出了漏洞。这部分的约束可以分成几组:
第一组是储能自身的物理约束。电池SOC动态变化满足:
SOC(t+1) = SOC(t) + (η_ch·P_ch(t) - P_dis(t)/η_dis)·Δt / E_rate
SOC不能超过上下限,通常取10%~90%,这对锂离子电池是相对保守且安全的范围。充放电功率不能超过额定功率:0 ≤ P_ch(t) ≤ P_rate,0 ≤ P_dis(t) ≤ P_rate。如果严格要求同一时段不能同时充放电,还要引入二进制变量来互斥,这会变成混合整数线性规划(MILP),求解时间更长。我的实际经验是:当电价高低时段划分足够清晰时,充放同时段发生的概率极低,可以直接用两个非负变量建模、通过合理的目标函数自动避免,不必额外加整数变量。
第二组是功率平衡约束。每个用户的负荷需求由光伏出力、储能出力和电网供电三者共同满足。储能电站与各用户之间的功率交换不能超过用户租赁的容量上限。
第三组是电网交互约束。电网交互功率P_grid(t)要满足输电容量的限制,同时由于我们在目标函数中加了波动惩罚,P_grid(t)与P_ch(t)、P_dis(t)之间要建立正确的关联关系:
P_grid(t) = P_load_total(t) - P_pv_total(t) - P_dis(t) + P_ch(t)
这个等式是模型中最容易写错的地方,正负号搞反会导致储能永远在错误的时段充放电。
2.3 碳交易机制建模
碳交易这块我采用了目前国内碳市场中比较通用的基准线法。系统会为排放主体设置一个免费排放配额E_allow,根据历史出力水平或行业基准值确定。如果实际碳排放量E_actual低于配额,就可以把差额(E_allow - E_actual)拿到碳市场上去卖;如果超出了,就需要花钱购买缺口。
把储能纳入碳交易框架时,逻辑是这样的:储能放电替代了原本需要火电承担的出力,每放1MWh电量假设可以减少0.5~0.7吨CO₂排放(这个系数取决于所在区域电网的排放因子,华北电网大概是0.8左右,全国平均在0.5-0.6左右)。然后参照碳配额交易价格(目前全国碳市场在80~100元/吨波动),折算成碳收益。在模型里我设定初始配额为一个基准值(取无储能时系统的碳排放量),储能投运后系统碳排放下降,差额就可以视为储能带来的可交易碳资产。
2.4 电网交互波动惩罚的线性化处理
电网交互波动惩罚项∑|P_grid(t+1) - P_grid(t)|是一个带绝对值的目标项,绝对值本身是非线性的,但不是每一个非线性都要避之不及。这个惩罚项可以直接用Yalmip的norm(P_grid(2:end) - P_grid(1:end-1), 1)来写,求解器会自动处理成线性表达式。如果不用Yalmip,也可以用引入辅助变量u(t)的方式线性化:令u(t) ≥ P_grid(t+1) - P_grid(t) 且 u(t) ≥ -(P_grid(t+1) - P_grid(t)),然后把目标函数中的绝对值替换为∑u(t)。
这里有一个需要说明的关键点:波动惩罚系数λ_pen的取值直接决定了储能运行的平滑程度,甚至会影响配容结果。λ_pen取得太小,惩罚形同虚设,储能可能在满功率充放之间来回切换;λ_pen取得太大,储能为了追求平滑,连正常的调峰任务都不敢接了,经济性大打折扣。我建议通过敏感性分析扫描λ_pen的取值,观察储能配置容量和总收益的变化趋势,找到拐点作为参考选值。
2.5 双层优化的KKT转化(可选读懂)
如果场景是需要刻画运营商的配置决策和用户的用能决策之间的博弈,模型就会变成双层优化。外层目标函数是运营商收益最大化,决策变量是配容;内层是用户侧运行成本最小化,决策变量是用户向储能购电的功率和时段。这种结构的标准解法是把下层问题用KKT条件替换:对下层目标函数求导等于零、加上互补松弛条件,再把互补松弛条件用大M法离散化,最终变成MILP问题。
虽然我的最终代码用的是单层集中式优化,但理解KKT转化对后续功能扩展非常重要。很多期刊论文或者工程招标方案里会要求“考虑多主体博弈”,那时候就得从单层模型升级到双层模型,前提就是先把KKT转化那套逻辑吃透。如果不做转化,用迭代法在两个层级之间反复求解,收敛性很难保证,容易出现振荡。
3. Matlab实现要点与代码架构
3.1 求解器选型与Yalmip环境配置
代码实现层面,我推荐用Yalmip做建模语言,后端求解器用Cplex或Gurobi。这个组合在学术界和工业界都是最稳的搭配,没有之一。Yalmip允许你用接近数学公式的语言描述优化问题,不用手工处理矩阵展开,代码可读性高,后期改约束条件也方便。如果只是做线性规划或二次规划,用纯Matlab自带的linprog和quadprog也够;但一旦加入互斥充放电的0-1变量,变成MILP问题,Matlab自带求解器性能和稳定性都偏弱,强烈建议装Gurobi或Cplex。
安装时需要注意版本匹配。Gurobi需要和Matlab版本以及Yalmip版本兼容,Yalmip 2023以上版本对Gurobi 10.x支持最好。装好后在Matlab里运行yalmiptest,看到状态栏显示“Found Gurobi”就说明环境配置成功。
3.2 数据准备:负荷、光伏、电价、碳价
数据是整个模型的地基。我按照典型日的方式准备数据,选了春夏秋冬四个典型日,每个典型日24个时段,覆盖8760小时的代表性场景。每个典型日需要以下数据:
- 各用户的负荷曲线:如果做三个用户,就是3×24的矩阵
- 各用户的光伏出力曲线:同样3×24的矩阵,归一到装机容量后再乘以实际装机
- 分时电价:24维列向量,峰平谷三段设置
- 碳价:一个标量,当前国内碳市场参考价
- 储能技术参数:充放电效率、SOC上下限、自放电率、寿命、单位投资成本
数据来源方面,负荷和光伏曲线可以从学术公开数据集(比如加州微网数据集、国内某园区实测数据)中获取,也可以自行按照典型负荷曲线形态合成。实操中我常用的方法是:从数据集中挑选几个典型日曲线,然后叠加随机扰动生成多个场景,用于后续的场景鲁棒性测试。
3.3 核心代码框架与关键写法
下面给出一段核心的Matlab代码骨架,演示如何用Yalmip定义变量、目标函数和约束条件。这里以单典型日、单用户为例,配置层变量只有两个,调度层变量按24时段展开。
matlab复制%% 初始化
T = 24; % 调度时段数
dt = 1; % 时间间隔(小时)
% 输入数据
P_load = [...]; % 24x1 负荷功率 MW
P_pv = [...]; % 24x1 光伏出力 MW
price_buy = [...]; % 24x1 购电价格 元/MWh
price_sell = [...]; % 24x1 售电价格 元/MWh
% 储能参数
eta_ch = 0.95; % 充电效率
eta_dis = 0.95; % 放电效率
soc_min = 0.1;
soc_max = 0.9;
soc_init = 0.2;
% 成本参数
c_p = 800; % 功率成本 元/kW
c_e = 1500; % 容量成本 元/kWh
c_om = 0.02; % 运维成本 元/kWh
lambda_pen = 50; % 波动惩罚系数
%% 定义决策变量
E_rate = sdpvar(1, 1); % 额定容量 kWh
P_rate = sdpvar(1, 1); % 额定功率 kW
P_ch = sdpvar(T, 1); % 各时段充电功率 kW
P_dis = sdpvar(T, 1); % 各时段放电功率 kW
soc = sdpvar(T+1, 1); % SOC 状态(T+1个点,含初值)
P_grid = sdpvar(T, 1); % 电网交互功率 kW
%% 目标函数
% 套利收益(放电售电 - 充电购电)
R_arb = sum(P_dis .* price_sell * dt - P_ch .* price_buy * dt);
% 年化投资成本
C_inv = crf(0.08, 10) * (c_p * P_rate + c_e * E_rate);
% 运维成本
C_om = c_om * sum(P_ch + P_dis) * dt;
% 波动惩罚成本
P_pen = lambda_pen * sum(abs(P_grid(2:end) - P_grid(1:end-1)));
Objective = R_arb - C_inv - C_om - P_pen;
%% 约束条件
Constraints = [];
% SOC递推约束
Constraints = [Constraints, soc(1) == soc_init];
for t = 1:T
Constraints = [Constraints, soc(t+1) == soc(t) + (eta_ch*P_ch(t) - P_dis(t)/eta_dis)*dt / E_rate];
end
% SOC上下限
Constraints = [Constraints, soc_min <= soc <= soc_max];
% 充放电功率限制
Constraints = [Constraints, 0 <= P_ch <= P_rate];
Constraints = [Constraints, 0 <= P_dis <= P_rate];
% 电网交互功率平衡
Constraints = [Constraints, P_grid == P_load - P_pv - P_dis + P_ch];
% 额定容量和额定功率的非负性
Constraints = [Constraints, P_rate >= 0, E_rate >= 0];
%% 求解
ops = sdpsettings('solver', 'gurobi', 'verbose', 2);
result = optimize(Constraints, -Objective, ops); % 注意目标取负号
%% 结果输出
if result.problem == 0
E_opt = value(E_rate);
P_opt = value(P_rate);
P_ch_opt = value(P_ch);
P_dis_opt = value(P_dis);
soc_opt = value(soc);
fprintf('最优配置:容量 %.2f kWh,功率 %.2f kW\n', E_opt, P_opt);
else
disp('求解失败,请检查约束条件');
end
这个骨架代码里需要注意几个细节:
第一,E_rate出现在分母位置(SOC递推公式里),这在数学上会导致模型变成非线性。标准处理方法是把SOC递推式两边同时乘以E_rate,把乘积项作为新变量处理:
soc(t+1)·E_rate = soc(t)·E_rate + (η_ch·P_ch(t) - P_dis(t)/η_dis)·dt
然后令E_soc = soc·E_rate作为辅助变量,这样等式变成线性。我强烈建议在第一次建模时就采用这个处理方式,不要直接写成除法形式,否则后面求解器会报非线性问题,排查起来非常折腾。
第二,目标函数取负号是因为optimize函数默认做最小化。如果想让目标最大化,就把目标函数取负,然后求解最小化问题。
第三,波动惩罚项用sum(abs(P_grid(2:end) - P_grid(1:end-1))),Yalmip会把这个绝对值自动线性化,不需要手动引入辅助变量。
3.4 结果可视化:让优化结果“看得见”
优化跑完之后,结果可视化是必须做的一步,否则就像算了一大堆数字但压根不知道模型在干什么。我习惯用Matlab绘制四张图:
第一张是储能充放电功率与SOC时序图。横轴是1-24时段,左纵轴显示P_ch和P_dis的柱状图(充电为正、放电为负),右纵轴显示SOC变化曲线。这张图能直观看出储能是否按电价机制在低充高放,SOC是否保持在合理区间。
第二张是电网交互功率曲线和负荷、光伏曲线的叠加图。重点关注P_grid的波动程度,对比有惩罚和无惩罚两种情况下的曲线平滑度差异。
第三张是碳收益的累计曲线,把每个典型日的碳收益画出来,能看出碳交易收入在不同季节对总收益的贡献。
第四张是敏感性分析图,以碳价格为横轴,以最优配置容量为纵轴,看到容量随碳价上升而增长的趋势——这说明碳价越高,储能减排价值越大,越值得配置更大的容量。
matlab复制%% 绘图示例:储能充放电功率与SOC
figure;
yyaxis left;
bar(1:T, P_ch_opt, 'FaceColor', [0.2 0.6 0.8]); hold on;
bar(1:T, -P_dis_opt, 'FaceColor', [0.9 0.4 0.2]);
ylabel('功率 (kW)');
yyaxis right;
plot(1:T+1, soc_opt, 'k-o', 'LineWidth', 1.5);
ylabel('SOC');
xlabel('时段 (h)');
legend('充电功率', '放电功率', 'SOC');
grid on;
4. 结果分析与敏感性讨论
4.1 配置结果与调度行为解读
基于一组典型数据跑完后,我拿到了一组比较合理的结果:最优储能配置为额定功率约2.5MW、额定容量约8MWh,对应2小时左右的储能时长。这个结果符合当前工商业储能项目的常见设计逻辑——容量配置主要受日充放电循环次数约束,2小时储能可以在一天内完成1-2次完整循环,在经济上比较划算。
调度行为上,优化结果清晰呈现了“低充高放”的特征:谷时段(0-6点)充电、峰时段(10-12点、18-20点)放电、平时段的充放电则取决于用户负荷与光伏出力的动态关系。这说明模型正确捕捉了分时电价信号。值得注意的是,由于加入了波动惩罚,储能在峰谷切换时段并没有满功率突跳,而是以一定的爬坡斜率平滑过渡,P_grid曲线整体更平稳,这就是波动惩罚项在起作用的外在表现。
4.2 碳交易价格对配置决策的影响
碳价是模型中最值得做敏感性分析的参数。我扫了碳价从20元/吨到200元/吨的区间,发现一个非常有趣的规律:碳价低于40元/吨时,碳收益对配置决策几乎没有影响,最优容量基本不变;碳价超过60元/吨后,最优容量开始明显上浮;在碳价达到100元/吨以上时,储能配置容量约增加了30%,但边际增量递减。
这说明如果把碳交易纳入投资收益核算,储能项目的经济性会发生实质改变。很多项目在传统模式下算不过账、不敢投资,但把碳收益加进去之后收益率可能提高1-2个百分点。所以在投标可研报告时,“参与碳交易”已经是从可有可无的附加项变成了影响投资决策的关键项。
4.3 波动惩罚系数对调度行为的影响
波动惩罚系数λ_pen的敏感性更加微妙。我分别取λ_pen为0、20、50、100进行对比。当λ_pen=0时,电网交互功率曲线出现明显的“锯齿状”波动,储能在某些时段全功率充放切换;当λ_pen=50时,曲线明显平滑,但总收益下降了约5%;当λ_pen=100时,曲线几乎变成一条直线,储能几乎不再承担峰值调节功能,套利收益大幅缩水,优化结果反而变得不经济。
这里的工程启示是:波动惩罚系数不应该拍脑袋定,而应该根据所在电网对并网波动的容忍度、辅助服务考核标准来确定。可以先用历史并网数据统计出一个“无惩罚”水平下的典型日功率波动最大值,然后逆向设定惩罚系数,让优化结果中的最大波动幅度与电网允许值匹配。
5. 实际调试中的问题与心得
5.1 求解器报错与数值稳定性问题
Yalmip+Gurobi的组合在求解MILP问题时一般很稳,但有几个常见的坑必须提醒。
第一个坑是变量量纲不一致。如果功率用了kW、容量用了MWh、价格用了元/MWh,混在一起求解很容易出现数值病态问题,Gurobi会警告“numerical trouble”甚至直接求解失败。我的做法是统一使用kW、kWh、元/kWh作为基本单位,把价格数据提前换算好,保证矩阵中最大元素与最小元素的差值在1e6以内。
第二个坑是约束条件中的冗余变量。如果在约束中同时写入了soc >= 0和soc <= 1,而SOC变量实际上对应的物理量是百分比标幺值,模型也能跑通,但最优解的解释会变得困难。建议在建模之前就把变量的物理含义和取值范围定义清楚,写进注释里。
第三个坑是sdpvar和binvar混用时的求解效率下降。当T=8760时,如果每个时段都引入一对充放电互斥二进制变量,MILP求解时间可能从几秒飙升到几十分钟。实际工程中可以用“充电时段和放电时段天然分离”的经验来简化模型:设定一个规则,比如电价高于某一阈值时禁止充电、低于某一阈值时禁止放电,这样就不需要二进制变量,问题退化为LP,求解速度快一个数量级。
5.2 模型逻辑错误:储能“只充不放”的怪象
有几次调试时,我发现优化结果里储能一直处于充电状态,几乎不放电,SOC长期顶在0.9的上限。第一反应是约束条件写错了,查了SOC递推、功率平衡,都没发现问题。后来仔细检查目标函数才发现,问题出在放电电价和充电电价的数值设置上——如果充电时段电价高于放电时段电价(或者两个价格差太小),储能在经济上根本没有套利空间,模型自然会选择“只充电不使用”来规避一切风险。
这个案例说明一个核心原则:数学模型不会犯错,但参数一定可能出错。在拿到结果之后,第一件事不是画图,而是检查输入参数是否符合真实的物理逻辑——分时电价是否低充高放、负荷曲线是否贴合实际、光伏出力是否在午间出现峰值等。
5.3 双层优化不收敛的处理
如果读者后续扩展成双层博弈模型,会遇到一个经典问题:上下层交替迭代时目标函数值在一个区间内反复震荡,怎么都收敛不了。传统的高斯-赛德尔迭代对这类问题收敛性很差,原因是上下层决策变量之间的耦合关系太强,一步更新会“矫枉过正”。
我处理这类问题有两个常用手段。第一个是使用逐步阻尼迭代法,即每次迭代后不直接用最新解替换,而是做加权平均:x_new = α·x_calc + (1-α)·x_old,α取0.3-0.5,能有效抑制振荡。第二个是用KKT条件把下层问题直接替换成约束条件,把双层变成单层MILP强解,彻底绕开迭代不收敛的问题。前者的工程实现简单,后者的理论性强、适合写论文。
6. 扩展方向与心得感悟
这套共享储能优化模型跑通之后,可以扩展的方向非常多。首先可以在用户侧增加需求响应机制,让用户不再是被动接受电价,而是根据电价主动调整负荷,这样储能的调度空间会进一步变大。其次可以把模型从确定性优化升级为鲁棒优化或随机优化,用场景法处理光伏出力预测误差的影响。另外,如果目标是从规划层面评估共享储能在整个区域的布局,还需要把地理信息、配电网网架约束加进来,模型会变成二层网络规划问题,复杂度又上了一个台阶。
从我个人实际跑通这套模型的经验来说,最大的体会是:不要试图一开始就建立一个包含所有细节的完美模型。最优的做法是先做一个最简版本——单个用户、单典型日、不考虑碳交易和波动惩罚,跑通之后再逐步增加模块。每增加一个模块,都要单独验证该模块的效果是否符合直觉。比如加了碳交易模块后,看到碳价升高导致配置容量上升;加了波动惩罚模块后,看到电网交互曲线变得平滑。只有每一块都能讲清楚“为什么”,整体模型才算真正吃透了。
最后再分享一个小技巧:做敏感性分析时,不要再用循环跑几百次完整优化,那样太费时间。先在单次优化中把目标函数和约束条件都用Yalmip写好,然后利用Gurobi的warm start机制——小步调整参数后,把上一步的最优解作为初始解传入下一次优化。这个方法能让敏感性分析的计算时间缩短一半以上,而且模型越复杂,加速效果越明显。如果有机会,这个方向的探讨可以之后再单独写一篇详细的案例复盘。
