在分布式能源快速发展的背景下,虚拟电厂(Virtual Power Plant, VPP)作为聚合多种分布式能源资源的新型能源管理模式,正受到越来越多的关注。与传统电厂不同,虚拟电厂通过先进的控制和通信技术,将分散的风电、光伏、储能系统、燃气轮机以及可控负荷等资源整合起来,作为一个整体参与电力市场运行和电网调度。
日前经济调度是虚拟电厂运行中的核心环节,需要提前一天制定各分布式资源的出力计划。然而,光伏发电出力和用户负荷需求都存在显著的不确定性,这使得传统的确定性优化方法难以适用。鲁棒优化作为一种处理不确定性的有效方法,能够在考虑最坏情况下仍保证系统的可行性和经济性。
典型的虚拟电厂包含以下主要组件:
在我们的模型中,特别考虑了光伏出力和负荷需求的双重不确定性。光伏出力受天气条件影响显著,而负荷需求则受用户行为、温度等多种因素影响。
对于光伏出力和负荷需求的不确定性,我们采用区间不确定性模型:
code复制P_pv(t) = P_pv_forecast(t) + ΔP_pv(t), ΔP_pv(t) ∈ [-ΔP_pv_max(t), ΔP_pv_max(t)]
P_load(t) = P_load_forecast(t) + ΔP_load(t), ΔP_load(t) ∈ [-ΔP_load_max(t), ΔP_load_max(t)]
其中,P_pv_forecast(t)和P_load_forecast(t)分别为t时段的光伏出力和负荷需求预测值,ΔP_pv(t)和ΔP_load(t)为不确定性偏差。
我们的目标是最小化虚拟电厂的总运行成本,包括:
目标函数可表示为:
matlab复制min Σ[C_gt(P_gt(t)) + C_ess(P_ess(t)) + C_grid(P_grid(t))] + Γ·ρ
其中,Γ为鲁棒系数,ρ为不确定性惩罚项。
在任何情况下都必须满足的硬约束:
matlab复制P_gt(t) + P_pv(t) + P_ess(t) + P_grid(t) = P_load(t) + P_curt(t)
其中,P_curt(t)为弃光功率(当光伏出力过剩时)。
matlab复制P_gt_min ≤ P_gt(t) ≤ P_gt_max
|P_gt(t) - P_gt(t-1)| ≤ R_gt
R_gt为燃气轮机的爬坡率限制。
matlab复制SOC(t) = SOC(t-1) + (η_ch·P_ch(t) - P_dis(t)/η_dis)·Δt/E_max
SOC_min ≤ SOC(t) ≤ SOC_max
0 ≤ P_ch(t) ≤ P_ch_max
0 ≤ P_dis(t) ≤ P_dis_max
其中,SOC为储能系统的荷电状态,η_ch和η_dis分别为充放电效率。
将含不确定性的约束转换为鲁棒对等形式。以功率平衡约束为例:
原始约束:
matlab复制P_gt(t) + (P_pv_forecast(t) + ΔP_pv(t)) + P_ess(t) + P_grid(t) = (P_load_forecast(t) + ΔP_load(t)) + P_curt(t)
鲁棒对等约束:
matlab复制P_gt(t) + P_pv_forecast(t) + P_ess(t) + P_grid(t) ≥ P_load_forecast(t) + ΔP_load_max(t) + P_curt(t)
P_gt(t) + P_pv_forecast(t) - ΔP_pv_max(t) + P_ess(t) + P_grid(t) ≤ P_load_forecast(t) - ΔP_load_max(t) + P_curt(t)
使用MATLAB结合CPLEX求解器实现模型求解,主要步骤包括:
matlab复制% 时间参数
T = 24; % 24小时调度周期
dt = 1; % 时间间隔1小时
% 光伏参数
P_pv_forecast = [...] % 光伏预测出力
ΔP_pv_max = [...] % 光伏最大偏差
% 负荷参数
P_load_forecast = [...] % 负荷预测值
ΔP_load_max = [...] % 负荷最大偏差
% 燃气轮机参数
P_gt_min = 20; % kW
P_gt_max = 200; % kW
R_gt = 50; % kW/h
matlab复制model = Cplex('VPP_Robust');
model.Model.sense = 'minimize';
% 添加变量
varNames = {'P_gt', 'P_ess', 'P_grid', 'P_curt'};
model.addVariables(zeros(T,1), [], repmat([-inf; inf],T,1), [], varNames);
% 添加目标函数
obj = [...]; % 构建目标函数系数
model.Model.obj = obj;
matlab复制% 功率平衡约束(鲁棒对等形式)
for t = 1:T
% 上界约束
model.addConstraints(P_gt(t) + P_pv_forecast(t) - ΔP_pv_max(t) + P_ess(t) + P_grid(t) <= ...
P_load_forecast(t) - ΔP_load_max(t) + P_curt(t));
% 下界约束
model.addConstraints(P_gt(t) + P_pv_forecast(t) + P_ess(t) + P_grid(t) >= ...
P_load_forecast(t) + ΔP_load_max(t) + P_curt(t));
end
matlab复制model.solve();
solution = model.Solution;
% 提取结果
P_gt_opt = solution.x(1:T);
P_ess_opt = solution.x(T+1:2*T);
P_grid_opt = solution.x(2*T+1:3*T);
P_curt_opt = solution.x(3*T+1:4*T);
鲁棒系数Γ的选取对调度结果有重要影响:
建议通过敏感性分析确定最佳Γ值:
matlab复制gamma_values = 0:0.1:1;
cost_results = zeros(length(gamma_values),1);
for i = 1:length(gamma_values)
model.Model.obj(end) = gamma_values(i); % 设置鲁棒系数
model.solve();
cost_results(i) = model.Solution.objval;
end
plot(gamma_values, cost_results);
xlabel('鲁棒系数Γ');
ylabel('总成本');
matlab复制parfor t = 1:T
% 构建并求解单时段子问题
end
问题描述:在某些极端情况下,模型可能无可行解
解决方案:
matlab复制% 添加松弛变量
model.addVariables(zeros(T,1), [], repmat([0; inf],T,1), [], 'slack');
% 修改约束
model.addConstraints(P_gt(t) + P_pv_forecast(t) - ΔP_pv_max(t) + P_ess(t) + P_grid(t) - slack(t) <= ...
P_load_forecast(t) - ΔP_load_max(t) + P_curt(t));
问题描述:随着系统规模增大,求解时间显著增加
解决方案:
matlab复制model.Param.mip.tolerances.mipgap.set(0.01); % 设置MIP gap
model.Param.threads.set(4); % 使用多线程
问题描述:鲁棒优化结果过于保守,经济性较差
解决方案:
在实际应用中,我们还需要考虑电网调度指令、市场电价波动等外部因素,以及虚拟电厂内部各单元的物理约束和运行特性。通过不断调整和优化模型参数,可以使调度结果更加符合实际运行需求。