电力系统机组组合优化(附代码)

 符号说明

模型建立

根据上述变量定义,建立含安全约束的机组最优组合(SCUC)模型如下:

目标函数

目标函数即为最小化成本,包括发电带来的煤耗成本和机组启停产生的开停机成本                         

其中,机组的煤耗函数可用出力的二次函数表述:

等式约束条件

此即为系统的功率平衡约束。

不等式约束条件

(1)热备用                       

(2)机组出力约束

(3)机组爬坡约束    

(4)机组起停时间约束                                                                

(5)起停费用约束

(6) 潮流安全约束

当机组启动最小出力大于爬坡速率,机组爬坡约束将使得所有关停的机组都无法启动,因此改写为

其中,为了简化,可以将启动最大升速率和停机最大降速率都取为

 计算潮流的转移分布因子矩阵,将潮流安全约束改写为

其中描述节点ii的注入功率对于线路l产生的影响。则简化模型的变量为,在满足约束下,最小化目标函数

模型简化

由上小节构建的机组组合优化模型,煤耗成本采用二次函数,当系统规模较大时(如节点数超过1000),求解起来将消耗大量时间。因此我们可以对原模型进行线性化处理。

将煤耗函数分段线性化,分为m段,将原模型煤耗函数的替换为

其中,  \[{{K}_{i,s}}\]代表分段线性化后煤耗函数各段斜率,\[{{C}_{0,i}}\]表示机组开机并以最小出力${{P}_{i,\min }}$运行产生的煤耗,${{p}_{i,t,s}}$为机组分段的出力,满足下式:

 算例 ​​​​​​

校验程序的算例基于IEEE-30节点标准测试系统,系统接线图如图1。系统包含30个节点,6台发电机组。要求确定系统最优机组组合,使得系统各机组总运行成本(煤耗成本+启停成本)最小化。

 图1. IEEE-30节点测试系统接线

已知:给定系统数据包括如下:

线路网络参数:

编号首端节点末端节点支路电抗(p.u.)1/2充电电纳(p.u.)Plmax(p.u.)Plmin(p.u.)
1120.05750.02641.3-1.3
2130.18520.02041.3-1.3
3240.17370.01840.65-0.65
4340.03790.00421.3-1.3
5250.19830.02091.3-1.3
6260.17630.01870.65-0.65
7460.04140.00450.9-0.9
8570.1160.01020.7-0.7
9670.0820.00851.3-1.3
10680.0420.00450.32-0.32
11690.20800.65-0.65
126100.55600.32-0.32
139110.20800.65-0.65
149100.1100.65-0.65
154120.25600.65-0.65
1612130.1400.65-0.65
1712140.255900.32-0.32
1812150.130400.32-0.32
1912160.198700.32-0.32
2014150.199700.16-0.16
2116170.193200.16-0.16
2215180.218500.16-0.16
2318190.129200.16-0.16
2419200.06800.32-0.32
2510200.20900.32-0.32
2610170.084500.32-0.32
2710210.074900.32-0.32
2810220.149900.32-0.32
2921220.023600.32-0.32
3015230.20200.16-0.16
3122240.17900.16-0.16
3223240.2700.16-0.16
3324250.329200.16-0.16
3425260.3800.16-0.16
3525270.208700.16-0.16
3628270.39600.65-0.65
3727290.415300.16-0.16
3827300.602700.16-0.16
3929300.453300.16-0.16
408280.20.02140.32-0.32
416280.05990.00650.32-0.32

机组参数:

机组编号节点号Pmax(p.u.)Pmin(p.u.)a(/(p.u.)2b(/p.u.c(吨)Ru/Rd /下爬坡速率 (p.u./h)TS/TD 关停/开机最小持续时间(h)H 启动成本($/次)J 关停成本($/次)
111.57490.50.152438.5397786.7990.37523937319686
2210.250.105846.1591945.6330.322500012500
350.60.150.02840.396510500.152150007500
480.80.20.035438.30551243.530.222000010000
5110.40.10.021136.32781658.570.152100005000
6130.40.10.017938.27041356.660.152100005000

各节点各时段负荷曲线(24小时):

节点编号T1T2T3T4T5T6T7T8T9T10T11T12T13T14T15T16T17T18T19T20T21T22T23T24
1000000000000000000000000
20.1640800730.1576280.1528170.1512320.1512320.1528170.1752870.194530.2089630.2106040.2106040.2089630.2089630.2089630.2057930.2073780.2151320.2170.2170.2106040.2025110.1897190.1737020.157628
30.0181471050.0174330.0169010.0167260.0167260.0169010.0193870.0215150.0231110.0232930.0232930.0231110.0231110.0231110.0227610.0229360.0237930.0240.0240.0232930.0223970.0209830.0192110.017433
40.0574658320.0552060.0535210.0529660.0529660.0535210.0613910.068130.0731850.073760.073760.0731850.0731850.0731850.0720750.072630.0753460.0760.0760.073760.0709250.0664450.0608360.055206
50.7122738660.6842640.663380.6565010.6565010.663380.7609220.8444590.9071110.9142360.9142360.9071110.9071110.9071110.8933520.9002320.9338920.9420.9420.9142360.8791020.8235740.7540420.684264
6000000000000000000000000
70.1723974960.1656180.1605630.1588980.1588980.1605630.1841720.2043910.2195560.221280.221280.2195560.2195560.2195560.2162250.217890.2260380.2280.2280.221280.2127760.1993360.1825070.165618
80.2268388110.2179190.2112680.2090770.2090770.2112680.2423320.2689360.2888890.2911580.2911580.2888890.2888890.2888890.2845070.2866980.2974180.30.30.2911580.2799690.2622850.2401410.217919
9000000000000000000000000
100.0438555030.0421310.0408450.0404210.0404210.0408450.0468510.0519940.0558520.0562910.0562910.0558520.0558520.0558520.0550050.0554280.0575010.0580.0580.0562910.0541270.0507080.0464270.042131
11000000000000000000000000
120.0846864890.0813560.0788730.0780550.0780550.0788730.0904710.1004030.1078520.1086990.1086990.1078520.1078520.1078520.1062160.1070340.1110360.1120.1120.1086990.1045220.097920.0896530.081356
13000000000000000000000000
140.0468800210.0450370.0436620.0432090.0432090.0436620.0500820.055580.0597040.0601730.0601730.0597040.0597040.0597040.0587980.0592510.0614660.0620.0620.0601730.057860.0542060.0496290.045037
150.0620026080.0595640.0577460.0571480.0571480.0577460.0662370.0735090.0789630.0795830.0795830.0789630.0789630.0789630.0777650.0783640.0812940.0820.0820.0795830.0765250.0716910.0656380.059564
160.0264645280.0254240.0246480.0243920.0243920.0246480.0282720.0313760.0337040.0339680.0339680.0337040.0337040.0337040.0331920.0334480.0346990.0350.0350.0339680.0326630.03060.0280160.025424
170.0680516430.0653760.063380.0627230.0627230.063380.07270.0806810.0866670.0873470.0873470.0866670.0866670.0866670.0853520.0860090.0892250.090.090.0873470.0839910.0786850.0720420.065376
180.024196140.0232450.0225350.0223020.0223020.0225350.0258490.0286860.0308150.0310570.0310570.0308150.0308150.0308150.0303470.0305810.0317250.0320.0320.0310570.0298630.0279770.0256150.023245
190.071832290.0690080.0669010.0662080.0662080.0669010.0767380.0851630.0914810.09220.09220.0914810.0914810.0914810.0900940.0907880.0941820.0950.0950.09220.0886570.0830570.0760450.069008
200.0166348460.0159810.0154930.0153320.0153320.0154930.0177710.0197220.0211850.0213520.0213520.0211850.0211850.0211850.0208640.0210250.0218110.0220.0220.0213520.0205310.0192340.017610.015981
210.132322640.1271190.1232390.1219610.1219610.1232390.141360.1568790.1685190.1698420.1698420.1685190.1685190.1685190.1659620.167240.1734940.1750.1750.1698420.1633150.1529990.1400820.127119
22000000000000000000000000
230.024196140.0232450.0225350.0223020.0223020.0225350.0258490.0286860.0308150.0310570.0310570.0308150.0308150.0308150.0303470.0305810.0317250.0320.0320.0310570.0298630.0279770.0256150.023245
240.0657832550.0631960.0612680.0606320.0606320.0612680.0702760.0779910.0837780.0844360.0844360.0837780.0837780.0837780.0825070.0831420.0862510.0870.0870.0844360.0811910.0760630.0696410.063196
25000000000000000000000000
260.0264645280.0254240.0246480.0243920.0243920.0246480.0282720.0313760.0337040.0339680.0339680.0337040.0337040.0337040.0331920.0334480.0346990.0350.0350.0339680.0326630.03060.0280160.025424
27000000000000000000000000
28000000000000000000000000
290.0181471050.0174330.0169010.0167260.0167260.0169010.0193870.0215150.0231110.0232930.0232930.0231110.0231110.0231110.0227610.0229360.0237930.0240.0240.0232930.0223970.0209830.0192110.017433
300.0801497130.0769980.0746480.0738740.0738740.0746480.0856240.0950240.1020740.1028760.1028760.1020740.1020740.1020740.1005260.10130.1050880.1060.1060.1028760.0989220.0926740.084850.076998
总负荷2.1428706322.0586051.9957751.9750781.9750781.9957752.2892272.5405472.7290372.7504732.7504732.7290372.7290372.7290372.6876432.708342.8096072.8342.8342.7504732.6447712.4777172.2685312.058605

注意:数据均基于标幺化系统得到,因此电力电量参数、网络参数等都为标幺值,无量纲。还要注意附件中煤耗系数a,b,c的单位为吨,因此计算煤耗成本还需换算为价格,设燃煤价格为100$/

求解:机组组合结果,即机组各时段启停计划、机组各时段最优出力,以及内含的各时段的直流潮流等。

代码

clear;
clc;
yalmip;
Cplex;
%%系统参数
%所有参数均用有名值表示
paragen=xlsread('excel2017','机组参数');
loadcurve=xlsread('excel2017','负荷曲线');
netpara=xlsread('excel2017','网络参数');
branch_num=size(netpara);%网络中的支路
branch_num=branch_num(1,1);
PL_max=netpara(:,6);%线路最大负荷
PL_min=netpara(:,7);%线路最小负荷
limit=paragen(:,3:4);%机组出力上下限//limit(:,1)表示上限,limit(:,2)表示下限
para=paragen(:,5:7);%成本系数//para(:,1)表示系数a,para(:,2)表示系数b,para(:,3)表示系数c。
price=100;
para=price*para;%价格换算
lasttime=paragen(:,9);%持续时间
Rud=paragen(:,8);%上下爬坡速率//因题中简化上坡下坡速度相同
H=paragen(:,10);%启动成本
J=paragen(:,11);%关停成本
u0=[1 1 1 1 1 1];%初始状态
%% 规模变量
%机组数
gennum=size(paragen);
gennum=gennum(1,1);
%节点数
numnodes=size(loadcurve);
numnodes=numnodes(1,1)-1;
%时间范围
T=size(loadcurve);
T=T(1,2)-1;
%线性化分段数(按需要更改)
m=4;
%各时刻节点总负荷
PL=loadcurve(numnodes+1,2:T+1);
%%
%决策变量
u=binvar(gennum,T,'full');%状态变量
p=sdpvar(gennum,T,'full');%即各机组实时功率p(i,t)
Ps=sdpvar(gennum,T,m,'full');%分段出力
costH=sdpvar(gennum,T,'full');%启动成本
costJ=sdpvar(gennum,T,'full');%关停成本
sum_PowerGSDF=sdpvar(T,branch_num,numnodes,'full');%发电机的输出功率转移总和
%% 目标函数线性化
MaxPs=zeros(gennum,T,m);%这里表示分段出力的上限
st=[];%st约束初始化
for i=1:gennum   %目标函数线性化后分段出力的不等式约束
   for t=1:T
     for s=1:m
	MaxPs(i,t,s)=(limit(i,1)-limit(i,2))/m;
    st=st+[Ps(i,t,s)>=0,Ps(i,t,s)<=MaxPs(i,t,s)];
     end
   end
end
K=zeros(gennum,m);%煤耗函数的斜率值
for i=1:gennum
    for s=1:m
        K(i,s)=2*para(i,1)*(2*s-1)*MaxPs(i,1,1)+para(i,2);%推导简化后的煤耗斜率
    end
end
 %目标函数线性化后分段出力的等式约束
for i=1:gennum 
    for t=1:T
st=st+[p(i,t)==(sum(Ps(i,t,:),3)+u(i,t)*limit(i,2))];
    end
end
%% 目标函数
totalcost=0;%机组费用成本最小
%线性化的最优成本目标
for i=1:gennum
    for t=1:T
        for s=1:m
            totalcost=totalcost+K(i,s)*Ps(i,t,s);%线性化煤耗成本
        end
        totalcost=totalcost+u(i,t)*(para(i,2)*limit(i,2)+para(i,1)*limit(i,2)^2+para(i,3));%加上表示机组开机并以最小出力 运行产生的煤耗
        totalcost=totalcost+costH(i,t)+costJ(i,t);%加上机组启停产生的开停机成本
    end
end
%原二次函数式的最优成本目标
% for i=1:gennum
%     for t=1:T
%     totalcost=totalcost+para(i,1)*p(i,t).^2+para(i,2)*p(i,t)+para(i,3)*u(i,t);  %煤耗成本
%     totalcost=totalcost+costH(i,t);                                %启动成本
%     totalcost=totalcost+costJ(i,t);                                %关停成本
%     end
% end
%%
for t=1:T
st=st+[sum(p(:,t))==PL(1,t)];%负荷平衡约束;
end
%%
for t=1:T
    for i=1:gennum
  st=st+[u(i,t)*limit(i,2)<=p(i,t)<=u(i,t)*limit(i,1)];%机组出力上下限约束
    end
end
%% 机组爬坡约束
%按下式进行推导编程
% %启动最大升速率
% Su=(Pmax+Pmin)/2;
% %停机最大降速率
% Sd=(Pmax+Pmin)/2;
%Ru=Rud;Rd=Rud;
% %上爬坡约束
% for t=2:T
% st=st+[p(:,t)-p(:,t-1)<=u(:,t-1).*(Ru-Su)+Su];
% end
% %下爬坡约束
% for t=2:T
%st=st+[p(:,t-1)-p(:,t)<=u(:,t).*(Rd-Sd)+Sd];
% end
%展开表达式:
for t=2:T
    for i=1:gennum
    % st=st+[-Rud(i,1)*u(i,t)+(u(i,t)-u(i,t-1))*limit(i,2)-limit(i,1)*(1-u(i,t))<=p(i,t)-p(i,t-1)];
    % st=st+[p(i,t)-p(i,t-1)<=Rud(i,1)*u(i,t-1)+(u(i,t)-u(i,t-1))*limit(i,2)+limit(i,1)*(1-u(i,t))];
    %由于原式可能关机以后就无法再开动了,改用下式
    st=st+[p(i,t-1)-p(i,t)<=Rud(i,1)*u(i,t)+(1-u(i,t))*(limit(i,2)+limit(i,1))/2];%下坡
    st=st+[p(i,t)-p(i,t-1)<=Rud(i,1)*u(i,t-1)+(1-u(i,t-1))*(limit(i,2)+limit(i,1))/2];%上坡
    end
end
%% 热备用约束
hp=0.05;%热备用系数
for t=1:T
st=st+[sum(u(:,t).*limit(:,1)-p(:,t))>=hp*PL(1,t)];
end
%% 启停时间约束
%启动约束
for t=2:T
    for i=1:gennum
        indicator=u(i,t)-u(i,t-1);%启停时间约束的简化表达式(自己推导的),indicator为1表示启动,为0表示停止
        range=t:min(T,t+lasttime(i)-1);
        st=st+[u(i,range)>=indicator];
    end
end
%停机约束
for t=2:T
    for i=1:gennum
        indicator=u(i,t-1)-u(i,t);%启停时间约束
        range=t:min(T,t+lasttime(i)-1);%特别限制时间上限
        st=st+[u(i,range)<=1-indicator];
    end
end
%% 启停成本约束
for t=1:T   %启停成本零限约束
    for i=1:gennum
        st=st+[costH(i,t)>=0]; 
        st=st+[costJ(i,t)>=0];
    end
end
for i=1:gennum  %启停成本条件约束
   for t=2:T
         st=st+[costH(i,t)>=H(i,1)*(u(i,t)-u(i,t-1))];
         st=st+[costJ(i,t)>=J(i,1)*(u(i,t-1)-u(i,t))];
   end
    st=st+[costH(i,1)>=H(i,1)*(u(i,1)-u0(1,i))];%初始状态下的启停成本
    st=st+[costJ(i,1)>=J(i,1)*(u0(1,i)-u(i,1))];
end
%% 直流潮流约束
%% 直流潮流下的导纳矩阵节点参数初始化
netpara(:,4)=1./netpara(:,4);%电抗求倒数成电纳
slack_bus=26;%按不同的平衡节点号更改
Y=zeros(numnodes,numnodes);
%% 直流潮流的导纳矩阵计算
for k=1:branch_num 
    i=netpara(k,2);%首节点
    j=netpara(k,3);%尾节点
    Y(i,j)=-netpara(k,4);%导纳矩阵中非对角元素
    Y(j,i)= Y(i,j);
end
for k=1:numnodes
       Y(k,k)=-sum(Y(k,:)); %导纳矩阵中的对角元素 
end
%再删除掉平衡节点所在的行与列
Y(slack_bus,:)=[];
Y(:,slack_bus)=[];
xlswrite('直流潮流下的节点导纳矩阵',Y,'平衡节点取在第26号节点');
%% 输出功率转移分布因子(GSDF)
X=inv(Y);%X为直流潮流下节点导纳矩阵的逆矩阵
xlswrite('节点导纳的逆矩阵',X,'平衡节点未补充');
row=zeros(1,numnodes-1);%numnodes-1是因为节点导纳矩阵去掉了平衡节点
%再次引入平衡节点的矩阵值,根据直流潮流定义ΔΘ=ΧΔP,平衡机角度始终为0,所以所有涉及平衡节点的X均为0
X=[X(1:slack_bus-1,:);row;X(slack_bus:numnodes-1,:)];%插入全0行
column=zeros(numnodes,1);
X=[X(:,1:slack_bus-1) column X(:,slack_bus:numnodes-1)];%插入全0列
xlswrite('节点导纳的逆矩阵',X,'平衡节点补充');
G=zeros(branch_num,numnodes);%GSDF功率转移矩阵初始化
for k=1:branch_num
    m=netpara(k,2);%首端节点
    n=netpara(k,3);%末端节点
    xk=netpara(k,4);%支路k的阻抗值
for i=1:numnodes
    G(k,i)=(X(m,i)-X(n,i))*xk;%输出功率转移分布因子
end
end
power_gen=paragen(:,2);%发电机对应节点
sum_nodeGSDF=zeros(T,branch_num);%负荷节点的输出功率转移
for t=1:T
    for k=1:branch_num
        for i=1:gennum
            sum_PowerGSDF(t,k,i)=G(k,power_gen(i,1))*p(i,t);%这里即发电机对线路的输出功率转移式
        end
        for i=1:numnodes
            sum_nodeGSDF(t,k)=sum_nodeGSDF(t,k)+G(k,i)*loadcurve(i,t+1);%这里是所有负荷节点对线路的输出功率转移式
        end
        st=st+[PL_min(k,1)<=(sum(sum_PowerGSDF(t,k,:))-sum_nodeGSDF(t,k))];
        st=st+[(sum(sum_PowerGSDF(t,k,:))-sum_nodeGSDF(t,k))<=PL_max(k,1)];
    end
end
%% 求解
ops=sdpsettings('solver', 'cplex');
result=solvesdp(st,totalcost);
double(totalcost) 
subplot(1,2,1)
bar(value(p)','stack')%阶梯图
legend('Unit 1','Unit 2','Unit 3','Unit 4','Unit 5','Unit 6');	%在坐标轴上添加图例
subplot(1,2,2)
stairs(value(p)')
legend('Unit 1','Unit 2','Unit 3','Unit 4','Unit 5','Unit 6');	%在坐标轴上添加图例
xlswrite('机组组合问题求解结果',double(u),'机组各时段启停计划');
P=(sum(sum_PowerGSDF(:,:,:),3)-sum_nodeGSDF(:,:))';%各段支路的实时潮流
P_sp=zeros(numnodes,T);%各个节点的直流潮流功率
for i=1:numnodes
for k=1:branch_num
    m=netpara(k,2);%首端节点
    n=netpara(k,3);%末端节点
    if m==i
        P_sp(i,:)=P_sp(i,:)+P(k,:);
    end
    if n==i
        P_sp(i,:)=P_sp(i,:)-P(k,:);
    end
end
end
dot_theta=zeros(numnodes,T);
dot_theta=X*P_sp;       
xlswrite('机组组合问题求解结果',double(P),'支路各时段的直流潮流');
xlswrite('机组组合问题求解结果',double(P_sp),'节点各时段的潮流功率');
xlswrite('机组组合问题求解结果',double(dot_theta),'节点各时段的潮流相角');


set(0,'ShowHiddenHandles','On')
set(gcf,'menubar','figure')

  • 22
    点赞
  • 91
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 27
    评论
评论 27
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

扬辰鑫

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值