matlab+gurobi风电场站内按照发电量最大的风机恢复顺序问题

 风电场站内风机成组恢复时,直到最后一步才会将所有风机恢复,而中间过程不进行其他操作。

风电场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);

下面为程序结果(行表示组,列表示时步):辅机状态结果

matlab+gurobi风电场站内按照发电量最大的风机恢复顺序问题_第1张图片

 问题描述:目标函数为发电量最大,按照上述表示,正确的结果应该为第三时步全部恢复,而我所表示的结果从第三时步到第八时步都不进行操作。

你可能感兴趣的:(matlab,开发语言)