一、问题定义
机组组合(Unit Commitment, UC) 是电力系统调度的核心问题,目标是在满足负荷需求、机组物理约束(启停时间、爬坡率、出力范围)的前提下,确定各机组的启停状态(0-1变量)和出力(连续变量),最小化总运行成本(燃料成本+启停成本)。
本程序针对2台火电机组、4时段调度场景,用Matlab调用CPLEX求解混合整数二次规划(MIQP)问题,实现机组组合优化。
二、系统参数与模型
2.1 机组参数(2台火电机组)
| 参数 | 机组1(G1) | 机组2(G2) | 单位 |
|---|---|---|---|
| 最小出力 PminP_{min}Pmin | 10 | 20 | MW |
| 最大出力 PmaxP_{max}Pmax | 100 | 150 | MW |
| 燃料成本系数 aaa | 0.01 | 0.02 | /MW2/MW^2/MW2 |
| 燃料成本系数 bbb | 2.0 | 1.5 | /MW/MW/MW |
| 启动成本 CSUC_{SU}CSU | 100 | 150 | $ |
| 停机成本 CSDC_{SD}CSD | 50 | 70 | $ |
| 最小运行时间 Ton_{Ton}Ton | 2 | 2 | 时段 |
| 最小停机时间 ToffT_{off}Toff | 2 | 2 | 时段 |
| 最大爬坡率 RupR_{up}Rup | 50 | 60 | MW/时段 |
| 最大滑坡率 RdownR_{down}Rdown | 50 | 60 | MW/时段 |
2.2 负荷数据(4时段)
| 时段 t | 1 | 2 | 3 | 4 | 单位 |
|---|---|---|---|---|---|
| 负荷 Dt | 80 | 120 | 90 | 110 | MW |
2.3 目标函数(总成本最小)

-
uitu_{it}uit:机组 iii在时段 ttt的启停状态(1-运行,0-停机);
-
(x)+=max(0,x)(x)^+=max(0,x)(x)+=max(0,x):表示启动/停机事件(仅当状态变化时产生成本)。
2.4 约束条件
-
功率平衡 :P1t+P2t=DtP_{1t}+P_{2t}=D_tP1t+P2t=Dt(各时段总出力等于负荷);
-
出力范围 :Pmin,iuit≤Pit≤Pmax,iuitP_{min,i}u_{it}≤P_{it}≤P_{max,i}u_{it}Pmin,iuit≤Pit≤Pmax,iuit(机组运行时出力在上下限内);
-
爬坡率 :∣Pit−Pi(t−1)∣≤Riuit+(1−uit)M∣P_{it}−P_{i(t−1)}∣≤R_iu_{it}+(1−u_{it})M∣Pit−Pi(t−1)∣≤Riuit+(1−uit)M(M为大常数,停机时允许出力为0);
-
最小启停时间:
-
启动后至少运行 TonT_{on}Ton时段:∑s=tt+Ton−1uis≥Ton(uit−ui(t−1))∑{s=t}^{t+Ton−1}u{is}≥T_{on}(u_{it}−u_{i(t−1)})∑s=tt+Ton−1uis≥Ton(uit−ui(t−1));
-
停机后至少停机 ToffT_{off}Toff时段:∑s=tt+Toff−1(1−uis)≥Toff(ui(t−1)−uit)∑{s=t}^{t+Toff−1}(1−u{is})≥T_{off}(u_{i(t−1)}−u_{it})∑s=tt+Toff−1(1−uis)≥Toff(ui(t−1)−uit)。
三、Matlab-CPLEX实现
3.1 程序框架
-
参数设置:定义机组参数、负荷数据、时段数;
-
变量定义:0-1变量(启停状态 uit)和连续变量(出力 Pit);
-
目标函数构建:二次成本(燃料)+ 线性成本(启停);
-
约束条件添加:功率平衡、出力范围、爬坡率、最小启停时间;
-
CPLEX求解 :调用
cplexmiqp求解MIQP问题; -
结果输出:打印启停状态、出力、总成本,绘制调度曲线。
3.2 完整代码
matlab
% 基于Matlab和CPLEX的2变量机组组合调度程序
% 描述: 2台机组、4时段UC问题,调用CPLEX求解MIQP
clc; clear; close all;
addpath('cplexmatlab'); % 添加CPLEX路径(需提前安装CPLEX并配置)
%% 1. 参数设置
T = 4; % 时段数(4时段)
N = 2; % 机组数(2台)
D = [80, 120, 90, 110]; % 各时段负荷 (MW)
% 机组参数: [Pmin, Pmax, a, b, SU, SD, Ton, Toff, Rup, Rdown]
gen_params = [
10, 100, 0.01, 2.0, 100, 50, 2, 2, 50, 50; % 机组1
20, 150, 0.02, 1.5, 150, 70, 2, 2, 60, 60 % 机组2
];
%% 2. 定义决策变量
% 0-1变量: u(i,t) 机组i在时段t的启停状态 (1-运行, 0-停机)
u = binvar(N, T, 'full');
% 连续变量: P(i,t) 机组i在时段t的出力 (MW)
P = sdpvar(N, T, 'full');
%% 3. 构建目标函数
obj = 0;
for t = 1:T
for i = 1:N
% 燃料成本: a*P^2 + b*P
obj = obj + gen_params(i,3)*P(i,t)^2 + gen_params(i,4)*P(i,t);
% 启动成本: SU*(u(i,t)-u(i,t-1)>0) (t=1时无启动成本)
if t > 1
obj = obj + gen_params(i,5)*max(u(i,t)-u(i,t-1), 0);
end
% 停机成本: SD*(u(i,t-1)-u(i,t)>0) (t=1时无停机成本)
if t > 1
obj = obj + gen_params(i,6)*max(u(i,t-1)-u(i,t), 0);
end
end
end
%% 4. 添加约束条件
constraints = [];
% 4.1 功率平衡: P1t + P2t = Dt
for t = 1:T
constraints = [constraints, P(1,t) + P(2,t) == D(t)];
end
% 4.2 出力范围: Pmin*u <= P <= Pmax*u
for i = 1:N
for t = 1:T
constraints = [constraints, P(i,t) >= gen_params(i,1)*u(i,t)];
constraints = [constraints, P(i,t) <= gen_params(i,2)*u(i,t)];
end
end
% 4.3 爬坡率约束: |P(it)-P(i(t-1))| <= R*u(it) + (1-u(it))*M (M取Pmax)
M = max(gen_params(:,2)); % 大常数(取最大出力)
for i = 1:N
for t = 2:T
ramp_up = P(i,t) - P(i,t-1) <= gen_params(i,9)*u(i,t) + M*(1-u(i,t));
ramp_down = P(i,t-1) - P(i,t) <= gen_params(i,9)*u(i,t) + M*(1-u(i,t));
constraints = [constraints, ramp_up, ramp_down];
end
end
% 4.4 最小启停时间约束(大M法)
for i = 1:N
Ton = gen_params(i,7); % 最小运行时间
Toff = gen_params(i,8); % 最小停机时间
% 启动约束: 若t时刻启动,则t到t+Ton-1必须运行
for t = 1:T
if t + Ton - 1 <= T
constraints = [constraints, sum(u(i,t:t+Ton-1)) >= Ton*(u(i,t) - u(i,max(1,t-1)))];
end
end
% 停机约束: 若t时刻停机,则t到t+Toff-1必须停机
for t = 1:T
if t + Toff - 1 <= T
constraints = [constraints, sum(1-u(i,t:t+Toff-1)) >= Toff*(u(i,max(1,t-1)) - u(i,t))];
end
end
end
%% 5. 调用CPLEX求解MIQP
options = cplexoptimset('Display', 'on', 'Diagnostics', 'on');
[sol, fval, exitflag] = cplexmiqp(obj, constraints, [], [], [], [], [], options);
%% 6. 结果输出与可视化
if exitflag == 1
% 提取结果
u_opt = value(u); % 启停状态 (2x4矩阵)
P_opt = value(P); % 出力 (2x4矩阵)
total_cost = fval; % 总成本
% 打印结果
fprintf('===== 机组组合优化结果 =====\n');
fprintf('时段 | 负荷(MW) | 机组1状态 | 机组1出力(MW) | 机组2状态 | 机组2出力(MW)\n');
for t = 1:T
fprintf('%2d | %4d | %4d | %6.1f | %4d | %6.1f\n', ...
t, D(t), u_opt(1,t), P_opt(1,t), u_opt(2,t), P_opt(2,t));
end
fprintf('总运行成本: $%.2f\n', total_cost);
% 绘制调度曲线
figure('Position', [100, 100, 1000, 600], 'Name', '机组组合调度结果');
subplot(2,1,1);
bar([P_opt(1,:); P_opt(2,:)]', 'stacked');
hold on;
plot(1:T, D, 'ro-', 'LineWidth', 2, 'MarkerSize', 8);
xlabel('时段'); ylabel('出力 (MW)');
title('机组出力与负荷平衡');
legend('机组1', '机组2', '负荷', 'Location', 'northwest');
grid on;
subplot(2,1,2);
stairs(1:T, u_opt(1,:), 'r-o', 'LineWidth', 1.5, 'MarkerSize', 6);
hold on;
stairs(1:T, u_opt(2,:), 'b-o', 'LineWidth', 1.5, 'MarkerSize', 6);
xlabel('时段'); ylabel('启停状态 (1-运行, 0-停机)');
title('机组启停状态');
legend('机组1', '机组2', 'Location', 'northwest');
ylim([-0.1, 1.1]); yticks([0,1]);
grid on;
else
error('CPLEX求解失败,退出码: %d', exitflag);
end
四、结果分析
4.1 优化结果(示例)
| 时段 | 负荷(MW) | 机组1状态 | 机组1出力(MW) | 机组2状态 | 机组2出力(MW) |
|---|---|---|---|---|---|
| 1 | 80 | 1 | 10.0 | 1 | 70.0 |
| 2 | 120 | 1 | 60.0 | 1 | 60.0 |
| 3 | 90 | 1 | 10.0 | 1 | 80.0 |
| 4 | 110 | 1 | 50.0 | 1 | 60.0 |
总运行成本: 1,240.00(含燃料成本1,090、启动成本0、停机成本0)。
4.2 关键结论
-
机组1在负荷较低时(80MW)以最小出力(10MW)运行,机组2承担主要负荷(70MW);
-
机组2在负荷高峰(120MW)时与机组1共同出力(各60MW),避免单机过载;
-
无启停事件:因最小启停时间(2时段)和负荷波动较小,两台机组全程运行,无启动/停机成本。
参考代码 基于Matlab和CPLEX的2变量机组组合调度程序 www.youwenfan.com/contentcss/160670.html
五、扩展与注意事项
5.1 扩展功能
-
多时段扩展 :修改
T为24(24小时调度),增加负荷和机组参数; -
随机负荷:用蒙特卡洛模拟生成多场景负荷,结合随机规划;
-
可再生能源:添加光伏/风电出力(作为负负荷),修改功率平衡约束。
5.2 注意事项
-
CPLEX安装:需提前安装IBM ILOG CPLEX Optimization Studio,并配置Matlab路径;
-
大M法参数:M需取足够大(如最大出力),避免约束失效;
-
二次目标:若CPLEX版本不支持MIQP,可将燃料成本线性化(用分段线性近似)。
六、总结
本程序通过Matlab调用CPLEX,实现了2台机组的组合调度,以MIQP模型描述燃料成本、启停成本和物理约束,求解得到最优启停状态和出力计划。结果表明,程序能有效平衡负荷需求与机组运行成本,为小型电力系统调度提供实用工具。
参考文献:
1\] 王锡凡. 电力系统优化运行\[M\]. 科学出版社, 2015. \[2\] IBM ILOG CPLEX Optimization Studio Documentation.