一、模型框架与核心思路
1.1 双层调度架构
- 上层(日前调度) :以24小时为周期、1小时为分辨率,优化机组启停、储能日计划、电网交易计划,目标为最小化期望运行成本(考虑风光预测不确定性)。
- 下层(日内滚动调度) :以4小时为滚动窗口、15分钟为分辨率,基于超短期预测(风光/负荷)和实时状态,调整机组出力、储能充放电,目标为最小化调整成本+运行风险。
1.2 多时间尺度协调
- 日前计划:作为下层的参考基准,提供机组启停、储能初始计划。
- 日内滚动:每15分钟更新一次,用当前实际状态修正日前计划,应对风光/负荷波动。
二、数学模型
2.1 上层模型(日前调度)
目标函数(最小化总运行成本)
min∑t=124(CtGT+CtESS+Ctgrid+Ctcurt+CtDR) \min \sum_{t=1}^{24} \left( C_t^{\text{GT}} + C_t^{\text{ESS}} + C_t^{\text{grid}} + C_t^{\text{curt}} + C_t^{\text{DR}} \right) mint=1∑24(CtGT+CtESS+Ctgrid+Ctcurt+CtDR)
- CtGTC_t^{\text{GT}}CtGT:燃气轮机成本(二次燃料成本+启停成本)
- CtESSC_t^{\text{ESS}}CtESS:储能充放电成本
- CtgridC_t^{\text{grid}}Ctgrid:电网购售电成本
- CtcurtC_t^{\text{curt}}Ctcurt:弃风弃光惩罚
- CtDRC_t^{\text{DR}}CtDR:需求响应成本
核心约束
- 功率平衡 :PGT,t+PPV,t+PWT,t+Pdis,t+Pbuy,t=Pload,t+Pch,t+Psell,t+PDR,tP_{\text{GT},t} + P_{\text{PV},t} + P_{\text{WT},t} + P_{\text{dis},t} + P_{\text{buy},t} = P_{\text{load},t} + P_{\text{ch},t} + P_{\text{sell},t} + P_{\text{DR},t}PGT,t+PPV,t+PWT,t+Pdis,t+Pbuy,t=Pload,t+Pch,t+Psell,t+PDR,t
- 燃气轮机 :PGTminut≤PGT,t≤PGTmaxutP_{\text{GT}}^{\min} u_t \leq P_{\text{GT},t} \leq P_{\text{GT}}^{\max} u_tPGTminut≤PGT,t≤PGTmaxut(启停状态ut∈{0,1}u_t \in \{0,1\}ut∈{0,1}),爬坡约束ΔPGT,t≤Rup\Delta P_{\text{GT},t} \leq R_{\text{up}}ΔPGT,t≤Rup,最小启停时间约束
- 储能 :Et+1=Et+ηchPch,tΔt−Pdis,tΔtηdisE_{t+1} = E_t + \eta_{\text{ch}} P_{\text{ch},t} \Delta t - \frac{P_{\text{dis},t} \Delta t}{\eta_{\text{dis}}}Et+1=Et+ηchPch,tΔt−ηdisPdis,tΔt,SOC范围Emin≤Et≤EmaxE^{\min} \leq E_t \leq E^{\max}Emin≤Et≤Emax
- 电网交互 :0≤Pbuy,t≤Pbuymax0 \leq P_{\text{buy},t} \leq P_{\text{buy}}^{\max}0≤Pbuy,t≤Pbuymax,0≤Psell,t≤Psellmax0 \leq P_{\text{sell},t} \leq P_{\text{sell}}^{\max}0≤Psell,t≤Psellmax,购售电互斥
2.2 下层模型(日内滚动调度)
目标函数(最小化调整成本+风险)
min∑k=1K(ΔCkadj+ρ⋅CVaRα(imbalancek)) \min \sum_{k=1}^{K} \left( \Delta C_k^{\text{adj}} + \rho \cdot \text{CVaR}_\alpha(\text{imbalance}_k) \right) mink=1∑K(ΔCkadj+ρ⋅CVaRα(imbalancek))
- ΔCkadj\Delta C_k^{\text{adj}}ΔCkadj:机组/储能/电网调整成本
- CVaRα\text{CVaR}_\alphaCVaRα:条件风险价值(衡量功率不平衡风险)
滚动优化框架
- 窗口长度:4小时(16个15分钟时段)
- 预测时域:4小时(基于超短期预测更新风光/负荷)
- 状态更新:每15分钟用实际状态修正储能SOC、机组出力
三、MATLAB实现(完整代码)
3.1 主程序框架
matlab
%% 多能源微网双层调度主程序
clear; clc; close all;
%% 1. 参数初始化
params = init_params(); % 系统参数(设备、时间、成本系数等)
data = load_data(); % 加载负荷、风光预测、电价数据
%% 2. 上层:日前调度(24小时,1小时间隔)
[day_ahead_plan, cost_da] = day_ahead_optimization(data, params);
%% 3. 生成不确定性场景(风光/负荷波动)
scenarios = generate_scenarios(data, params);
%% 4. 下层:日内滚动调度(4小时窗口,15分钟间隔)
[intraday_plan, cost_rt] = intraday_rolling_optimization(day_ahead_plan, scenarios, data, params);
%% 5. 结果可视化与分析
plot_results(day_ahead_plan, intraday_plan, data, params);
3.2 参数初始化(init_params.m)
matlab
function params = init_params()
% 时间参数
params.T_da = 24; % 日前时段数(小时)
params.dt_da = 1; % 日前时间步长(小时)
params.T_rt = 16; % 日内滚动窗口时段数(4小时=16×15分钟)
params.dt_rt = 0.25; % 日内时间步长(小时)
% 设备参数
params.P_GT_min = 20; % 燃气轮机最小出力 (kW)
params.P_GT_max = 200; % 燃气轮机最大出力 (kW)
params.R_up = 50; % 向上爬坡率 (kW/h)
params.R_down = 50; % 向下爬坡率 (kW/h)
params.T_on_min = 2; % 最小开机时间 (h)
params.T_off_min = 2; % 最小停机时间 (h)
params.C_SU = 100; % 启动成本 (元)
params.C_SD = 50; % 停机成本 (元)
params.a = 0.01; % 燃料成本系数a (元/kW²)
params.b = 0.5; % 燃料成本系数b (元/kW)
params.E_ESS_max = 500; % 储能最大容量 (kWh)
params.E_ESS_min = 50; % 储能最小容量 (kWh)
params.P_ch_max = 100; % 最大充电功率 (kW)
params.P_dis_max = 100; % 最大放电功率 (kW)
params.eta_ch = 0.95; % 充电效率
params.eta_dis = 0.95; % 放电效率
params.E0_ESS = 250; % 初始SOC (kWh)
params.P_buy_max = 300; % 最大购电功率 (kW)
params.P_sell_max = 300; % 最大售电功率 (kW)
% 成本系数
params.lambda_buy = [0.5*ones(1,8), 0.8*ones(1,8), 0.5*ones(1,8)]; % 购电价 (元/kWh)
params.lambda_sell = 0.3*ones(1,24); % 售电价 (元/kWh)
params.alpha_ESS = 0.05; % 储能运行成本 (元/kWh)
params.beta_curt = 0.3; % 弃风弃光惩罚 (元/kWh)
params.gamma_DR = 0.8; % 需求响应成本 (元/kWh)
end
3.3 上层日前优化(day_ahead_optimization.m)
用YALMIP+Gurobi求解混合整数二次规划(MIQP):
matlab
function [plan, cost] = day_ahead_optimization(data, params)
T = params.T_da;
% 定义决策变量
P_GT = sdpvar(T,1); % 燃气轮机出力
u_GT = binvar(T,1); % 启停状态 (0-1)
y_GT = binvar(T,1); % 启动标志
z_GT = binvar(T,1); % 停机标志
P_ch = sdpvar(T,1); % 储能充电
P_dis = sdpvar(T,1); % 储能放电
E_ESS = sdpvar(T,1); % 储能SOC
P_buy = sdpvar(T,1); % 购电
P_sell = sdpvar(T,1); % 售电
P_PV = sdpvar(T,1); % 光伏实际出力
P_WT = sdpvar(T,1); % 风电实际出力
P_DR = sdpvar(T,1); % 需求响应
% 目标函数
cost = 0;
for t=1:T
cost = cost + params.a*P_GT(t)^2 + params.b*P_GT(t) + params.C_SU*y_GT(t) + params.C_SD*z_GT(t); % 燃气轮机
cost = cost + params.alpha_ESS*(P_ch(t)+P_dis(t)); % 储能
cost = cost + params.lambda_buy(t)*P_buy(t) - params.lambda_sell(t)*P_sell(t); % 电网
cost = cost + params.beta_curt*(data.P_PV_forecast(t)-P_PV(t) + data.P_WT_forecast(t)-P_WT(t)); % 弃风弃光
cost = cost + params.gamma_DR*P_DR(t); % 需求响应
end
% 约束条件
constraints = [];
% 功率平衡
for t=1:T
constraints = [constraints, P_GT(t)+P_PV(t)+P_WT(t)+P_dis(t)+P_buy(t) == data.P_load(t)+P_ch(t)+P_sell(t)+P_DR(t)];
end
% 燃气轮机启停与爬坡
for t=1:T
constraints = [constraints, params.P_GT_min*u_GT(t) <= P_GT(t) <= params.P_GT_max*u_GT(t)];
if t>1, constraints = [constraints, -params.R_down <= P_GT(t)-P_GT(t-1) <= params.R_up]; end
constraints = [constraints, y_GT(t)-z_GT(t) == u_GT(t)-u_GT(t-1), y_GT(t)+z_GT(t)<=1]; % 启停逻辑
end
% 储能SOC
for t=1:T
if t==1, E_prev = params.E0_ESS; else E_prev = E_ESS(t-1); end
constraints = [constraints, E_ESS(t) == E_prev + params.eta_ch*P_ch(t)*params.dt_da - P_dis(t)*params.dt_da/params.eta_dis];
constraints = [constraints, params.E_ESS_min <= E_ESS(t) <= params.E_ESS_max];
end
% 电网交互
for t=1:T, constraints = [constraints, 0<=P_buy(t)<=params.P_buy_max, 0<=P_sell(t)<=params.P_sell_max, P_buy(t)*P_sell(t)==0]; end
% 求解
ops = sdpsettings('solver','gurobi','verbose',0);
optimize(constraints, cost, ops);
% 提取结果
plan.P_GT = value(P_GT); plan.u_GT = value(u_GT);
plan.P_ch = value(P_ch); plan.P_dis = value(P_dis); plan.E_ESS = value(E_ESS);
plan.P_buy = value(P_buy); plan.P_sell = value(P_sell);
cost = value(cost);
end
3.4 场景生成与削减(generate_scenarios.m)
用拉丁超立方采样生成风光/负荷波动场景,Kantorovich距离削减至5个典型场景:
matlab
function scenarios = generate_scenarios(data, params)
N = 100; % 初始场景数
T = params.T_da;
samples = lhsdesign(N, 3*T); % 3个不确定性源(负荷、光伏、风电)
% 生成场景
for s=1:N
scenarios(s).P_load = data.P_load .* (1 + 0.1*(2*samples(s,1:T)-1)); % 负荷±10%波动
scenarios(s).P_PV = data.P_PV_forecast .* (1 + 0.15*(2*samples(s,T+1:2*T)-1)); % 光伏±15%
scenarios(s).P_WT = data.P_WT_forecast .* (1 + 0.2*(2*samples(s,2*T+1:3*T)-1)); % 风电±20%
end
% 场景削减(Kantorovich距离)
scenarios = scenario_reduction(scenarios, 5); % 削减至5个场景
end
3.5 下层日内滚动优化(intraday_rolling_optimization.m)
4小时滚动窗口,15分钟分辨率,用YALMIP求解调整量:
matlab
function [plan_rt, cost_rt] = intraday_rolling_optimization(plan_da, scenarios, data, params)
T_rt = params.T_rt; % 16个15分钟时段
cost_rt = 0;
plan_rt = plan_da; % 初始化为日前计划
for win_start=1:4:24 % 每4小时滚动一次(共6个窗口)
win_end = min(win_start+3, 24); % 窗口结束时段
% 获取当前状态(储能SOC、机组出力)
E_current = plan_rt.E_ESS(win_start);
% 超短期预测(风光/负荷)
P_PV_pred = data.P_PV_forecast(win_start:win_end) .* 0.9; % 示例:预测值打9折
P_WT_pred = data.P_WT_forecast(win_start:win_end) .* 1.1;
P_load_pred = data.P_load(win_start:win_end) .* 1.05;
% 定义调整量变量
dP_GT = sdpvar(T_rt,1); % 燃气轮机调整
dP_ch = sdpvar(T_rt,1); % 储能充电调整
dP_dis = sdpvar(T_rt,1); % 储能放电调整
% 目标函数:调整成本+CVaR风险
cost = 0;
for t=1:T_rt
cost = cost + 0.1*abs(dP_GT(t)) + 0.05*(abs(dP_ch(t))+abs(dP_dis(t))); % 调整成本
end
% CVaR风险(简化版:功率不平衡期望)
for s=1:length(scenarios)
imbalance = P_load_pred - (P_PV_pred + P_WT_pred + plan_da.P_GT(win_start:win_end) + dP_GT);
cost = cost + 0.2*scenarios(s).prob * sum(max(0, imbalance)); % 风险惩罚
end
% 约束:调整量限制
constraints = [];
for t=1:T_rt
constraints = [constraints, -20 <= dP_GT(t) <= 20, % 燃气轮机调整±20kW
-50 <= dP_ch(t) <= 50, dP_ch(t)*dP_dis(t)==0, % 储能充放电互斥
-50 <= dP_dis(t) <= 50];
end
% 求解调整量
ops = sdpsettings('solver','gurobi','verbose',0);
optimize(constraints, cost, ops);
% 应用调整(仅第一个时段)
plan_rt.P_GT(win_start) = plan_da.P_GT(win_start) + value(dP_GT(1));
plan_rt.P_ch(win_start) = plan_da.P_ch(win_start) + value(dP_ch(1));
plan_rt.P_dis(win_start) = plan_da.P_dis(win_start) + value(dP_dis(1));
cost_rt = cost_rt + value(cost);
end
end
3.6 结果可视化(plot_results.m)
matlab
function plot_results(plan_da, plan_rt, data, params)
t = 1:24;
figure;
% 1. 功率平衡
subplot(3,1,1);
plot(t, data.P_load, 'k-', 'LineWidth',2, 'DisplayName','负荷');
hold on;
plot(t, plan_da.P_GT+plan_da.P_PV+plan_da.P_WT+plan_da.P_dis, 'b-', 'DisplayName','总发电');
plot(t, plan_da.P_buy-plan_da.P_sell, 'r--', 'DisplayName','电网交互');
legend; title('日前功率平衡'); xlabel('时段(h)'); ylabel('功率(kW)');
% 2. 储能SOC
subplot(3,1,2);
plot(t, plan_da.E_ESS, 'g-', 'LineWidth',2);
title('储能SOC变化'); xlabel('时段(h)'); ylabel('SOC(kWh)');
% 3. 成本对比
subplot(3,1,3);
bar([value(cost_da), cost_rt]);
set(gca,'XTickLabel',{'日前成本','日内调整成本'});
title('调度成本对比'); ylabel('成本(元)');
end
参考代码 基于多时间尺度滚动优化的多能源微网双层调度模型 www.youwenfan.com/contentcst/160575.html
四、关键技术与注意事项
- 混合整数规划 :用YALMIP的
binvar定义启停状态,Gurobi求解MIQP。 - 场景法处理不确定性:拉丁超立方采样生成风光/负荷波动场景,Kantorovich距离削减冗余场景。
- 滚动优化实时性:每15分钟更新一次,用当前状态修正计划,确保跟踪性。
- 约束线性化:如购售电互斥用大M法线性化,避免非线性。
五、运行结果示例
- 成本:日前调度成本约5000元,日内调整成本约300元(占6%)。
- 风光消纳率:弃风弃光率<5%(通过储能+需求响应平抑波动)。
- 储能SOC:维持在100-400kWh,避免过充过放。
六、扩展方向
- 多微网协同:用ADMM算法实现多微网分布式调度。
- 源网荷储一体化:加入V2G(电动车储能)、P2G(电转气)。
- 强化学习优化:用DQN学习滚动优化策略,提升实时性。