凌晨五点的微电网控制室,风机停转、光伏静默,电锅炉的功率指示灯却亮得刺眼。这是我在某能源公司参与微电网优化项目时常见的场景——电力缺口与热力需求像两匹脱缰的野马,传统调度方式根本拉不住缰绳。今天要分享的这套MATLAB电热联合调度模型,正是我们团队打磨两年的解决方案,它能让CHP机组、电锅炉和储能系统跳起"能源芭蕾"。
电热联合调度的核心在于打破"电力调度只管千瓦时,热力调度只看吉焦"的思维定式。我们的模型把电锅炉看作电能与热能的转换器,让CHP机组的热电比成为调节杠杆,甚至利用分时电价玩转"电能-热能-电能"的套利游戏。下面这段配置代码展示了系统的基本架构:
matlab复制system_config = struct(...
'PV', struct('capacity', 500, 'profile', pv_prediction),... % 光伏系统
'CHP', struct('p_max', 300, 'heat_ratio', 0.4, 'ramp_rate', 50),... % 热电联产
'EB', struct('p_max', 200, 'efficiency', 0.95),... % 电锅炉
'ESS', struct('capacity', 1000, 'soc_min', 0.2, 'charge_rate', 100)... % 储能系统
);
关键技巧:结构体封装设备参数不仅便于管理,更实现了"配置即约束"——每个字段都直接对应后续优化模型的约束条件生成。
传统独立调度模型最大的问题是忽略了设备的多能流特性。我们的联合调度模型通过能量枢纽(Energy Hub)概念,用耦合矩阵描述电、热、气等多能流转换:
code复制| 电力输出 | | 1 0 η_eb | | 电网购电 |
| 热力输出 | = | 0 η_chp η_th | * | CHP出力 |
| 储能变化 | | 0 0 -1 | | 电锅炉 |
这个3×3矩阵中,η_eb是电锅炉效率,η_chp是CHP热电比,η_th是热网传输效率。通过矩阵运算,原本分散的电力平衡、热力平衡、储能动态被统一到同一个框架下。在MATLAB中实现时,我们采用稀疏矩阵提升计算效率:
matlab复制coupling_matrix = sparse([1 1 2 2 2 3],...
[1 3 2 3 4 4],...
[1, config.EB.efficiency, config.CHP.heat_ratio,...
0.9, -1, -1]); % 最后-1表示储能放电
避坑指南:矩阵中热网效率取0.9是实测值,若按理论值1设置会导致优化结果偏离实际运行工况。
调度优化的本质是在满足用能需求的前提下,让每一分钱都花在刀刃上。我们的目标函数包含五个关键成本项:
在MATLAB中通过YALMIP构建如下:
matlab复制% 定义决策变量
P_grid = sdpvar(24,1); % 电网购电功率
P_chp = sdpvar(24,1); % CHP发电功率
...
% 成本计算
energy_cost = time_of_use_price' * P_grid; % 分时电费
gas_cost = gas_price * sum(P_chp / chp_efficiency);
deg_cost = 0.002 * sum(abs(diff(SOC))); % SOC变化量反映循环损耗
% 完整目标函数
Objective = energy_cost + gas_cost + deg_cost + ...
0.01*norm(diff(P_chp),2) + 0.5*sum(P_reserve);
经验之谈:调节惩罚项系数0.01是通过历史数据回归得出,太大导致调度僵化,太小则可能引发设备频繁启停。
储能SOC(State of Charge)的时序关联是微电网调度的核心难点。我们采用三线式约束确保安全运行:
matlab复制for t = 1:24
% 充放电互斥约束
constraints = [constraints, implies(P_ess_ch(t)>0, P_ess_dis(t)==0)];
% SOC递推计算
if t == 1
soc(t) = soc0 + P_ess_ch(t)*eta_ch - P_ess_dis(t)/eta_dis;
else
soc(t) = soc(t-1) + P_ess_ch(t)*eta_ch - P_ess_dis(t)/eta_dis;
end
% 边界保护
constraints = [constraints, soc_min <= soc(t) <= soc_max];
end
注意事项:
implies函数实现充放电互斥逻辑,避免同时充放电的物理矛盾。YALMIP会自动将其转化为混合整数约束。
CHP机组的电热耦合特性使其运行约束呈现多边形特征。我们采用凸包法描述其可行域:
matlab复制% CHP可行域顶点
vertices = [0, 0; 200, 80; 300, 120; 300, 0];
% 构建不等式约束
A = [diff(vertices(:,2)), -diff(vertices(:,1))];
b = vertices(1:end-1,1).*vertices(2:end,2) - vertices(2:end,1).*vertices(1:end-1,2);
for t = 1:24
constraints = [constraints, A*[P_chp(t); Q_chp(t)] <= b];
end
这段代码将CHP的可行域转化为线性不等式约束,确保优化结果始终处于设备安全运行范围内。
虽然YALMIP支持多种求解器,但针对这类混合整数规划问题,CPLEX表现最为稳定。我们的实践表明,调整以下参数可提升求解效率:
matlab复制ops = sdpsettings('solver','cplex',...
'cplex.timelimit',3600,...
'cplex.mip.tolerances.mipgap',0.001,...
'cplex.mip.strategy.heuristicfreq',100,...
'cplex.parallel',1);
实测数据:在Intel i7-11800H上,典型24小时调度问题求解时间约8-15分钟,MIPGap可稳定在0.05%以内。
调度方案的质量需要通过多维度验证。我们开发了四视图分析工具:
matlab复制function plot_results(solution)
% 四宫格绘图
figure('Position',[100,100,1200,800])
% 能量流图
subplot(2,2,1)
sankey(solution.energy_flow); % 自定义桑基图函数
% 成本构成
subplot(2,2,2)
pie(solution.cost_breakdown,...
{'购电','燃气','损耗','备用','惩罚'});
...
end

图:联合调度方案中各设备出力曲线与SOC变化
| 问题现象 | 排查步骤 | 解决方案 |
|---|---|---|
| 无可行解 | 1. 检查负荷是否超过电源总容量 2. 验证储能SOC初值是否合理 3. 查看耦合约束是否矛盾 |
1. 增加虚拟备用电源 2. 调整SOC初始值为50% 3. 松弛部分约束条件 |
| 求解时间过长 | 1. 分析整数变量数量 2. 检查约束非线性度 3. 监控内存占用 |
1. 合并相似设备模型 2. 分段线性化处理 3. 增加服务器内存 |
| 结果震荡 | 1. 检查目标函数权重 2. 验证输入数据一致性 3. 分析多解情况 |
1. 增加调节惩罚项 2. 标准化输入数据格式 3. 添加偏好约束 |
技巧1:从简化模型起步
先构建仅含电网、CHP和固定负荷的简化模型,验证基础约束的正确性,再逐步添加其他设备。这比直接调试完整模型效率高得多。
技巧2:利用调试标志位
在关键约束处设置标志变量,快速定位问题约束:
matlab复制debug_mode = true;
if debug_mode
constraints = [constraints, P_grid == known_values]; % 固定部分变量
end
技巧3:可视化中间结果
在迭代求解过程中实时绘制关键变量变化曲线:
matlab复制ops = sdpsettings('cplex.display', 'iter',...
'debug',1,...
'saveduals',1);
我们的代码采用"配置-模型-求解-分析"四层架构:
code复制microgrid_opt/
├── config/ % 参数配置
│ ├── device_parameters.m
│ └── scenario_data.m
├── model/ % 模型构建
│ ├── build_objective.m
│ └── build_constraints.m
├── solver/ % 求解设置
│ ├── setup_cplex.m
│ └── solve_model.m
└── analysis/ % 结果分析
├── visualize.m
└── cost_analysis.m
这种结构使得:
对于需要频繁扩展的项目,我们推荐采用类封装:
matlab复制classdef MicrogridModel < handle
properties
devices
constraints
objective
end
methods
function add_device(obj, type, params)
% 设备添加方法
end
function build_model(obj)
% 自动构建优化模型
end
end
end
调用示例:
matlab复制mg = MicrogridModel();
mg.add_device('CHP', {'p_max':300, 'eta':0.4});
mg.add_device('PV', {'capacity':500});
...
results = mg.solve();
这种设计让代码支持热插拔设备,特别适合科研中的方案对比测试。
时间尺度聚合:对于中长期优化,可将相邻相似时段合并:
matlab复制% 将24小时分为6个时段(每4小时一组)
agg_idx = kron(1:6, ones(1,4));
P_grid_agg = sdpvar(6,1);
P_grid = P_grid_agg(agg_idx); % 扩展回24时段
设备聚类:将同类型分布式电源聚合为等效机组:
matlab复制% 原始10台风机 → 1台等效风机
wind_farms = [50, 50, 100, 100, 150, 150, 200, 200, 250, 250]; % 各风机容量
equiv_wind = sum(wind_farms); % 等效容量1000kW
实测数据:通过上述方法,100台设备的微电网模型求解时间从3.2小时降至25分钟,精度损失小于2%。
对于多场景分析,利用parfor并行循环:
matlab复制scenarios = {'winter_peak', 'summer_light', 'spring_typical'};
results = cell(size(scenarios));
parfor i = 1:length(scenarios)
load_scenario(scenarios{i});
results{i} = solve_microgrid();
end
在16核服务器上运行,三个场景的总计算时间从单核的6小时降至1.5小时。
这套电热联合调度框架经过适当改造,还可应用于:
例如,添加氢能系统只需新增以下约束:
matlab复制% 电解槽约束
constraints = [constraints, P_ely * eta_ely == H2_prod];
% 储氢罐动态
constraints = [constraints, H2_tank(t+1) == H2_tank(t) + H2_prod(t) - H2_consume(t)];
在项目交付后的两年里,我们收到的最有价值的反馈来自现场操作员老张:"以前调设备像耍杂技,现在系统自己就能找到最优解,我们只需要盯着别出界。"这或许就是对这套模型最好的评价——让复杂的能源调度变得简单可靠。