1. 主辅助服务市场与旋转备用基础概念
电力市场中的辅助服务是确保电网安全稳定运行的关键机制,而旋转备用(Spinning Reserve)作为其中最重要的服务类型之一,指的是发电机组已经并网运行但保持部分容量处于备用状态,能够在短时间内(通常10-30分钟)响应调度指令增加出力。这种"热备用"状态相比冷备用(需要数小时启动)具有显著的响应速度优势。
在电力市场架构中,主辅助服务市场(Primary Ancillary Service Market)与能量市场(Energy Market)通常采用联合出清模式。市场出清过程需要解决的核心问题是:在满足系统备用容量需求约束的前提下,如何以最小化总成本为目标,确定各发电机组的能量出力计划和备用容量分配方案。这本质上是一个复杂的优化问题,涉及:
- 机组运行约束(最小启停时间、爬坡率等)
- 网络传输约束(线路容量限制)
- 备用容量需求约束(N-1安全准则等)
2. 旋转备用市场出清模型构建
2.1 目标函数设计
典型的联合出清模型采用线性规划或混合整数线性规划(MILP)形式,目标函数为最小化系统总成本:
code复制min Σ(c_i^E * P_i + c_i^R * R_i)
其中:
- P_i:机组i的能量出力(MW)
- R_i:机组i提供的旋转备用容量(MW)
- c_i^E:机组i的能量报价($/MWh)
- c_i^R:机组i的备用报价($/MW)
实际建模中需注意:备用报价通常低于能量报价,反映备用状态只需补偿机会成本而非全容量发电成本。
2.2 关键约束条件
2.2.1 功率平衡约束
code复制ΣP_i = D
D为系统总负荷需求,这是最基本的等式约束。
2.2.2 备用容量需求约束
code复制ΣR_i ≥ R_req
系统总备用需满足调度机构根据可靠性标准确定的R_req值。
2.2.3 机组运行约束
code复制P_i + R_i ≤ P_i_max
P_i ≥ P_i_min
确保机组出力在技术可行范围内,且旋转备用不能超过最大可调容量。
2.2.4 爬坡率约束
code复制|P_i(t) - P_i(t-1)| ≤ ΔP_i_max
限制机组出力的变化速率,这对考虑多时段出清尤为重要。
3. MATLAB实现关键技术
3.1 优化求解器选择
MATLAB中推荐使用intlinprog(混合整数规划)或linprog(线性规划)求解器,对于大规模问题可集成Gurobi/CPLEX等商业求解器:
matlab复制% 示例:调用intlinprog求解MILP问题
options = optimoptions('intlinprog','Display','iter');
[x,fval] = intlinprog(f,intcon,A,b,Aeq,beq,lb,ub,options);
3.2 模型参数设置
建议采用结构体组织输入数据:
matlab复制systemData = struct(...
'load', 1500, ... % 系统负荷(MW)
'reserveReq', 200, ... % 备用需求(MW)
'numGen', 10 ... % 机组数量
);
genData = struct(...
'maxPower', [100; 150; 200; ...], ... % 各机组最大出力
'minPower', [20; 30; 40; ...], ... % 各机组最小出力
'energyCost', [25; 30; 28; ...], ... % 能量报价($/MWh)
'reserveCost', [10; 12; 8; ...] ... % 备用报价($/MW)
);
3.3 约束矩阵构建技巧
采用稀疏矩阵可显著提升大规模问题求解效率:
matlab复制% 构建Aeq矩阵示例(功率平衡约束)
Aeq = sparse(1, systemData.numGen*2);
Aeq(1,1:systemData.numGen) = 1; % 能量变量系数
beq = systemData.load;
% 构建A矩阵示例(备用容量约束)
A = sparse(1, systemData.numGen*2);
A(1,systemData.numGen+1:end) = -1; % 备用变量系数
b = -systemData.reserveReq;
4. 完整MATLAB实现案例
4.1 基础出清模型实现
matlab复制function [dispatch, reserve, totalCost] = simpleMarketClearing(systemData, genData)
% 定义决策变量:前N个为能量出力,后N个为备用容量
N = systemData.numGen;
f = [genData.energyCost; genData.reserveCost]; % 目标函数系数
% 不等式约束 A*x ≤ b
% 1. 机组最大出力约束 P_i + R_i ≤ P_i_max
A1 = [eye(N), eye(N)];
b1 = genData.maxPower;
% 2. 备用需求约束 ΣR_i ≥ R_req → -ΣR_i ≤ -R_req
A2 = [zeros(1,N), -ones(1,N)];
b2 = -systemData.reserveReq;
A = [A1; A2];
b = [b1; b2];
% 等式约束 Aeq*x = beq (功率平衡)
Aeq = [ones(1,N), zeros(1,N)];
beq = systemData.load;
% 变量下界
lb = [genData.minPower; zeros(N,1)];
% 求解线性规划
options = optimoptions('linprog','Display','none');
[x, fval] = linprog(f,A,b,Aeq,beq,lb,[],[],options);
% 提取结果
dispatch = x(1:N);
reserve = x(N+1:end);
totalCost = fval;
end
4.2 考虑机组启停的MILP扩展
实际系统中需考虑机组最小启停时间等离散约束:
matlab复制function [dispatch, reserve, status, totalCost] = extendedMarketClearing(systemData, genData)
N = systemData.numGen;
% 新增二进制变量表示机组状态(1:运行,0:停机)
f = [genData.energyCost; genData.reserveCost; genData.startupCost];
% 扩展不等式约束
% 1. 机组最大出力约束 P_i + R_i ≤ u_i*P_i_max
A1 = [eye(N), eye(N), -diag(genData.maxPower)];
% 2. 最小出力约束 P_i ≥ u_i*P_i_min
A2 = [-eye(N), zeros(N), diag(genData.minPower)];
% 合并约束
A = [A1; A2; [zeros(1,N), -ones(1,N), zeros(1,N)]];
b = [zeros(N,1); zeros(N,1); -systemData.reserveReq];
% 求解混合整数规划
intcon = 2*N+1:3*N; % 指定整数变量
options = optimoptions('intlinprog','Display','final');
[x, fval] = intlinprog(f,intcon,A,b,Aeq,beq,lb,ub,[],options);
% 结果提取
dispatch = x(1:N);
reserve = x(N+1:2*N);
status = x(2*N+1:end);
totalCost = fval;
end
5. 结果分析与可视化
5.1 出清结果解析
典型输出应包括:
- 各机组能量出力和备用分配
- 边际价格(对偶变量值)
- 总成本分解
matlab复制% 获取对偶变量(边际价格)
[~, ~, exitflag, output, lambda] = linprog(...);
energyPrice = lambda.eqlin; % 能量边际价格
reservePrice = -lambda.ineqlin(2); % 备用边际价格
5.2 可视化方法
建议采用堆叠条形图展示机组出力分配:
matlab复制figure;
bar([dispatch, reserve], 'stacked');
xlabel('Generator Index');
ylabel('Power (MW)');
legend('Energy Dispatch', 'Spinning Reserve');
title('Market Clearing Results');
grid on;
6. 实际应用中的注意事项
-
报价策略影响:实践中常遇到发电企业通过策略性报价(如将部分能量成本转移到备用报价)影响出清结果,需在模型中设计报价验证机制。
-
网络约束考虑:基础模型未考虑输电限制,实际区域市场需增加直流潮流约束:
matlab复制% 添加PTDF矩阵约束 A_flow = [PTDF, zeros(size(PTDF,1),N)]; b_flow = lineLimits - PTDF*(busLoad - dispatch); -
备用有效性验证:需确保申报的旋转备用确实可快速响应,可通过历史性能数据对机组设置不同的备用折扣系数。
-
求解性能优化:对于含整数变量的大规模问题:
- 采用Benders分解等算法
- 设置合理的MIPGap(如0.1%)
- 利用warm start加速求解
我在实际系统仿真中发现,当机组数量超过50台时,预处理时间可能占整个求解过程的30%以上。一个有效的优化是预先分析约束矩阵的结构特点,对A矩阵采用按行分块的并行构建方式:
matlab复制% 并行构建约束矩阵示例
spmd
localA = buildLocalConstraints(codistributed(genData), labindex);
end
A = [localA{:}]; % 合并各worker构建的子矩阵
