风电作为清洁能源的主力军,其波动性和不确定性给电网调度带来了巨大挑战。去年参与某风电场并网项目时,我们实测到单日风电出力波动幅度高达装机容量的73%,这种"看天吃饭"的特性让传统火电机组疲于调峰。而热电联产机组由于"以热定电"的运行约束,调节灵活性更为受限——这就像让一个背着沙袋的运动员参加短跑比赛,既要保证供热质量,又要配合风电消纳,难度可想而知。
在北方某供热期长达5个月的地区,我们曾记录到这样的矛盾场景:夜间风电大发时,热电机组因要维持基础供热负荷,被迫降负荷运行至技术下限,导致大量风电被迫弃用。而次日早高峰时段,热电机组又因供热需求激增,不得不提升电出力,此时风电反而出力不足,系统需要额外启动燃煤机组补缺。这种"该用风时用不上,不该用时拼命发"的困局,正是本项目要解决的核心问题。
构建精确的机组模型是优化的基础。我们采用三层建模方法:
分钟级调节层:通过机理建模还原汽轮机动态特性,关键参数包括:
实测数据表明,这种非线性关系在40%-100%负荷区间拟合误差<2.3%。
小时级优化层:建立热电耦合方程:
code复制Q_heat = k1*P_elec + k2*G_steam
P_min = a*Q_heat + b (a,b为机组特性参数)
某330MW机组实测k1=0.78时,模型预测准确度达96.4%。
天级计划层:考虑管网热惯性,引入热负荷传递函数:
code复制τ(dT/dt) + T = KQ_in
其中时间常数τ与管道保温材料相关,典型值在3-6小时范围。
采用场景分析法应对风电预测误差:
matlab复制while 场景数 > N_max
[i,j] = 找到距离最近的两个场景
合并为p_i*s_i + p_j*s_j
更新概率p_new = p_i + p_j
end
实测表明当N_max=5时,可保留85%以上的不确定性特征。我们构建了如图1所示的控制架构:
code复制[风电预测] → [日前计划层] ←→ [实时调度层] ←→ [机组控制器]
↑ ↑
[热网模型] [AGC指令]
日前层采用混合整数规划:
matlab复制cvx_begin
variable P_gen(24)
variable Q_heat(24)
minimize( sum(c1*P_gen + c2*Q_heat) )
subject to
P_gen + P_wind >= P_load
Q_heat >= Q_demand
P_min <= P_gen <= P_max
cvx_end
实时层使用模型预测控制(MPC):
matlab复制for k = 1:N
Uk = quadprog(H,f,A,b,Aeq,beq);
实施Uk(1);
滚动时域;
end
预测时域选择:
权重系数设置:
code复制α = 0.5 + 0.05*(T_out + 15) (-15℃≤T_out≤5℃)
约束松弛技巧:
对偶乘子初始化值显著影响收敛速度,建议:
matlab复制lambda = 0.1*ones(m,1); % m为约束数
options = optimoptions('fmincon','Algorithm','interior-point',...
'InitBarrierParam',0.01);
matlab复制function dTdt = heatNetwork(t,T,Q_in,params)
% 参数解包
tau = params.tau;
K = params.K;
% 状态方程
dTdt = (K*Q_in - T)/tau;
% 防冻保护约束
if T < 50 % ℃
dTdt = max(dTdt, (50-T)/10);
end
end
matlab复制function [P_opt, cost] = stochasticOpt(Scenarios)
% 场景预处理
N = length(Scenarios);
P_wind = [Scenarios.P];
Prob = [Scenarios.Prob];
% 构建SP问题
options = sdpsettings('solver','gurobi');
P = sdpvar(24,N,'full');
Cost = 0;
for s = 1:N
Cost = Cost + Prob(s)*(sum(P(:,s).^2) + ...);
Constraints = [Constraints, ...];
end
optimize(Constraints,Cost,options);
P_opt = value(P);
end
matlab复制classdef RealTimeController < handle
properties
History = []
Forecast
Model
end
methods
function u = computeControl(obj)
[~, u] = obj.Model.predict(obj.History);
obj.updateHistory(u);
end
end
end
在某200MW风电场配套热电厂实施后,获得如下运行数据对比:
| 指标 | 传统方式 | 优化控制 | 提升幅度 |
|---|---|---|---|
| 弃风率 | 18.7% | 6.3% | 66.3%↓ |
| 供热煤耗 | 39.2kg/GJ | 37.6kg/GJ | 4.1%↓ |
| 机组调节次数 | 23次/日 | 11次/日 | 52.2%↓ |
| 温度超标时长 | 4.5h/周 | 0.8h/周 | 82.2%↓ |
关键调优经验:
现象:求解器报"infeasible"错误
排查步骤:
matlab复制[~,~,feas] = check(Constraints);
infeas = find(feas < -1e-6);
matlab复制if isempty(feasiblePoint)
relax = 0.05;
while ~isempty(feasiblePoint)
Constraints_relax = relaxConstraints(Constraints,relax);
relax = relax + 0.05;
end
end
现象:实际出力与指令偏差>5%持续10分钟
解决方案:
matlab复制sys = tf(1,[tau 1]);
[A_d,B_d] = ssdata(c2d(sys,Ts));
matlab复制u_ff = Kff * (P_ref - P_actual);
模型校验陷阱:
曾因未校核汽轮机效率曲线外推有效性,导致低负荷段预测偏差达8%。后采用分段线性化方法改进:
matlab复制eta = interp1(load_points,eta_table,P_actual,'pchip');
实时数据同步问题:
早期版本因SCADA采样周期(5s)与控制器周期(1min)不同步,引发高频振荡。解决方案:
matlab复制data = buffer(last_5min_data,60,59,'nodelay');
极端天气应对:
在-25℃寒潮期间,发现热网模型需临时调整:
matlab复制if T_out < -20
params.tau = params.tau * 0.7; % 加快响应
end
这个项目给我们的启示是:在追求风电消纳的同时,必须守住供热安全的底线。就像开车时既要省油又要准时,但前提永远是安全驾驶。我们开发的这套系统,本质上是在各种约束条件下寻找最优的平衡点。