先说一个做调度项目时经常让人头疼的矛盾:光伏和负荷的预测误差是随着时间尺度缩短而逐步缩小的,但调度决策一旦定下来,想回头改的代价却越来越高。如果只做一个时间尺度的优化,无论算法本身多漂亮,落地运行中总会出现两种结果——要么日前计划太激进,日内根本执行不下去;要么太保守,储能设备白白闲置,该削的峰没削到,该填的谷也没填上。这也是我最终把方案改成“粒子群算法 + 多时间尺度 + 模型预测控制滚动优化”这套组合的直接原因。
这篇文章想聊的,就是这个组合到底怎么搭起来的:日前层为什么选粒子群而不是一上来就上MPC,日内和超短期层为什么又必须切换到MPC滚动优化,三级时间尺度各自的目标函数怎么设计、多目标加权怎么处理,以及整个方案在Matlab里落地时那些文档里不会写清楚的事。适合正在做微电网、智能配电网调度,或者纯粹想搞懂PSO和MPC怎么协同工作的朋友,也适合拿Matlab做仿真的同学作为参考。
1. 三级时间尺度拆解的逻辑:日前、日内、超短期分别解决什么问题
1.1 单一优化窗口为什么管不住新能源波动
先看一个最简单的场景:你做一个24小时的日前调度,用某组历史数据预测了光伏出力曲线和负荷曲线,然后求解出一个蓄电池充放电计划。结果到了第二天,上午十点突然来了一片云,光伏出力比预测值跌了40%。你的日前计划是上午十点让蓄电池放电配合高峰负荷,现在光伏一跌,系统功率缺口比预期大了一圈,储能却已经在按计划放电、没有多少余量。这时候日内调度能做什么?只能干着急。
问题出在预测精度上。光伏功率预测的误差有个基本规律:时间尺度越长,误差越大。24小时级别的预测误差普遍在15%到25%以上,4小时到1小时级别的日内预测能把误差压到10%上下,而15分钟级别的超短期预测误差可以控制在5%以内。只用日前单层优化的话,相当于你拿最粗糙的预测数据去做最不可逆的决策,结果自然不稳定。
所以调度架构必须跟着预测精度走:先把粗颗粒度的计划定下来,然后随着时间推进、预测数据变准了,再去修正短期内的操作。这就是多时间尺度调度最本质的出发点。
1.2 三层时间尺度的窗口设计与刷新频率
我在项目中采用的划分方式比较经典,也是现在论文和工程里最常见的做法:
| 时间尺度 | 预测窗口 | 时间分辨率 | 刷新频率 | 主要职责 |
|---|---|---|---|---|
| 日前调度 | 未来24小时 | 1小时 | 每24小时一次 | 制定全天充放电计划、联络线功率计划 |
| 日内调度 | 未来4小时 | 15分钟 | 每1小时滚动刷新 | 修正日前计划,应对负荷和新能源预测偏差 |
| 超短期调度 | 未来1小时 | 5分钟或15分钟 | 每15分钟滚动刷新 | 平抑快速功率波动,跟踪日内计划 |
这套设计有几个关键点需要展开说。
首先是时间窗口的重叠设计。日内层往前看4小时、每1小时刷新一次,刷新后窗口整体平移一个小时,这个设计是有讲究的:它保证了相邻两次滚动优化之间有4/1=4倍的冗余度,即使某一次优化因为预测突变给出了不太合理的控制量,下一次刷新也有机会修正回来。超短期层的窗口和刷新频率同理,只是把时间尺度缩小到了分钟级。
其次是时间分辨率的匹配问题。日前层用1小时间隔,是因为24小时×1小时刚好生成24个点,决策变量的维度合适,PSO搜索空间不会爆炸。日内层用15分钟是因为在这个时间尺度下追逐5分钟级的变化没有意义——预测模型根本撑不起那么细的精度。超短期层把分辨率压缩到5分钟到15分钟,才能对光伏云层遮挡这种秒级到分钟级的变化做出响应。
这里有一个新手经常犯的错误:把三层的时间分辨率全设成一样,比如全都用15分钟。表面上看是简化了实现,实际上把多时间尺度的意义抹掉了一半。日内层用15分钟分辨率往前看4小时,那是16个控制点,可在超短期层里,15分钟分辨率往前看1小时才4个点,控制器还没反应过来窗口就滚完了。三层的时间分辨率理应是逐级加密的。
1.3 各层预测信息的不确定性差异决定了策略差异
三层之间最本质的区别不是窗口和分辨率,而是“你所面对的预测不确定性有多大”。这个区别直接决定了各层目标函数的设计方向。
日前层的预测不确定性最大,所以它不应该过度追求精细跟踪,它的任务是把储能安排在大概率正确的时段,确保全天经济性最优。日内层面对的是中等级别的预测误差,这时候就需要在保持经济性的前提下,让实际出力尽量贴近日前计划——否则联络线功率会超出合同约束,产生考核费用。超短期层面对的预测误差最小,但此时扰动也最频繁,控制目标应该转向功率平抑:减少出力波动、延长储能寿命、维持系统稳定性。
在代码实现层面,三层需要传递的数据也不同。日前层传给日内层的是一整天的计划值序列,日内层把未来4小时的计划从全局计划中截取出来作为跟踪参考;日内层传给超短期层的则是未来1小时的高分辨率计划值。每层优化结束后,还要把最新的储能SOC、实际出力值回传给上一层,作为下一轮滚动优化的初始状态。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 日前调度层:PSO寻优框架与多目标加权目标函数设计
2.1 目标函数怎么构造:经济性、跟踪偏差与SOC三方取舍
日前调度层是整个调度架构的“大盘子”,它的目标函数必须兼顾多个方面。我在项目里选了三个最核心的目标:运行经济性、日前计划跟踪偏差、储能SOC维持。
经济性目标很好理解,就是让系统总运行成本最小,包括购电成本、储能充放电老化成本、弃光惩罚等。用公式表示的话:
matlab复制C1 = sum(price.' * P_grid) + sum(battery_cost_coef * abs(P_bat)) + sum(curtail_penalty * P_curtail);
这里price是分时电价向量,P_grid是联络线购电功率序列,P_bat是储能功率序列,P_curtail是弃光功率。储能老化成本用一个和充放电功率绝对值成正比的系数来近似——这个简化是工程上常用的处理方法,真要精细化可以考虑充放电深度循环老化模型,但日前层的颗粒度不需要那么细。
计划跟踪偏差目标是为了让系统的实际联络线功率不要偏离上级调度给定的参考值太远。在并网运行模式下,联络线功率超出合同范围会面临考核,所以这里用联络线功率偏差的平方和来衡量:
matlab复制C2 = sum((P_grid - P_scheduled).^2);
储能SOC维持目标是为了防止SOC在一天内被推到极限。锂离子电池长期工作在SOC>90%或SOC<20%的区间会加速衰减,所以对超出理想区间的部分加一个惩罚。
matlab复制soc_penalty = sum(max(0, SOC_ub - SOC).^2 + max(0, SOC - SOC_lb).^2);
2.2 多目标加权的核心:权重系数不是拍脑袋定的
现在问题来了:三个目标量纲不一样,经济性目标的数值动辄几百上千,SOC惩罚项可能只有个位数,直接把三项加起来,SOC项就会被淹没。所以必须做归一化处理。
我常用的做法是先单独跑两次极端工况:一次只优化经济性,得到最优经济成本C1_min;一次只优化SOC维持,得到对应的最优惩罚值C3_min。然后用C1/C1_min这种相对值代替绝对值参与加权。这样三项的数值都落在1数量级附近,权重系数设定才有意义。
权重本身怎么定?早期我尝试过直接手动调,第一轮跑完看结果,哪个目标不满意就调大对应权重。这种方式的问题在于目标之间是强耦合的,往往按下葫芦浮起瓢。后来我改用了一种相对靠谱的策略:先给一组初始权重,比如w = [0.6, 0.2, 0.2],跑完以后检查三个归一化目标值分布:
- 如果经济性目标值远低于1(说明经济性已经远超最优解),说明权重给多了,往下调;
- 如果SOC维持项一直在惩罚阈值附近触发,说明权重给少了,往上调;
- 计划跟踪偏差目标如果数值很大,说明储能容量根本不够同时满足经济性和跟踪需求,这时候不是调权重能解决的,得考虑优化方案里是否应该允许弃光。
反复迭代两三轮,就能得到一套能用的权重系数。如果你有时间,更严格的做法是画帕累托前沿,用单纯形法或者NNC法去选点,但工程项目中,通常跑两三轮迭代就差不多了。
2.3 粒子群算法在Matlab中的核心实现
我选粒子群算法作为日前层的寻优算法,原因有三个:第一,日前层的决策变量是24小时的储能功率序列(有时还包括联络线功率和弃光量),这是一个连续、非线性、带约束的优化问题,PSO不需要求梯度,处理这种问题很顺手;第二,PSO实现简单,核心代码不超过80行,调参就三个(惯性权重、两个加速系数),对比遗传算法那些选择、交叉、变异算子,工程负担小很多;第三,多起点并行搜索的特性让它不容易陷入局部最优,这在目标函数非凸的情况下特别重要。
核心循环结构大致是这样一个模板:
matlab复制%% PSO参数设定
N = 50; wish = 200; vb = 24; % 粒子数, 迭代次数, 决策变量维数
c1 = 1.5; c2 = 1.5; % 个体学习因子与群体学习因子
w_max = 0.9; w_min = 0.4; % 惯性权重上下限,线性递减
%% 初始化种群
LB = repmat(-P_bat_max, 1, vb); % 储能最小出力(负表示充电)
UB = repmat(P_bat_max, 1, vb); % 储能最大出力(正表示放电)
X = repmat(LB, N, 1) + rand(N, vb) .* repmat(UB-LB, N, 1);
V = zeros(N, vb);
pbest = X;
gbest = zeros(1, vb);
pbest_fit = inf(N, 1);
gbest_fit = inf;
%% 主循环
for t = 1:wish
w = w_max - (w_max - w_min) * t / wish;
for i = 1:N
fit = daily_objective(X(i,:), data, w_coef);
if fit < pbest_fit(i)
pbest_fit(i) = fit;
pbest(i,:) = X(i,:);
end
if fit < gbest_fit
gbest_fit = fit;
gbest = X(i,:);
end
end
V = w * V + c1 * rand(N, vb) .* (pbest - X) + c2 * rand(N, vb) .* repmat(gbest, N, 1) - X;
X = X + V;
X = max(LB, min(UB, X)); % 边界约束处理
end
这里需要重点说为什么惯性权重要线性递减。粒子群算法搜索初期希望粒子飞得远一点、探索范围大一点,所以惯性权重要高(0.9附近),后期希望粒子在最优解附近精细搜索,所以权重要降下来(0.4附近)。如果不做递减,固定用一个中等权重,经常会出现前期收敛太慢、后期震荡收敛不了的情况。
还有一个容易踩的坑:粒子群里的SOC等式约束。储能SOC是功率的累积函数,它不是一个可以直接写成边界约束的量,SOC(k) = SOC(k-1) - P_bat(k) * dt / Cap。如果你在上面循环里只夹了P_bat的上下限,没有管SOC,跑出来的结果十有八九是SOC越界。我的处理方式是把SOC约束转成惩罚项放进目标函数:
matlab复制%% 目标函数内计算SOC
SOC = SOC_init - cumsum(P_bat) * dt / Cap;
SOC_infeasible = sum(max(0, SOC-0.9).^2 + max(0, 0.2-SOC).^2);
fit = w(1)*C1/norm1 + w(2)*C2/norm2 + w(3)*SOC_infeasible + pen*1e6;
注意最后那个pen*1e6,我加了硬性约束标志位:如果充放电功率导致SOC出现负值这类物理不可行情况,直接把适应度赋值为一个很大的数(pen作为惩罚系数设为1e6),这样粒子群会自然淘汰掉这群不可行解。
2.4 为什么日前层用PSO而不是直接用MPC
我经常被问:既然日内层和超短期层都用MPC,为什么日前层不也用MPC,省得来回切换算法?
答案是MPC擅长的东西日前层用不上。日前层的信息是24小时粗粒度预测,不是实时反馈系统,不需要滚动修正——一旦修正,就相当于把日前计划变成一个时变的参考值,日内层的跟踪目标就没了。而且日前层的问题规模大、非线性强(要考虑电池老化模型的话更是高度非线性),MPC的标准解法要求问题基本能写成线性二次型或者可求导的形式。硬把这类问题压成MPC能解的格式,精度损失太大。
选型逻辑总结下来就是:全局寻优阶段用全局优化算法(PSO),局部跟踪修正阶段用滚动控制器(MPC)。前者负责“找对方向”,后者负责“走稳路”。
3. 日内层与超短期层:MPC滚动优化在Matlab中的落地细节
3.1 MPC的核心机制和一票否决的约束处理
MPC与PSO最大的不同在于它天然适配“在线滚动”的调度模式。它的运行机制可以拆成三步:预测、优化、反馈。
在日内层,每个控制周期开始时,控制器基于当前测量值(比如当前的负荷功率、光伏出力、储能SOC)和最新的预测信息,在未来4小时的预测窗口内求解一个有限时域优化问题,得到未来16个控制量。但控制器只执行第一个控制量,执行完一个周期后,系统状态更新了、预测信息也刷新了,再滚动推进重新求解。这就是“滚动优化”的含义。
Matlab里自带的Model Predictive Control Toolbox有专门的控制器对象,可以直接设置PredictionHorizon、ControlHorizon、Weights.ManipulatedVariables等参数。但工具箱有一个让我比较难受的地方:对于自定义的目标函数(比如我要引入非线性的储能老化惩罚),它处理起来很费劲,建模灵活性不够。所以我在项目里更多是用Matlab自带的quadprog直接解MPC的二次规划,控制逻辑全部自己写。
matlab复制%% 日内MPC:基于状态空间模型构建QP
A_q = system_matrix; % 预测模型离散化后的系数矩阵
B_q = input_matrix;
Q = diag(repmat([10, 0.5], 1, 3)); % 状态权重矩阵
R = diag(0.1 * ones(Nc, 1)); % 控制增量权重矩阵
Np = 16; Nc = 4;
H = 2 * (B_q' * Q * B_q + R);
f = -2 * B_q' * Q * (y_ref - A_q * x_now);
lb = repmat(P_bat_min, Nc, 1);
ub = repmat(P_bat_max, Nc, 1);
Aineq = []; bineq = []; % 这里把复杂约束放进罚函数或预过滤
u_opt = quadprog(H, f, Aineq, bineq, [], [], lb, ub, [], options);
u_now = u_opt(1); % 只执行第一个控制量
这段代码里面有个很重要的细节:MPC模型的离散化。你如果直接从连续时间模型出发,一定要用c2d函数转成离散状态空间模型,并注明采样时间Ts。我见过有同学直接拿连续模型系数塞进MPC,结果预测时域和模型完全对不上号,控制效果发散得一塌糊涂。
3.2 日内层目标函数:修正日前计划的偏差,而不是推倒重来
日内调度层设计的核心思路是:它不是去推翻日前计划,而是去修正日前计划。举个例子,日前计划让储能10点开始放电,负荷实际需求比预测的低,日内层要做的不是讨论“10点该不该放电”这种宏观问题,而是在尽量维持整体出力趋势的前提下,对放电功率进行小幅调整,保证联络线功率不大幅偏离日前计划。
所以日内层的目标函数长这样:
matlab复制J_intra = sum(w_track * (P_grid - P_dayahead_ref).^2 + w_pen * abs(P_bat - P_bat_dayahead).^2);
第一个平方项是联络线功率对日前计划的跟踪偏差,第二个平方项是储能功率相对日前计划的变化量,也就是控制增量惩罚。后一项实际上在MPC配置里体现为R矩阵。
为什么要加第二个控制增量惩罚?我踩过坑:单纯跟踪联络线功率时,MPC控制器为了让联络线功率贴合日前计划,可能会让储能功率在相邻几个周期里大幅摆动——这个摆动幅度即便在功率约束以内,对储能循环寿命的影响也很大。引入R矩阵以后,控制器会天然偏好平滑的控制序列,这是MPC工程化落地里非常关键的一个细节。
3.3 超短期层目标函数:平抑快速波动,保护设备,稳定电压
超短期层的博弈对象不是计划值,而是分钟级的随机波动。光伏出力的变化主要由云层遮挡造成,功率变化率可以达到每分钟10%以上。超短期控制的目标从“跟踪计划”转向“平抑波动”。
这一层的目标函数通常是这样的:
matlab复制J_ultra = sum(w_smooth * (P_grid(k) - P_grid(k-1)).^2 + w_ref * (P_grid - P_intra_ref).^2);
第一项是联络线功率相邻周期变化量的平方和,这一项越小说明联络线功率越平滑,向上级电网输送的功率波动越小。第二项是联络线功率对日内计划参考值的跟踪,防止控制器为了过度平滑而跑飞。
同时要设置充放电功率变化率约束。储能设备的实际物理限制是,单位时间内功率调整幅度有限(取决于变流器的爬坡能力),除了普通的lb和ub,还要加:
matlab复制deltaP_max = 0.1 * P_bat_rated; % 每周期最大功率变化量
Aineq = [tril(ones(Nc,Nc)), -tril(ones(Nc,Nc))];
bineq = repmat(deltaP_max * ones(Nc,1), 2, 1);
这里用了一个小技巧:把连续Nc步的累积控制增量约束转成不等式约束矩阵,而不是直接限制每一步的控制增量。因为MPC优化的是整个控制时域上的序列,如果只限制单步增量的绝对值,后续步之间可能出现累积漂移,导致控制序列整体偏移出可接受的范围。
3.4 超短期层在滚动刷新频率上的边界问题
超短期层的MPC滚动刷新周期是15分钟,意味着每15分钟要重新做一次预测和优化。这带来一个问题:Matlab里如果你把全过程仿真和MPC控制器放在同一个脚本里顺序执行,仿真时间拉长以后,滚动刷新次数会非常多,每次都要重解一次QP,总耗时可能达到分钟级甚至小时级。
我在项目里做了两个优化。第一,只在扰动大的时段使用全时域重优化模式,负荷平稳、光伏波动小时可以降低刷新频率,比如每30分钟刷新一次,减少计算负担。第二,对控制时域做了截断处理:控制时域Nc=4(1小时),预测时域Np=16(4小时)。超出控制时域的部分,假设控制量保持不变。这样Q和H矩阵的规模被大幅压缩,QP求解速度可以提升一个数量级。
4. 三层协调机制:计划逐级传递,目标逐级细化
4.1 日前计划怎么变成日内层的跟踪参考
三层调度不是三个孤立的优化器各自跑,而是通过“计划值层层传递”连在一起的。日前层优化结束后输出的是一整天的储能功率序列P_bat_day(1:24)、联络线功率序列P_grid_day(1:24),每个点对应一小时。
日内层初始化时,读入这两个序列,然后将小时级序列线性插值成15分钟颗粒度的参考轨迹。这里线性插值有一个坑:如果日前层在10点到11点之间的储能功率从放电200kW跳变到充电150kW,线性插值会产生一条斜线,而这个斜线在物理上根本不可行——储能不允许在中间某个时刻直接翻转充放电状态,实际必须经过0点。
我最终的处理方式是:不直接插值充放电功率,而是插值SOC轨迹,再对SOC轨迹差分得到功率序列。这样得到的参考轨迹天然满足SOC连续性条件,不会出现物理上不可能的功率跳变。
4.2 日内层与超短期层的级联方式:上下行数据流
日内层与超短期层之间我采用了“约束级联”和“参考值级联”并行的方式。
- 参考值级联:超短期层的联络线功率参考值来自日内层最新的优化结果,一般取日内层预测窗口前1小时的轨迹作为超短期层的跟踪目标。
- 约束级联:日内层计算出的最恶劣工况下的电压偏差、功率安全裕度,会作为超短期层优化问题的额外边界条件。比如说,日内层发现某个时段配电台区电压可能越上限,就会把这部分信息传递到超短期层,超短期层在这个时段内额外限制储能放电功率,避免电压继续攀升。
这种双通道级联的优势在于:既保证了超短期层有明确的跟踪目标,又让它充分意识到日内层察觉到的安全约束,不会出现“日内层看电压没问题,超短期层一个冲动把电压推越限”的脱节。
4.3 目标冲突的仲裁:动态调权的实现思路
三级目标发生冲突是很常见的。比如日前层为了经济性优化,安排储能在夜间谷电时段大量充电——这个决策没有问题。但有两天晚上风特别大,光伏预测几乎为零,负荷又特别低,如果严格执行日前充电计划,储能充满后没有足够负荷消纳,反而会造成弃风。这时候日内层的跟踪目标(联络线功率贴合日前计划)和经济性目标(不产生弃风惩罚)就对着干了。
我的做法是在目标函数里引入动态权重的机制。当检测到弃风/弃光惩罚项持续处于激活状态时,自动压缩计划跟踪目标的权重,放大经济性目标的权重。反过来,当系统运行平稳、各项约束都远离边界时,又恢复到默认权重。动态权重用一个sigmoid函数过渡:
matlab复制curtail_ratio = mean(curtail_penalty_active) / mean(curtail_penalty_history + eps);
w_track_dyn = w_track_nominal * (1 - 0.5 / (1 + exp(-10*(curtail_ratio - 0.3))));
这样既不会因为突发扰动一下子把权重调得过快,又能在持续偏差场景下最终切换到正确的目标优先级上。
5. 仿真踩坑记录与调参经验:权重配平、预测修正和求解性能
5.1 权重配平中最容易忽略的边界情况
我花了一个多星期调权重,最后发现最影响结果的不是权重本身,而是权重对边界工况的敏感度。目标函数的三个分项在不同工况下数值差异非常大:夜晚负荷低谷期,经济性目标和SOC维持项几乎不起作用,跟踪偏差项主导全局;白天光伏大发时段,弃光惩罚项动辄上千,直接把其他项的权重淹没。
我的解决方法是分层配置权重,也就是把权重按照“时间段”切分。夜间时段只约束功率上下限和联络线功率偏差,目标函数只保留经济性项;白天时段再加入弃光惩罚和SOC维持项。代码上就是给目标函数前乘一个随时刻变化的分段系数。这样做效果显著:最终储能SOC曲线明显更平稳,而且整个调度结果没有夜间跟踪过紧、白天反应过慢的别扭感。
5.2 预测模型不匹配:MPC失稳的根源
MPC控制效果很大程度上依赖于预测模型的准确性。我的第一个版本里,日内层用的预测模型直接把日前层的线性化模型拿过来用,没做任何修正。仿真跑下来发现一个怪现象:MPC预测窗口内的轨迹跟实际仿真轨迹偏差越来越大,到第四个小时远端部分偏差已经大到不可接受。
排查后发现,问题出在日前层模型里把负荷当成恒定值处理,而实际负荷是跟温度强相关的时变量。解决方式并不复杂,加一个在线修正环节:
matlab复制%% 在线预测修正
error_now = y_measure - y_model_predict; % 当前时刻的模型预测误差
error_filtered = 0.8 * error_filtered_prev + 0.2 * error_now; % 一阶低通滤波
y_ref_corrected = y_ref_predict + error_filtered; % 修正后的参考轨迹
这个修正的本质是给MPC反馈项增加了一个扰动补偿通道。滤波器系数0.8/0.2意味着校正量以20%的比例吸收最新误差,避免单次误差噪声直接扭曲参考轨迹。这个做法基本是传统MPC里扰动观测器的简化版,虽然粗糙,但效果立竿见影。
5.3 Matlab求解性能:把仿真时间从小时级压到分钟级
整个三层调度做联合仿真时,最让人崩溃的是计算时间。第一版全跑完需要将近四个小时,后来做了三处优化,压到二十分钟左右:
- 打了局部重规划:日前层只当环境发生大的变化时才重新运行PSO,正常运行时直接复用上次的优化结果,只在日内层和超短期层做滚动更新。
- 对MPC的QP问题做矩阵预分解:由于MPC的H矩阵和约束矩阵在参数不变的情况下是常数,可以使用
quadprog的热启动机制,避免每次求解时重复分解矩阵。 - 用并行计算跑多组场景:用
parfor替代普通for循环跑灵敏度分析,在四核机器上能稳定提速三倍。
关于热启动,具体做法是第一次调用quadprog时把求解器信息保存到options结构体里,后续每一轮滚动优化传同样的options进去。需要注意控制时域和预测时域不变时才能用热启动,如果参数变了,矩阵结构也会变,热启动反而可能报错。
5.4 一套可复用的参数调优起点
最后给出一组我这边实测比较稳定的起始参数,不同项目可以在此基础上调:
| 参数 | 日前PSO | 日内MPC | 超短期MPC |
|---|---|---|---|
| 粒子数/预测时域 | 50 | Np=16(4h) | Np=12(3h) |
| 迭代次数/控制时域 | 200 | Nc=4(1h) | Nc=4(1h) |
| 惯性权重区间 | 0.9→0.4 | - | - |
| 学习因子c1/c2 | 1.5/1.5 | - | - |
| 采样时间 | 1h | 15min | 5min |
| 经济性权重 | 0.5 | - | - |
| 跟踪权重 | 0.3 | Q=10 | Q=5 |
| 平滑权重 | - | R=0.1 | R=0.05 |
这组参数对应的场景是一个包含光伏、储能、固定负荷的并网微电网,储能额定功率200kW、容量400kWh,联络线功率上限500kW。
个人的实际体会是,这个项目里最难的不是算法本身,而是三层之间数据接口的处理——计划序列的插值、预测误差的在线修正、约束条件的传递,任何一个环节偷懒都会在仿真结果里暴露出来。所以强烈建议你写代码时,第一版先别急着堆功能,把三层之间的数据流画清楚,写成结构体或者类来封装,比如每个调度层对应一个结构体,内含plan、state、prediction、result四个字段,逐层调用时接口统一,这样后面改权重、调时域都会省很多事。
