一、问题描述
改进发电调度方式又是电力行业节能减排的主要环节。
改进发电调度方式需要在满足负荷需求和功率限制的条件下,使煤耗成本和购电成本尽可能降低,为解决此问题建立双目标优化模型。
二、双目标优化模型
三、模型求解
四、算例分析
以上两张表的来源是
李正哲,马燕峰,娄雅融,韩金铜.基于电力节能减排双目标调度优化模型及方法的研究[J].电力科学与工程,2012,28(06):44-50.
显然可以实现最初的双目标优化目的。
五、matlab实现
clc
clear
close all
F = zeros(2);
H=zeros(120);
%以购电成本最低为目标
for i = 1:120
if i>0 && i<25
H(i,i) = 0.00212;
end
if i>24 && i<49
H(i,i) = 0.00148;
end
if i>48 && i<73
H(i,i) = 0.00289;
end
if i>72 && i<97
H(i,i) = 0.00127;
end
if i>96 && i<121
H(i,i) = 0.00261;
end
end
f=zeros(120,1);
for i = 1:120
if i>0 && i<25
f(i) = 1.8015;
end
if i>24 && i<49
f(i) = 1.213;
end
if i>48 && i<73
f(i) = 1.2643;
end
if i>72 && i<97
f(i) = 1.1954;
end
if i>96 && i<121
f(i) = 1.5354;
end
end
Aeq = zeros(24,120);
for i = 1:24
for j = 0:4
Aeq(i,i+j*24) = 1;
end
end
beq = [1873.01;2012.01;1852.12;1880.80;1810.95;1786.95;2231.75;1898.98;2011.98;1849.90;2366.64;2055.99;2298.72;2272.76;2302.72;2195.77;2260.72;2303.72;2190.94;2723.50;2699.50;2693.79;2446.66;2576.55];
LB = zeros(1,120);
for i = 1:120
if i>0 && i<25
LB(i) = 310;
end
if i>24 && i<49
LB(i) = 300;
end
if i>48 && i<73
LB(i) = 350;
end
if i>72 && i<97
LB(i) = 325;
end
if i>96 && i<121
LB(i) = 250;
end
end
UB = zeros(1,120);
for i = 1:120
if i>0 && i<25
UB(i) = 570;
end
if i>24 && i<49
UB(i) = 610;
end
if i>48 && i<73
UB(i) = 700;
end
if i>72 && i<97
UB(i) = 660;
end
if i>96 && i<121
UB(i) = 425;
end
end
[x,fval,exitflag]=quadprog(H,f,[],[],Aeq,beq,LB,UB);
plot(x(49:72))
xlabel('时间/h')
ylabel('负荷/MW')
ylim([330 720])
title('购电成本目标的机组3日有功负荷曲线')
%f11为以购电成本为目标时的购电成本
F(1,1) = fval;
v=zeros(1,120);
for i = 1:120
if i>0 && i<25
v(i) = 0.15;
end
if i>24 && i<49
v(i) = 0.11;
end
if i>48 && i<73
v(i) = 0.068;
end
if i>72 && i<97
v(i) = 0.20;
end
if i>96 && i<121
v(i) = 0.088;
end
end
%f12为以购电成本为目标时的煤耗成本
F(1,2) = v*x;
%以煤耗成本为目标
[x,fval,exitflag]=linprog(v,[],[],Aeq,beq,LB,UB);
figure
plot(x(49:72))
xlabel('时间/h')
ylabel('负荷/MW')
ylim([330 720])
title('煤耗成本目标的机组3日有功负荷曲线')
%f22为以煤耗成本为目标时的煤耗成本
F(2,2) = fval;
%f21为以煤耗成本为目标时的购电成本
F(2,1) = x'*H*x+f'*x;
%选取购电成本为基本目标
N = 30;
epsilon = zeros(1,N+1);
for i = 0:N
epsilon(i+1) = F(1,2)-(F(1,2)-F(2,2))/N*i;
end
%P为帕累托最优解集,PG记录不同解集下的电机出力情况
P = zeros(2,31);
PG = zeros(120,31);
for i = 1:31
[x,fval,exitflag]=quadprog(H,f,v,epsilon(i),Aeq,beq,LB,UB);
PG(:,i) = x;
P(1,i) = fval;
P(2,i) = epsilon(i);
end
figure
scatter(P(1,:),P(2,:))
title('帕累托最优解集')
ylim([5900 6900])
%R1为评价矩阵
R1 = P;
%R为规格化后的评价矩阵
R = zeros(2,31);
for i = 1:2
for j = 1:31
R(i,j) = (max(R1(i,:)-R1(i,j)))/(max(R1(i,:)-min(R1(i,:))));
end
end
%计算熵权alpha
e = zeros(2,1);
alpha = zeros(2,1);
for i = 1:2
for j = 1:N
e(i,1) = -(sum(R(i,j)/sum(R(i,:))*log(R(i,j)/sum(R(i,:)))))/(log(N));
end
end
for i = 1:2
alpha(i,1) = (1-e(i,1))/(sum([1;1]-e));
end
%主观权值lambda
lambda = [0.5;0.5];
%修正权系数omega
omega = zeros(2,1);
for i = 1:2
omega(i) = (alpha(i)*lambda(i))/(sum(alpha.*lambda));
end
%建立加权的规格化评级矩阵Rj
Rj = zeros(2,31);
for i = 1:2
for j = 1:N
Rj(i,j) = omega(i)*R(i,j);
end
end
%确定双基点
Fz = [max(Rj(1,:)),max(Rj(2,:))];
Ff = [min(Rj(1,:)),min(Rj(2,:))];
%计算帕累托解和理想点之间的距离
Dz = zeros(1,31);
Df = zeros(1,31);
for i = 1:31
Dz(i) = ((Rj(1,i)-Fz(1))*(Rj(1,i)-Fz(1))+(Rj(2,i)-Fz(2))*(Rj(2,i)-Fz(2)))^(0.5);
Df(i) = ((Rj(1,i)-Ff(1))*(Rj(1,i)-Ff(1))+(Rj(2,i)-Ff(2))*(Rj(2,i)-Ff(2)))^(0.5);
end
%计算相对贴近度Tj
Tj = zeros(1,31);
for i = 1:31
Tj(i) = Df(i)/(Dz(i)+Df(i));
end
pos = find(Tj == max(Tj));
val = P(:,pos);%val存放最优解
PGz = PG(:,pos);%PGz存放最优解时不同机组在不同时刻的出力情况
figure
plot(PGz(49:72))
xlabel('时间/h')
ylabel('负荷/MW')
ylim([330 720])
title('双目标优化的机组3日有功负荷曲线')插入代码片
后记
我不熟悉在csdn打数学公式,为了方便就直接都放图片了。
在论文基于电力节能减排双目标调度优化模型及方法的研究中所使用的模糊控制我也用代码实现了,虽然确实达到了优化的目的,但运行结束后lambda的值是0,我不清楚是哪里出了问题还是运行结果确实是这样。而且文中提到的对二次约束进行逐步线性化我也不明白是怎么实现的,所以直接用了matlab的fmincon函数进行求解。代码我也放在这里了,有了解的朋友可以私信或者发在评论区,谢谢。
论文中在以购电成本为单目标进行求解的时候得到的结果是115391,但我用matlab的函数quadprog进行求解后只有93828,差距较大,其他数据的差距都比较小,这里我也不清楚是不是有什么问题。
clc
clear
close all
%c01和c02是我直接用了论文中最后得到的数据
c01 = 115391;
c02 = 5899.5;
%线性不等式约束
A=ones(1,121);
for i = 1:120
if i>0 && i<25
A(i) = 0.15;
end
if i>24 && i<49
A(i) = 0.11;
end
if i>48 && i<73
A(i) = 0.068;
end
if i>72 && i<97
A(i) = 0.20;
end
if i>96 && i<121
A(i) = 0.088;
end
end
A(121) = 0.1*c02;
b = 1.1*c02;
%线性等式约束
Aeq = zeros(24,121);
for i = 1:24
for j = 0:4
Aeq(i,i+j*24) = 1;
end
end
beq = [1873.01;2012.01;1852.12;1880.80;1810.95;1786.95;2231.75;1898.98;2011.98;1849.90;2366.64;2055.99;2298.72;2272.76;2302.72;2195.77;2260.72;2303.72;2190.94;2723.50;2699.50;2693.79;2446.66;2576.55];
%上下界
LB = zeros(1,121);
for i = 1:120
if i>0 && i<25
LB(i) = 310;
end
if i>24 && i<49
LB(i) = 300;
end
if i>48 && i<73
LB(i) = 350;
end
if i>72 && i<97
LB(i) = 325;
end
if i>96 && i<121
LB(i) = 250;
end
end
LB(121) = 0;
UB = zeros(1,121);
for i = 1:120
if i>0 && i<25
UB(i) = 570;
end
if i>24 && i<49
UB(i) = 610;
end
if i>48 && i<73
UB(i) = 700;
end
if i>72 && i<97
UB(i) = 660;
end
if i>96 && i<121
UB(i) = 425;
end
end
UB(121) = 1;
[x,fval]=fmincon('fun1',zeros(121,1),A,b,Aeq,beq,LB,UB,'fun2')
H=zeros(121);
for i = 1:120
if i>0 && i<25
H(i,i) = 0.00212;
end
if i>24 && i<49
H(i,i) = 0.00148;
end
if i>48 && i<73
H(i,i) = 0.00289;
end
if i>72 && i<97
H(i,i) = 0.00127;
end
if i>96 && i<121
H(i,i) = 0.00261;
end
end
f=zeros(121,1);
for i = 1:120
if i>0 && i<25
f(i) = 1.8015;
end
if i>24 && i<49
f(i) = 1.213;
end
if i>48 && i<73
f(i) = 1.2643;
end
if i>72 && i<97
f(i) = 1.1954;
end
if i>96 && i<121
f(i) = 1.5354;
end
end
x'*H*x+f'*x
v=zeros(1,121);
for i = 1:120
if i>0 && i<25
v(i) = 0.15;
end
if i>24 && i<49
v(i) = 0.11;
end
if i>48 && i<73
v(i) = 0.068;
end
if i>72 && i<97
v(i) = 0.20;
end
if i>96 && i<121
v(i) = 0.088;
end
end
v*x
plot(x(49:72))
fun1函数
function f=fun1(x)
f=-x(121);
end
fun2函数
function [c,ceq] =fun2(x)
c01 = 93828;
%c01 = 115391;
H=zeros(121);
for i = 1:120
if i>0 && i<25
H(i,i) = 0.00212;
end
if i>24 && i<49
H(i,i) = 0.00148;
end
if i>48 && i<73
H(i,i) = 0.00289;
end
if i>72 && i<97
H(i,i) = 0.00127;
end
if i>96 && i<121
H(i,i) = 0.00261;
end
end
f=zeros(121,1);
for i = 1:120
if i>0 && i<25
f(i) = 1.8015;
end
if i>24 && i<49
f(i) = 1.213;
end
if i>48 && i<73
f(i) = 1.2643;
end
if i>72 && i<97
f(i) = 1.1954;
end
if i>96 && i<121
f(i) = 1.5354;
end
end
c = x'*H*x+f'*x+11539.1*x(121)-1.1*c01;
ceq = 0*x;
end