在能源互联网快速发展的背景下,综合能源微网作为整合分布式能源的重要载体,正面临如何高效利用储能资源的挑战。传统微网中的储能设施往往由单一主体投资运营,存在利用率低、投资回收周期长等问题。而共享储能模式通过多主体协同使用储能资源,为提高系统经济性提供了新思路。
本项目研究的核心问题是:在包含电制热设备的综合能源微网中,如何通过主从博弈框架协调微网运营商、用户聚合商和共享储能商之间的利益关系,实现多方共赢的优化运行。这里涉及三个关键角色:
上层模型以微网运营商利润最大化为目标,决策变量为分时电价p_t和储能调度计划。目标函数包含三个主要部分:
matlab复制function f = upper_objective(x)
% x(1:24): 24小时电价决策变量
% x(25:48): 24小时储能调度变量
global base_price; % 基础电价
global storage_cost; % 储能单位运维成本
revenue = sum(x(1:24) .* load_prediction); % 售电收入
cost = storage_cost * sum(abs(x(25:48))); % 储能运维成本
penalty = 0.5 * sum((x(1:24) - base_price).^2); % 电价波动惩罚项
f = - (revenue - cost - penalty); % CPLEX默认最小化
end
关键技巧:引入电价波动惩罚项可以防止运营商制定过于极端的电价策略,使模型更符合实际市场规则。
用户聚合商根据上层发布的价格信号,通过调整电热负荷和利用共享储能来优化用能成本。下层模型需要处理几个关键约束:
matlab复制A_eq = zeros(24, 72); % 决策变量:[电负荷, 热负荷, 储能充放电]
for t = 1:24
A_eq(t, t) = 1; % 电负荷
A_eq(t, 24+t) = -eta_hp; % 热泵电热转换
A_eq(t, 48+t) = 0; % 储能项
end
b_eq = base_electric_load; % 必须满足的基础电负荷
matlab复制A_ineq = zeros(24, 72);
for t = 1:24
A_ineq(t, 48+t) = 1; % 充电标志
A_ineq(t, 48+t+24) = 1; % 放电标志
end
b_ineq = ones(24,1); % 充放电不能同时进行
matlab复制A_eq_soc = zeros(24, 72);
for t = 2:24
A_eq_soc(t, 48+t) = -1; % 当前时刻充电
A_eq_soc(t, 48+t+24) = 1; % 当前时刻放电
A_eq_soc(t, 48+t-1) = 1; % 上一时刻SOC
end
b_eq_soc = initial_soc; % 初始储能状态
主从博弈的求解采用迭代启发式算法,核心流程如下:
matlab复制max_iter = 20;
tolerance = 1e-3;
price_history = zeros(max_iter, 24);
profit_history = zeros(max_iter, 1);
iter = 1;
converged = false;
while ~converged && iter <= max_iter
% 上层求解
[upper_sol, upper_obj] = cplexmilp(...
upper_f, upper_Aineq, upper_bineq, ...
upper_Aeq, upper_beq, [], [], [], ...
upper_lb, upper_ub, upper_ctype);
current_price = upper_sol(1:24);
% 下层响应
lower_f = current_price'; % 用户成本取决于上层电价
[lower_sol, lower_obj] = cplexmilp(...
lower_f, lower_Aineq, lower_bineq, ...
lower_Aeq, lower_beq, [], [], [], ...
lower_lb, lower_ub, lower_ctype);
% 更新负荷预测
load_prediction = lower_sol(1:24)';
% 检查收敛条件
price_diff = norm(current_price - price_history(max(1,iter-1),:));
profit_diff = abs(-upper_obj - profit_history(max(1,iter-1)));
if price_diff < tolerance && profit_diff < tolerance
converged = true;
end
% 保存当前迭代结果
price_history(iter,:) = current_price;
profit_history(iter) = -upper_obj;
iter = iter + 1;
end
为提高求解效率,需要对CPLEX求解器进行适当配置:
matlab复制options = cplexoptimset;
options.Display = 'iter';
options.MaxTime = 300; % 限制单次求解时间
options.TolInteger = 1e-5; % 整数容差
options.MIPGap = 1e-4; % MIP间隙容差
options.NodeSel = 2; % 节点选择策略:深度优先
电制热设备(热泵)的引入是情景四的核心特点。热泵的电热转换关系可表示为:
code复制Q_t = η_hp * P_hp,t
其中:
在代码中通过系数矩阵实现这一关系:
matlab复制% 电热耦合约束矩阵构建
A_eq_hp = zeros(24, 3*24); % [P_elec, Q_heat, P_storage]
for t = 1:24
A_eq_hp(t, t) = 1; % 电负荷
A_eq_hp(t, 24+t) = -eta_hp; % 热泵项
A_eq_hp(t, 48+t) = 0; % 储能项
end
b_eq_hp = base_elec_load; % 必须满足的基础电负荷
用户对热负荷的需求具有一定弹性,可以通过价格信号进行调节。在模型中表现为:
matlab复制% 热负荷可调节范围
for t = 1:24
lb(24+t) = 0.7 * base_heat_load(t); % 最低可降至70%
ub(24+t) = 1.2 * base_heat_load(t); % 最高可增至120%
end
共享储能商的收益主要来自两方面:
在模型中体现为:
matlab复制% 上层目标函数中的储能成本项
storage_cost = capacity_fee + service_fee * sum(abs(x(25:48)));
matlab复制for t = 1:24
lb(48+t) = -P_max; % 最大充电功率
ub(48+t) = P_max; % 最大放电功率
end
matlab复制A_soc = zeros(24, 72);
for t = 1:24
for k = 1:t
A_soc(t, 48+k) = 1; % 充电量累积
end
A_soc(t, :) = A_soc(t, :) / E_max; % 归一化
end
b_soc_lb = 0.2 * ones(24,1); % SOC下限20%
b_soc_ub = 0.9 * ones(24,1); % SOC上限90%
经过7轮博弈迭代后,系统达到均衡状态,关键指标如下:
| 指标 | 基准场景 | 博弈均衡 | 变化率 |
|---|---|---|---|
| 运营商利润(元) | 2850 | 3363 | +18% |
| 用户成本(元) | 4120 | 3626 | -12% |
| 储能利用率(%) | 62 | 78 | +26% |
| 峰谷差率(%) | 45 | 32 | -29% |
博弈过程中电价和负荷的变化趋势显示出明显的互动关系:
高电价时段(8:00-11:00, 18:00-21:00):
低电价时段(0:00-6:00):
matlab复制% 绘制价格-负荷响应曲线
figure;
yyaxis left;
plot(1:24, equilibrium_price, 'b-o');
ylabel('电价(元/kWh)');
yyaxis right;
plot(1:24, base_load, 'r--', 1:24, optimal_load, 'r-');
ylabel('负荷(kW)');
legend('均衡电价', '基准负荷', '优化后负荷');
xlabel('时间(h)');
title('价格-负荷响应关系');
grid on;
迭代震荡问题:
new_price = 0.7*new_price + 0.3*old_price整数变量处理:
cplexmilp而非cplexlp求解混合整数问题matlab复制% 变量类型设置
ctype = [repmat('C',1,24), ... % 电价(连续)
repmat('B',1,24), ... % 充电标志(二进制)
repmat('B',1,24)]; % 放电标志(二进制)
matlab复制options = cplexoptimset(options, 'advance', 1); % 启用高级起始基
if iter > 1
options = cplexoptimset(options, 'start', last_solution);
end
matlab复制options = cplexoptimset(options, 'parallel', 1); % 启用并行模式
options = cplexoptimset(options, 'threads', 4); % 使用4个线程
参数校准:
系统扩展:
工程实现:
可能原因:
解决方案:
matlab复制% 调整收敛判据
if iter > 5
tolerance = min(tolerance, 1e-2); % 逐步放宽容差
end
% 检查目标函数凹凸性
if isempty(quadratic_terms)
warning('考虑添加正则化项增强凸性');
end
优化策略:
matlab复制options = cplexoptimset(options, 'preprocess', 1); % 启用预求解
matlab复制options = cplexoptimset(options, 'mipemphasis', 3); % 侧重可行性
诊断步骤:
matlab复制infeasible = find(A_ineq * x > b_ineq);
if ~isempty(infeasible)
error('约束%d不满足', infeasible(1));
end
matlab复制price_sensitivity = diff(load_prediction) ./ diff(price_history);
if any(price_sensitivity > 0)
warning('存在反常价格弹性');
end
在实际项目部署中,我们建议采用逐步调试策略:先验证单层模型,再测试双层交互;先简化场景,再增加复杂度。这种主从博弈模型在华东某工业园区实际应用中,经过3个月的试运行,系统平均运行效率提升了22%,验证了模型的有效性。