风电场站内风机成组恢复时,直到最后一步才会将所有风机恢复,而中间过程不进行其他操作。
风电场10个时步,奇数时步恢复辅机,偶数时步恢复风机。
warning('off');
clear
clc
yalmip;
%新能源场站内节点上的辅机及新能源机组信息
%第1列:节点号 第2列:辅机功率 第3列:额定容量 第4列:功频静特性系数(机组) 第5列:功频静特性系数(辅机) 第6列:惯性时间常数
Ebus=[
1,18000,2000000,25,1,10;
2,18000,2000000,25,1,10;
3,18000,2000000,25,1,10;
4,18000,2000000,25,1,10;
5,18000,2000000,25,1,10;
6,18000,2000000,25,1,10;
7,18000,2000000,25,1,10;
8,18000,2000000,25,1,10;
9,18000,2000000,25,1,10;
10,18000,2000000,25,1,10;
11,18000,2000000,25,1,10;
12,18000,2000000,25,1,10;
13,18000,2000000,25,1,10;
14,18000,2000000,25,1,10;
15,18000,2000000,25,1,10;
16,18000,2000000,25,1,10;
17,18000,2000000,25,1,10;
18,18000,2000000,25,1,10;
19,18000,2000000,25,1,10;
20,18000,2000000,25,1,10;
21,18000,2000000,25,1,10;
22,18000,2000000,25,1,10;
23,18000,2000000,25,1,10;
24,18000,2000000,25,1,10;
25,18000,2000000,25,1,10;
26,18000,2000000,25,1,10;
27,18000,2000000,25,1,10;
];
ND=length(Ebus);%有27个节点
%新能源场站内线路信息
%第1列:线路号 第2列:首节点 第3列:末节点 第4列:rij 第5列:xij
Ebranch=[1,0,1;
2,1,2;
3,2,3;
4,3,4;
5,4,5;
6,0,6;
7,6,7;
8,7,8;
9,8,9;
10,9,10;
11,0,11;
12,11,12;
13,12,13;
14,13,14;
15,14,15;
16,0,16;
17,16,17;
18,17,18;
19,18,19;
20,19,20;
21,20,21;
22,0,22;
23,22,23;
24,23,24;
25,24,25;
26,25,26;
27,26,27;
];
NC=length(find(0==Ebranch(:,2)));%有5组
NE=[5;5;5;6;6];
%% 额定常数
NT=2*NC;%最大总时步为2倍分组数
fmax=0.2/50;%最大稳态频率偏差;0.2/50P.U.
ft=0.5;%最大暂态频率偏差;
R=0.5/50;%频率变化量最大值 0.5HZ/s
SG=2500000;%外部带电域或储能的额定容量 2.5MW
KG=100;%外部带电域或储能的功频静特性系数 50p.u.
HG=25;%外部带电域或储能的惯性时间常数 5s
dfG=2;
PL=18000;
SW=2000000;
KW=25;
KL=1;
HW=10;
dfW=4;
%% 决策变量
K=sdpvar(1,NT,'full');%每一个时步的功频静特性系数
H=sdpvar(1,NT,'full');%每一个时步的惯性时间常数
P1=sdpvar(1,NT,'full');%每一个时步辅机所需要的功率
P2=sdpvar(1,NT,'full');%每一个时步新能源场站的出力
T=sdpvar(1,NT,'full');%每一时步的时间
t=sdpvar(NC,NT,'full');%每一组辅机或者风机恢复需要的时间
n=sdpvar(NC,NT,'full');%每一组已恢复的辅机数
k=sdpvar(NC,NT,'full');%每一组已恢复的风机数
Nn=sdpvar(1,NT,'full');
Nk=sdpvar(1,NT,'full');
v=binvar(NC,NT,'full');%每一个时步每一组新能源机组辅机的运行状态
u=binvar(NC,NT,'full');%每一个时步每一组新能源机组的运行状态 0表示未稳定出力 1表示稳定出力
a=binvar(11,NT,'full');
%% 目标函数
st=[];
% f=[];
for m=1:NT
f=-sum(P2(1,m)*T(1,m));
end
%为解决目标无界性,对所有决策变量进行约束
% for m=1:NT
% for i=1:NC
st=st+[0<=t<=100;
0<=n<=10;
0<=k<=10;];
% end
% end
% for m=1:NT
st=st+[0<=K<=100;
0<=H<=100;
0<=P1<=27*PL;
0<=P2<=27*SW;
40<=T<=100;
0<=Nn<=27;
0<=Nk<=27;
];
% end
%% 约束条件
%根据约束对第一时步相关参数进行预设
for m=1
st=st+[u(1:5,m)==0;
K(1,m)==KG;
H(1,m)==HG;
P1(1,m)==90000;
% P2(1,m)==0;
];
end
%0/1决策变量约束,辅机的状态量与新能源机组的状态量间的约束
%偶数时步决策变量v不会变化,奇数时步会选择v是否为0/1
for m=2:NT
for i=1:NC
st=st+[implies(v(i,m-1),v(i,m)==1)];
end
end
st=st+[v(:,1)==v(:,2);
v(:,3)==v(:,4);
v(:,5)==v(:,6);
v(:,7)==v(:,8);
v(:,9)==v(:,10);
];
%u与v的关系
for m=2:NT
for i=1:NC
st=st+[u(i,m)==v(i,m-1)];%辅机启动后下一时步新能源机组启动
end
end
%对每一时步的01决策变量进行计数
for m=1:NT
for i=1:NC
st=st+[n(i,m)==v(i,m)*NE(i,1);
k(i,m)==u(i,m)*NE(i,1)];
end
end
%当前已恢复的辅机和风电机组总数
Nn=sum(n,1);
Nk=sum(k,1);
% 时间约束 新能源辅机恢复时,新能源所在线路及变压器恢复考虑在这一时步(40+20+5*n)新能源机组恢复时(40+10)
for m=1
for i=1:NC
t(i,m)=60*v(i,m)+5*n(i,m)+50*u(i,m);
end
end
for m=2:NT
for i=1:NC
t(i,m)=60*(v(i,m)-v(i,m-1))+5*(n(i,m)-n(i,m-1))+50*(u(i,m)-u(i,m-1));
end
end
Z=40*ones(1,NT);
t1=[t;Z];
T=max(t1,[],1);%每一个时步的时间按照每组恢复的最大时间计算
%工频静特性系数以及惯性时间常数
for m=2:NT
st=st+[sum(a,1)==1;
implies(a(1,m),[Nk(1,m)==5,K(1,m)==(5*SW*KW+SG*KG)/(5*SW+SG),H(1,m)==(5*SW*HW+SG*HG)/(5*SW+SG)]);
implies(a(2,m),[Nk(1,m)==6,K(1,m)==(6*SW*KW+SG*KG)/(6*SW+SG),H(1,m)==(6*SW*HW+SG*HG)/(6*SW+SG)]);
implies(a(3,m),[Nk(1,m)==10,K(1,m)==(10*SW*KW+SG*KG)/(10*SW+SG),H(1,m)==(10*SW*HW+SG*HG)/(10*SW+SG)]);
implies(a(4,m),[Nk(1,m)==11,K(1,m)==(11*SW*KW+SG*KG)/(11*SW+SG),H(1,m)==(11*SW*HW+SG*HG)/(11*SW+SG)]);
implies(a(5,m),[Nk(1,m)==12,K(1,m)==(12*SW*KW+SG*KG)/(12*SW+SG),H(1,m)==(12*SW*HW+SG*HG)/(12*SW+SG)]);
implies(a(6,m),[Nk(1,m)==15,K(1,m)==(15*SW*KW+SG*KG)/(15*SW+SG),H(1,m)==(15*SW*HW+SG*HG)/(15*SW+SG)]);
implies(a(7,m),[Nk(1,m)==16,K(1,m)==(16*SW*KW+SG*KG)/(16*SW+SG),H(1,m)==(16*SW*HW+SG*HG)/(16*SW+SG)]);
implies(a(8,m),[Nk(1,m)==17,K(1,m)==(17*SW*KW+SG*KG)/(17*SW+SG),H(1,m)==(17*SW*HW+SG*HG)/(17*SW+SG)]);
implies(a(9,m),[Nk(1,m)==21,K(1,m)==(21*SW*KW+SG*KG)/(21*SW+SG),H(1,m)==(21*SW*HW+SG*HG)/(21*SW+SG)]);
implies(a(10,m),[Nk(1,m)==22,K(1,m)==(22*SW*KW+SG*KG)/(22*SW+SG),H(1,m)==(22*SW*HW+SG*HG)/(22*SW+SG)]);
implies(a(11,m),[Nk(1,m)==27,K(1,m)==(27*SW*KW+SG*KG)/(27*SW+SG),H(1,m)==(27*SW*HW+SG*HG)/(27*SW+SG)]);
];
end
% 稳态频率约束
for m=2:NT
% for i=1:NC
st=st+[
% S1(1,m)==SW*Nk(1,m)+SG;
% S2(1,m)==KW*SW*sum(k(i,m))+KG*SG;
% K(1,m)==S2(1,m)/S1(1,m);%H=A/B→H*B=A无法解决,采用implies全部列举出来
P1(1,m)<=fmax*K(1,m)*(SW*Nk(1,m)+SG);
P2(1,m)<=fmax*K(1,m)*(SW*Nk(1,m)+SG)
];
% end
end
% 惯量响应约束
for m=2:NT
% for i=1:NC
st=st+[
% S1(1,m)*H(1,m)==HW*SW*sum(k(i,m))+HG*SG;%H=A/B→H*B=A
P1(1,m)<=2*R*H(1,m)*(SW*Nk(1,m)+SG);
P2(1,m)<=2*R*H(1,m)*(SW*Nk(1,m)+SG)
];
% end
end
%暂态频率约束
for m=2:NT
% for i=1:NC
st=st+[
% S1(1,m)*H(1,m)==HW*SW*sum(k(i,m))+HG*SG;%H=A/B→H*B=A
P1(1,m)<=ft*(Nk(1,m)*SW/dfW+SG/dfG);
P2(1,m)<=ft*(Nk(1,m)*SW/dfW+SG/dfG)
];
% end
end
% 启动功率以及新能源机组出力等式关系
for m=1:NT
% for i=1:NC
st=st+[P1(1,m)==PL*Nn(1,m);
% P2(1,m)==0.1*SW*sum(k(i,m))
0.01*SW*Nk(1,m)<=P2(1,m)<=SW*Nk(1,m);
];
% end
end
for m=1:NT
st=st+[P3(1,m)==maxSW*Nk(1,m)];
end
%% 求解
gurobi_stop_gap = 10^(-4); % 设置求解混合整数规划的 Gap 为10^(-4)
longest_solve_time = 300; % 设置最长求解时间为 300 秒
NumericFocus = 2;%
options=sdpsettings('verbose',2,'solver','gurobi+', 'debug', 1, 'gurobi.NonConvex', 2,'gurobi.timelimit',longest_solve_time,...
'gurobi.MIPGap', gurobi_stop_gap);%cplex%,'gurobi.NumericFocus',NumericFocus
result=optimize(st,f,options)
value(f);
warning('off');
clear
clc
yalmip;
%新能源场站内节点上的辅机及新能源机组信息
%第1列:节点号 第2列:辅机功率 第3列:额定容量 第4列:功频静特性系数(机组) 第5列:功频静特性系数(辅机) 第6列:惯性时间常数
Ebus=[
1,18000,2000000,25,1,10;
2,18000,2000000,25,1,10;
3,18000,2000000,25,1,10;
4,18000,2000000,25,1,10;
5,18000,2000000,25,1,10;
6,18000,2000000,25,1,10;
7,18000,2000000,25,1,10;
8,18000,2000000,25,1,10;
9,18000,2000000,25,1,10;
10,18000,2000000,25,1,10;
11,18000,2000000,25,1,10;
12,18000,2000000,25,1,10;
13,18000,2000000,25,1,10;
14,18000,2000000,25,1,10;
15,18000,2000000,25,1,10;
16,18000,2000000,25,1,10;
17,18000,2000000,25,1,10;
18,18000,2000000,25,1,10;
19,18000,2000000,25,1,10;
20,18000,2000000,25,1,10;
21,18000,2000000,25,1,10;
22,18000,2000000,25,1,10;
23,18000,2000000,25,1,10;
24,18000,2000000,25,1,10;
25,18000,2000000,25,1,10;
26,18000,2000000,25,1,10;
27,18000,2000000,25,1,10;
];
ND=length(Ebus);%有27个节点
%新能源场站内线路信息
%第1列:线路号 第2列:首节点 第3列:末节点 第4列:rij 第5列:xij
Ebranch=[1,0,1;
2,1,2;
3,2,3;
4,3,4;
5,4,5;
6,0,6;
7,6,7;
8,7,8;
9,8,9;
10,9,10;
11,0,11;
12,11,12;
13,12,13;
14,13,14;
15,14,15;
16,0,16;
17,16,17;
18,17,18;
19,18,19;
20,19,20;
21,20,21;
22,0,22;
23,22,23;
24,23,24;
25,24,25;
26,25,26;
27,26,27;
];
NC=length(find(0==Ebranch(:,2)));%有5组
NE=[5;5;5;6;6];
%% 额定常数
NT=2*NC;%最大总时步为2倍分组数
fmax=0.2/50;%最大稳态频率偏差;0.2/50P.U.
ft=0.5;%最大暂态频率偏差;
R=0.5/50;%频率变化量最大值 0.5HZ/s
SG=2500000;%外部带电域或储能的额定容量 2.5MW
KG=100;%外部带电域或储能的功频静特性系数 50p.u.
HG=25;%外部带电域或储能的惯性时间常数 5s
dfG=2;
PL=18000;
SW=2000000;
KW=25;
KL=1;
HW=10;
dfW=4;
%% 决策变量
K=sdpvar(1,NT,'full');%每一个时步的功频静特性系数
H=sdpvar(1,NT,'full');%每一个时步的惯性时间常数
P1=sdpvar(1,NT,'full');%每一个时步辅机所需要的功率
P2=sdpvar(1,NT,'full');%每一个时步新能源场站的出力
T=sdpvar(1,NT,'full');%每一时步的时间
t=sdpvar(NC,NT,'full');%每一组辅机或者风机恢复需要的时间
n=sdpvar(NC,NT,'full');%每一组已恢复的辅机数
k=sdpvar(NC,NT,'full');%每一组已恢复的风机数
Nn=sdpvar(1,NT,'full');
Nk=sdpvar(1,NT,'full');
v=binvar(NC,NT,'full');%每一个时步每一组新能源机组辅机的运行状态
u=binvar(NC,NT,'full');%每一个时步每一组新能源机组的运行状态 0表示未稳定出力 1表示稳定出力
a=binvar(11,NT,'full');
%% 目标函数
st=[];
for m=1:NT
f=-sum(P2(1,m)*T(1,m));
end
%为解决目标无界性,对所有决策变量进行约束
st=st+[0<=t<=100;
0<=n<=10;
0<=k<=10;];
st=st+[0<=K<=100;
0<=H<=100;
0<=P1<=27*PL;
0<=P2<=27*SW;
40<=T<=100;
0<=Nn<=27;
0<=Nk<=27;
];
% end
%% 约束条件
%根据约束对第一时步相关参数进行预设
for m=1
st=st+[u(1:5,m)==0;
K(1,m)==KG;
H(1,m)==HG;
P1(1,m)==90000;
% P2(1,m)==0;
];
end
%0/1决策变量约束,辅机的状态量与新能源机组的状态量间的约束
%偶数时步决策变量v不会变化,奇数时步会选择v是否为0/1
for m=2:NT
for i=1:NC
st=st+[implies(v(i,m-1),v(i,m)==1)];
end
end
st=st+[v(:,1)==v(:,2);
v(:,3)==v(:,4);
v(:,5)==v(:,6);
v(:,7)==v(:,8);
v(:,9)==v(:,10);
];
%u与v的关系
for m=2:NT
for i=1:NC
st=st+[u(i,m)==v(i,m-1)];%辅机启动后下一时步新能源机组启动
end
end
%对每一时步的01决策变量进行计数
for m=1:NT
for i=1:NC
st=st+[n(i,m)==v(i,m)*NE(i,1);
k(i,m)==u(i,m)*NE(i,1)];
end
end
%当前已恢复的辅机和风电机组总数
Nn=sum(n,1);
Nk=sum(k,1);
% 时间约束 新能源辅机恢复时,新能源所在线路及变压器恢复考虑在这一时步(40+20+5*n)新能源机组恢复时(40+10)
for m=1
for i=1:NC
t(i,m)=60*v(i,m)+5*n(i,m)+50*u(i,m);
end
end
for m=2:NT
for i=1:NC
t(i,m)=60*(v(i,m)-v(i,m-1))+5*(n(i,m)-n(i,m-1))+50*(u(i,m)-u(i,m-1));
end
end
Z=40*ones(1,NT);
t1=[t;Z];
T=max(t1,[],1);%每一个时步的时间按照每组恢复的最大时间计算
%工频静特性系数以及惯性时间常数
for m=2:NT
st=st+[sum(a,1)==1;
implies(a(1,m),[Nk(1,m)==5,K(1,m)==(5*SW*KW+SG*KG)/(5*SW+SG),H(1,m)==(5*SW*HW+SG*HG)/(5*SW+SG)]);
implies(a(2,m),[Nk(1,m)==6,K(1,m)==(6*SW*KW+SG*KG)/(6*SW+SG),H(1,m)==(6*SW*HW+SG*HG)/(6*SW+SG)]);
implies(a(3,m),[Nk(1,m)==10,K(1,m)==(10*SW*KW+SG*KG)/(10*SW+SG),H(1,m)==(10*SW*HW+SG*HG)/(10*SW+SG)]);
implies(a(4,m),[Nk(1,m)==11,K(1,m)==(11*SW*KW+SG*KG)/(11*SW+SG),H(1,m)==(11*SW*HW+SG*HG)/(11*SW+SG)]);
implies(a(5,m),[Nk(1,m)==12,K(1,m)==(12*SW*KW+SG*KG)/(12*SW+SG),H(1,m)==(12*SW*HW+SG*HG)/(12*SW+SG)]);
implies(a(6,m),[Nk(1,m)==15,K(1,m)==(15*SW*KW+SG*KG)/(15*SW+SG),H(1,m)==(15*SW*HW+SG*HG)/(15*SW+SG)]);
implies(a(7,m),[Nk(1,m)==16,K(1,m)==(16*SW*KW+SG*KG)/(16*SW+SG),H(1,m)==(16*SW*HW+SG*HG)/(16*SW+SG)]);
implies(a(8,m),[Nk(1,m)==17,K(1,m)==(17*SW*KW+SG*KG)/(17*SW+SG),H(1,m)==(17*SW*HW+SG*HG)/(17*SW+SG)]);
implies(a(9,m),[Nk(1,m)==21,K(1,m)==(21*SW*KW+SG*KG)/(21*SW+SG),H(1,m)==(21*SW*HW+SG*HG)/(21*SW+SG)]);
implies(a(10,m),[Nk(1,m)==22,K(1,m)==(22*SW*KW+SG*KG)/(22*SW+SG),H(1,m)==(22*SW*HW+SG*HG)/(22*SW+SG)]);
implies(a(11,m),[Nk(1,m)==27,K(1,m)==(27*SW*KW+SG*KG)/(27*SW+SG),H(1,m)==(27*SW*HW+SG*HG)/(27*SW+SG)]);
];
end
% 稳态频率约束
for m=2:NT
st=st+[P1(1,m)<=fmax*K(1,m)*(SW*Nk(1,m)+SG);
P2(1,m)<=fmax*K(1,m)*(SW*Nk(1,m)+SG)
];
end
% 惯量响应约束
for m=2:NT
st=st+[P1(1,m)<=2*R*H(1,m)*(SW*Nk(1,m)+SG);
P2(1,m)<=2*R*H(1,m)*(SW*Nk(1,m)+SG)
];
end
% 启动功率以及新能源机组出力等式关系
for m=1:NT
st=st+[P1(1,m)==PL*Nn(1,m);
0.01*SW*Nk(1,m)<=P2(1,m)<=SW*Nk(1,m)];
end
%% 求解
gurobi_stop_gap = 10^(-4); % 设置求解混合整数规划的 Gap 为10^(-4)
longest_solve_time = 300; % 设置最长求解时间为 300 秒
NumericFocus = 2;%
options=sdpsettings('verbose',2,'solver','gurobi+', 'debug', 1, 'gurobi.NonConvex', 2,'gurobi.timelimit',longest_solve_time,...
'gurobi.MIPGap', gurobi_stop_gap);%cplex%,'gurobi.NumericFocus',NumericFocus
result=optimize(st,f,options)
value(f);
%% 结论
AP1=value(P1);
AP2=value(P2);
Bv=value(v);
Bu=value(u);
下面为程序结果(行表示组,列表示时步):辅机状态结果
问题描述:目标函数为发电量最大,按照上述表示,正确的结果应该为第三时步全部恢复,而我所表示的结果从第三时步到第八时步都不进行操作。