1. 电力系统机组组合问题概述
电力系统机组组合(Unit Commitment, UC)是电力系统运行中的核心优化问题之一。简单来说,就是在满足电力负荷需求的前提下,决定哪些发电机组应该开启、哪些应该关闭,以及每台运行机组应该发多少电,以达到最优的经济性目标。
传统的机组组合问题通常只考虑最基本的经济性约束,比如:
- 发电机组的最小启停时间
- 爬坡速率限制
- 发电出力上下限
- 系统功率平衡
然而,这种"纯经济性"的优化方法存在一个严重缺陷:它完全忽略了电网本身的物理特性。就像规划城市交通时只考虑车辆数量而不考虑道路容量一样,这样得出的调度方案在实际运行时可能导致线路过载、电压越限等安全隐患。
2. 考虑安全约束的机组组合模型
2.1 直流潮流模型基础
直流潮流(DC Power Flow)是电力系统分析中常用的线性化潮流计算方法。虽然精度不如交流潮流,但其计算速度快、收敛性好,非常适合嵌入优化问题中作为约束条件。
直流潮流的核心方程可以表示为:
code复制P_inj = B * θ
其中:
- P_inj是节点注入功率向量
- B是节点导纳矩阵(去掉了参考节点对应的行和列)
- θ是节点电压相角向量
在MATLAB中构建节点导纳矩阵的典型代码如下:
matlab复制function B = makeBmatrix(branch_data)
nb = max(max(branch_data(:,1:2))); % 节点数量
B = zeros(nb,nb);
for k = 1:size(branch_data,1)
i = branch_data(k,1);
j = branch_data(k,2);
x = branch_data(k,4); % 线路电抗
B(i,j) = B(i,j) - 1/x;
B(j,i) = B(i,j);
B(i,i) = B(i,i) + 1/x;
B(j,j) = B(j,j) + 1/x;
end
% 移去参考节点(通常选为第一个节点)
B = B(2:end,2:end);
end
2.2 安全约束的数学表达
将直流潮流约束嵌入机组组合问题,需要增加以下几类约束:
-
线路潮流限制:
code复制-P_line_max ≤ P_line ≤ P_line_max其中P_line可以通过相角差计算:
code复制P_line = (θ_i - θ_j)/x_ij -
节点功率平衡:
code复制P_gen - P_load = P_inj = B * θ -
发电机出力限制:
code复制P_min ≤ P_gen ≤ P_max
在MATLAB/CPLEX中,这些约束可以这样实现:
matlab复制% 构建节点导纳矩阵
B = makeBmatrix(branch_data);
% 初始化约束集合
cons = [];
% 直流潮流约束
for t = 1:NT % 对每个时段
% 节点功率平衡
cons = [cons, P_inj(:,t) == B*theta(:,t)];
% 机组出力与节点注入的关系
for i = 1:NG
cons = [cons, P_inj(gen_loc(i),t) == ...
sum(P_gen(i,t)) - load(gen_loc(i),t)];
end
% 线路潮流限制
P_line = (theta(from_bus,t) - theta(to_bus,t)) ./ x;
cons = [cons, -P_line_max <= P_line <= P_line_max];
end
3. 热备用约束的建模方法
3.1 常规旋转备用
旋转备用是指已经在线运行的机组可以提供额外出力的能力。通常表示为:
code复制sum( (P_max - P_gen) .* u ) ≥ R
其中u是机组启停状态变量(1=运行,0=停机),R是系统要求的备用容量。
3.2 考虑N-1准则的热备用
N-1准则要求系统在任一元件(如线路或变压器)故障退出运行时,仍能保持正常运行。这需要更精细的备用安排:
- 识别系统中的关键线路(通常是负载率最高的几条)
- 确保有足够的快速启动机组可以补偿这些线路断开导致的功率缺额
在模型中可以表示为:
matlab复制% 找出负载率最高的线路
[~, critical_line] = max(P_line ./ P_line_max);
% 计算该线路断开导致的功率缺额
P_loss = P_line(critical_line);
% 确保有足够的快速启动容量
cons = [cons, sum(quick_start_unit .* P_max) >= P_loss];
其中quick_start_unit是标识机组是否为快速启动机组的二进制向量。
4. 优化模型的求解技巧
4.1 混合整数二次规划(MIQP)模型
考虑安全约束的机组组合问题可以表述为混合整数二次规划:
code复制minimize: sum( a.*P_gen.^2 + b.*P_gen + c + SU_cost + SD_cost )
subject to:
- 机组物理约束(启停、爬坡等)
- 系统功率平衡
- 直流潮流约束
- 线路容量约束
- 备用约束
4.2 CPLEX求解器参数设置
合理的求解器参数设置可以显著提高求解效率:
matlab复制options = cplexoptimset('cplex');
options.mip.tolerances.mipgap = 0.01; % 允许1%的最优间隙
options.threads = 4; % 使用4个线程并行计算
options.mip.strategy.heuristicfreq = 100; % 启发式搜索频率
options.mip.cuts.mircut = 2; % 使用中等强度的MIR割平面
[sol, fval] = cplexmiqcp(H, f, Aineq, bineq, Aeq, beq,...
[], [], [], lb, ub, ctype, [], options);
4.3 数值稳定性处理
电力系统优化问题常遇到数值不稳定的情况,特别是节点导纳矩阵可能接近奇异。可以采取以下措施:
- 添加虚拟阻抗:
matlab复制B = B + diag(1e-6*ones(size(B,1),1));
-
合理选择参考节点(通常选容量最大的发电机节点)
-
对变量进行适当的缩放(如将功率单位从MW改为GW)
5. 案例分析:6机30节点系统
5.1 系统基本情况
- 6台发电机组,参数如下表:
| 机组 | P_min(MW) | P_max(MW) | a($/MW²h) | b($/MWh) | c($/h) | 启动成本($) |
|---|---|---|---|---|---|---|
| G1 | 50 | 200 | 0.003 | 8.5 | 100 | 500 |
| G2 | 20 | 80 | 0.005 | 10.0 | 50 | 200 |
| ... | ... | ... | ... | ... | ... | ... |
- 30节点网络拓扑,包含41条线路
- 24小时负荷曲线,峰谷比约为1.8:1
5.2 结果对比
| 方案类型 | 总成本($) | 最大线路负载率 | 过载线路数 | 求解时间(min) |
|---|---|---|---|---|
| 传统经济调度 | 125,680 | 98% | 2 | 15 |
| 安全约束调度 | 127,950 | 83% | 0 | 42 |
虽然安全约束方案的总成本增加了1.8%,但完全消除了线路过载风险,为系统运行提供了更大的安全裕度。
6. 实际应用中的注意事项
-
数据准备阶段:
- 确保网络参数(特别是线路阻抗)准确无误
- 仔细核对发电机参数与网络节点的对应关系
- 对负荷预测数据进行合理性校验
-
模型构建阶段:
- 注意参考节点的选择(通常选平衡节点)
- 合理设置变量的上下界,避免过大的可行域
- 对大规模系统,考虑使用网络分解等简化方法
-
求解阶段:
- 先从松弛问题(忽略整数约束)开始,获取初始可行解
- 合理设置最优间隙,平衡求解速度与解的质量
- 监控求解过程,必要时调整参数或终止求解
-
结果分析阶段:
- 检查所有约束是否得到满足
- 特别注意边界条件(如爬坡速率、备用要求等)
- 对异常结果(如某些机组频繁启停)进行深入分析
7. 扩展与改进方向
-
考虑不确定性:
- 引入鲁棒优化或随机规划方法处理负荷预测误差
- 考虑可再生能源出力的波动性
-
多时间尺度协调:
- 将日前机组组合与实时调度相结合
- 考虑机组组合与AGC的协调
-
算法改进:
- 采用Benders分解等算法处理大规模问题
- 尝试启发式算法提高求解效率
-
可视化与决策支持:
- 开发直观的结果展示界面
- 提供多种方案的对比分析功能
在实际项目中,我曾遇到一个典型案例:某省级电网采用传统经济调度方法得到的方案,在实际运行时因一条关键线路过载导致局部停电。后来采用本文介绍的安全约束方法重新优化,虽然日常运行成本略有增加,但彻底消除了类似的安全隐患。这个经验告诉我们,在电力系统优化中,安全性和经济性必须统筹考虑。