基于Jaya优化算法的电力系统最优潮流研究(Matlab代码实现)

💥💥💞💞欢迎来到本博客❤️❤️💥💥

****🏆博主优势:🌞🌞🌞博客内容尽量做到思维缜密,逻辑清晰,为了方便读者。

⛳️**座右铭:**行百里者,半于九十。

📋📋📋++本文目录如下:++🎁🎁🎁

目录

[💥1 概述](#💥1 概述)

[📚2 运行结果](#📚2 运行结果)

[🎉3 参考文献](#🎉3 参考文献)

[🌈4 Matlab代码实现](#🌈4 Matlab代码实现)


💥1 概述

电力系统最优潮流是指在满足电力系统各种约束条件的前提下,使得系统的总损耗最小的潮流分布状态。最优潮流问题是电力系统运行和规划中的重要问题之一,对于确保电力系统的安全、稳定和经济运行具有重要意义。

最优潮流问题可以用一个非线性优化问题来表示,目标函数是最小化系统的总损耗,约束条件包括节点功率平衡方程、节点电压幅值和相角限制、线路功率限制等。解决最优潮流问题需要使用数学方法和计算工具,常用的方法包括牛顿-拉夫森法、潮流迭代法、内点法等。

最优潮流问题的解决可以为电力系统运行和规划提供重要的参考依据。通过调整潮流分布,可以减少系统的总损耗,提高系统的运行效率和经济性。此外,最优潮流问题还可以应用于电力市场运营、电力交易和电力系统规划等领域,为电力系统的可持续发展提供支持。

基于Jaya优化算法的电力系统最优潮流研究是一种针对电力系统进行优化设计的方法。Jaya优化算法是一种基于自然界中的蝗虫聚群行为进行优化的算法,通过模拟蝗虫在自然界中的聚群行为,寻找最优解。该算法具有收敛速度快、精度高、易于实现等优点。

在电力系统最优潮流研究中,Jaya优化算法被用于寻找电力系统中最优的电压和功率分配方案。通过对电力系统中各个节点的电压和功率进行优化,可以实现电力系统的最优化运行,提高电力系统的效率和可靠性。同时,该方法还可以实现电力系统的负荷均衡,减少电力系统的能源损耗和污染,具有重要的应用价值。

📚 2 运行结果

主函数代码:

%+++++++++++++++++++ Data base of the power system ++++++++++++++++++++++++
% The following file contains information about the topology of the power
% system such as the bus and line matrix
data_39;
% original matrix and generation buses
bus_o=bus; line_o=line;
slack=find(bus(:,10)==1); % Slack bus
PV=find(bus(:,10)==2);   % Generation buses PV
Bgen=vertcat(slack,PV);     % Slack and PV buses
PQ=find(bus(:,10)==3);   % Load buses

% +++++++++++++++ Parameters of the optimization algorithm ++++++++++++++++
pop =  210;                                % Size of the population
n_itera = 35;                             % Number of iterations of the optimization algorithm
Vmin=0.95;                                % Minimum value of voltage for the generators
Vmax=1.05;                                % Maximum value of voltage for the generators
mini_tap = 0.95;                          % Minimum value of the TAP
maxi_tap = 1.05;                          % Maximum value of the TAP
Smin=-0.5;                                % Minimum Shunt value
Smax=0.5;                                 % Maximum Sunt value
pos_Shunt = find( bus(:,11) ~= 0);        % Positions of Shunts in bus matrix
pos_tap = find( line(:,6) ~= 0);          % Positions of TAPs in line matrix
tap_o = line(pos_tap,6);                  % Original values of TAPs
Shunt_o = bus(pos_Shunt,9);               % Original values of Shunts
n_tap = length(pos_tap);                  % number of TAPs
n_Shunt = length(pos_Shunt);              % number of Shunts
n_nodos = length(bus(:,1));               % number of buses of the power system

% ++++++++++++++++ First: Run power flow for the base case ++++++++++++++++
% Store V and theta of the base case
[V_o,Theta_o,~] = PowerFlowClassical(bus_o,line_o);
% +++++++++++++++++++Compute the active power lossess++++++++++++++++++++++
nbranch=length(line_o(:,1));
FromNode=line_o(:,1);
ToNode=line_o(:,2);
for k=1:nbranch
    a(k)=line_o(k,6);
    if a(k)==0 % in this case, we are analyzing lines
        Zpq(k)=line_o(k,3)+1i*line_o(k,4); % impedance of the transmission line
        Ypq(k)=Zpq(k)^-1; % admittance of the transmission linee
        gpq(k)=real(Ypq(k)); % conductance of the transmission line
        % Active power loss of the corresponding line
        Llpq(k)=gpq(k)*(V_o(FromNode(k))^2 +V_o(ToNode(k))^2 -2*V_o(FromNode(k))*V_o(ToNode(k))*cos(Theta_o(FromNode(k))-Theta_o(ToNode(k))));
    end
end
% Total active power lossess
Plosses=sum(Llpq);
% +++++++++++++++++++++++++++ Optimum power flow ++++++++++++++++++++++++++
% Start the population 
for k=1:n_tap % Start the TAP population
    x_tap(:,k) = mini_tap +(maxi_tap - mini_tap)*(0.1*floor((10*rand(pop,1))));
end 
for k=1:n_Shunt % Start the Shunt population
     x_shunt(:,k) = Smin +(Smax - Smin)*(0.1*floor((10*rand(pop,1))));
end
for k=1:length(Bgen) % Start the population of voltage from generators
    x_vg(:,k) = Vmin +(Vmax - Vmin)*(0.1*floor((10*rand(pop,1))));
end
% JAYA algorithm
for k=1:n_itera
    % with the new values of the TAPs, Shunts and VGs recompute V and Ybus
    % Modify line and bus matrix
    for p=1:pop
        for q=1:n_tap
            r=pos_tap(q);
            line(r,6)=x_tap(p,q); % modification of line matrix acording to the new TAP values
        end; clear r
        for qa=1:n_Shunt
            r=pos_Shunt(qa);
             bus(r,9)=x_shunt(p,qa); % modification of bus matrix according to the new Shunt values
        end; clear r
        for qb=1:length(Bgen)
            r=Bgen(qb);
            bus(r,2)=x_vg(p,qb); % modification of bus matrix according to the new VG values
        end
        % With the new line and bus matrix run power flow
        [V_n,Theta_n,~] = PowerFlowClassical(bus,line);
        % Objective function
        [F,~] = ObjectiveFunction(V_n,line_o,Bgen,Theta_n,nbranch,FromNode,ToNode,PQ);
        Ofun=F; Obfun(k,p)=F;
    end
    % Define the new values of the desition variables: VGs, TAPs and Shunts
    [x1,x2,x3] = UpdateDesitionVariables(Obfun(k,:),x_tap,x_shunt,x_vg);
    % In this section, correct the particles that are surpassing the
    % minimum/ maximum established values
    % TAP values
    xselect=round(100*x1); %discretize TAP values
    x1=xselect/100;
    x1a=x1;
    for p=1:n_tap
        for i=1:pop
            if x1(i,p)<mini_tap
                x1a(i,p)=mini_tap;
            end
            if x1(i,p)>maxi_tap
                x1a(i,p)=maxi_tap;
            end
        end
    end
    % Shunt elements
    x2a=x2;
    for p=1:n_Shunt
        for i=1:pop
            if x2(i,p)<Smin
                x2a(i,p)=Smin;
            end
            if x2(i,p)>Smax
                x2a(i,p)=Smax;
            end
        end
    end
    % Voltages from generators
    x3a=x3;
    for p=1:length(Bgen)
        for i=1:pop
            if x3(i,p)<Vmin
                x3a(i,p)=Vmin;
            end
            if x3(i,p)>Vmax
                x3a(i,p)=Vmax;
            end
        end
    end
    x_tap=x1a; x_shunt=x2a; x_vg=x3a;
    % With the corrected updated values, modify bus and line matrix
    for p=1:pop
        for q=1:n_tap
            r=pos_tap(q);
            line(r,6)=x_tap(p,q); % modification of line matrix acording to the new corrected TAP values
        end; clear r
        for qa=1:n_Shunt
            r=pos_Shunt(qa);
             bus(r,9)=x_shunt(p,qa); % modification of bus matrix according to the new corrected Shunt values
        end; clear r
        for qb=1:length(Bgen)
            r=Bgen(qb);
            bus(r,2)=x_vg(p,qb); % modification of bus matrix according to the new corrected VG values
        end
        % Run Newton Raphson 
        [V_n,Theta_n,~] = PowerFlowClassical(bus,line);
        % Objective function
        [Fnew,~] = ObjectiveFunction(V_n,line,Bgen,Theta_n,nbranch,FromNode,ToNode,PQ);
        Obfunnew(k,p)=Fnew;
    end
    % Store values of TAPS, SHUNTS AND VGS for every iteration
    XTAP(k,:,:)=x1a; XSHUNT(k,:,:)=x2a; XVG(k,:,:)=x3a;
if k>1
    for i=1:pop
        if(Obfunnew(k-1,i)<Obfunnew(k,i))
            x_tap(i,:)=XTAP(k-1,i,:); x_shunt(i,:)=XSHUNT(k-1,i,:); x_vg(i,:)=XVG(k-1,i,:);
            Obfunnew(k,i)=Obfunnew(k-1,i);
            % In case that we needed the values of the previos iterations,
            % we will have to change the storing matrix XTAP XSHUNT and XVG
            XTAP(k,i,:)=x_tap(i,:); XSHUNT(k,i,:)=x_shunt(i,:); XVG(k,i,:)=x_vg(i,:);
        end
    end
end
% best solution at each iteration
bsof(k)=min(Obfunnew(k,:));
% Find the values of TAPs, Shunts and VGs associated to the best solution
for i=1:pop
    if bsof(k)==Obfunnew(k,i)
        xitap(k,:)=x_tap(i,:); % TAP values associate to the best solution
        xishunt(k,:)=x_shunt(i,:); % Shunt values associate to the best solution
        xivg(k,:)=x_vg(i,:); % VG values associate to the best solution
    end
end
end
% ++++++++++++++++++++++++++++++++++Solution ++++++++++++++++++++++++++++++
% once the optimization algorithm has sttoped, run power flow with the
% solutions provided 
% First, we modify line and bus
for q=1:n_tap
    r=pos_tap(q);
    line(r,6)=xitap(end,q); % modification of line matrix acording to the new corrected TAP values
end; clear r
for qa=1:n_Shunt
    r=pos_Shunt(qa);
     bus(r,9)=xishunt(end,qa); % modification of bus matrix according to the new corrected Shunt values
end; clear r
for qb=1:length(Bgen)
    r=Bgen(qb);
    bus(r,2)=xivg(end,qb); % modification of bus matrix according to the new corrected VG values
end
[Vs,Thetas,~] = PowerFlowClassical(bus,line);
[Fobjective,Pls] = ObjectiveFunction(Vs,line,Bgen,Thetas,nbranch,FromNode,ToNode,PQ);
% ++++++++++++++++++++++++++++++ Print results ++++++++++++++++++++++++++++
disp('OPTIMIZACI覰 MEDIANTE ALGORITMO JAYA')
 disp(' ')
 disp(' ')
 disp('                  VOLTAGE                ANGLE ')
 disp('             -----------------     ----------------  ')
 disp('     BUS      Orig       JAYA     Orig        JAYA  ')
 disp(' ')
 display_1=[bus(:,1) V_o  Vs  Theta_o*(180/pi) Thetas*(180/pi)];
 disp(display_1)
figure (1)
plot(bsof,'r'); xlabel('Iterations'); ylabel('Function value')
figure (2)
title('Voltage profile')
for k=1:n_nodos
    Lim1(k)=0.95;
    Lim2(k)=1.05;
end
plot(V_o); hold on; plot(Vs); hold on; plot(Lim1,'--k'); hold on; plot(Lim2,'--k'); xlabel('# bus'); ylabel('Magnitude (pu)')
legend('Voltage base case','Voltage for the optimum solution')
figure (3)
title('Active power lossess')
y=[Plosses,Pls];
c=categorical({'Base case','Optimum solution'});
bar(c,y,'FaceColor',[0 .5 .5],'EdgeColor',[0 .9 .9],'LineWidth',1.5)
ylabel('Total active power lossess (pu)')
figure (4)
title('TAP values comparison')
plot(tap_o); hold on; plot(xitap(end,:)); xlabel('# Transformer'); ylabel('TAP value (pu)')
legend('Base case','Optimum solution')

%+++++++++++++++++++ Data base of the power system ++++++++++++++++++++++++

% The following file contains information about the topology of the power

% system such as the bus and line matrix

data_39;

% original matrix and generation buses

bus_o=bus; line_o=line;

slack=find(bus(:,10)==1); % Slack bus

PV=find(bus(:,10)==2); % Generation buses PV

Bgen=vertcat(slack,PV); % Slack and PV buses

PQ=find(bus(:,10)==3); % Load buses

% +++++++++++++++ Parameters of the optimization algorithm ++++++++++++++++

pop = 210; % Size of the population

n_itera = 35; % Number of iterations of the optimization algorithm

Vmin=0.95; % Minimum value of voltage for the generators

Vmax=1.05; % Maximum value of voltage for the generators

mini_tap = 0.95; % Minimum value of the TAP

maxi_tap = 1.05; % Maximum value of the TAP

Smin=-0.5; % Minimum Shunt value

Smax=0.5; % Maximum Sunt value

pos_Shunt = find( bus(:,11) ~= 0); % Positions of Shunts in bus matrix

pos_tap = find( line(:,6) ~= 0); % Positions of TAPs in line matrix

tap_o = line(pos_tap,6); % Original values of TAPs

Shunt_o = bus(pos_Shunt,9); % Original values of Shunts

n_tap = length(pos_tap); % number of TAPs

n_Shunt = length(pos_Shunt); % number of Shunts

n_nodos = length(bus(:,1)); % number of buses of the power system

% ++++++++++++++++ First: Run power flow for the base case ++++++++++++++++

% Store V and theta of the base case

[V_o,Theta_o,~] = PowerFlowClassical(bus_o,line_o);

% +++++++++++++++++++Compute the active power lossess++++++++++++++++++++++

nbranch=length(line_o(:,1));

FromNode=line_o(:,1);

ToNode=line_o(:,2);

for k=1:nbranch

a(k)=line_o(k,6);

if a(k)==0 % in this case, we are analyzing lines

Zpq(k)=line_o(k,3)+1i*line_o(k,4); % impedance of the transmission line

Ypq(k)=Zpq(k)^-1; % admittance of the transmission linee

gpq(k)=real(Ypq(k)); % conductance of the transmission line

% Active power loss of the corresponding line

Llpq(k)=gpq(k)*(V_o(FromNode(k))^2 +V_o(ToNode(k))^2 -2*V_o(FromNode(k))*V_o(ToNode(k))*cos(Theta_o(FromNode(k))-Theta_o(ToNode(k))));

end

end

% Total active power lossess

Plosses=sum(Llpq);

% +++++++++++++++++++++++++++ Optimum power flow ++++++++++++++++++++++++++

% Start the population

for k=1:n_tap % Start the TAP population

x_tap(:,k) = mini_tap +(maxi_tap - mini_tap)*(0.1*floor((10*rand(pop,1))));

end

for k=1:n_Shunt % Start the Shunt population

x_shunt(:,k) = Smin +(Smax - Smin)*(0.1*floor((10*rand(pop,1))));

end

for k=1:length(Bgen) % Start the population of voltage from generators

x_vg(:,k) = Vmin +(Vmax - Vmin)*(0.1*floor((10*rand(pop,1))));

end

% JAYA algorithm

for k=1:n_itera

% with the new values of the TAPs, Shunts and VGs recompute V and Ybus

% Modify line and bus matrix

for p=1:pop

for q=1:n_tap

r=pos_tap(q);

line(r,6)=x_tap(p,q); % modification of line matrix acording to the new TAP values

end; clear r

for qa=1:n_Shunt

r=pos_Shunt(qa);

bus(r,9)=x_shunt(p,qa); % modification of bus matrix according to the new Shunt values

end; clear r

for qb=1:length(Bgen)

r=Bgen(qb);

bus(r,2)=x_vg(p,qb); % modification of bus matrix according to the new VG values

end

% With the new line and bus matrix run power flow

[V_n,Theta_n,~] = PowerFlowClassical(bus,line);

% Objective function

[F,~] = ObjectiveFunction(V_n,line_o,Bgen,Theta_n,nbranch,FromNode,ToNode,PQ);

Ofun=F; Obfun(k,p)=F;

end

% Define the new values of the desition variables: VGs, TAPs and Shunts

[x1,x2,x3] = UpdateDesitionVariables(Obfun(k,:),x_tap,x_shunt,x_vg);

% In this section, correct the particles that are surpassing the

% minimum/ maximum established values

% TAP values

xselect=round(100*x1); %discretize TAP values

x1=xselect/100;

x1a=x1;

for p=1:n_tap

for i=1:pop

if x1(i,p)<mini_tap

x1a(i,p)=mini_tap;

end

if x1(i,p)>maxi_tap

x1a(i,p)=maxi_tap;

end

end

end

% Shunt elements

x2a=x2;

for p=1:n_Shunt

for i=1:pop

if x2(i,p)<Smin

x2a(i,p)=Smin;

end

if x2(i,p)>Smax

x2a(i,p)=Smax;

end

end

end

% Voltages from generators

x3a=x3;

for p=1:length(Bgen)

for i=1:pop

if x3(i,p)<Vmin

x3a(i,p)=Vmin;

end

if x3(i,p)>Vmax

x3a(i,p)=Vmax;

end

end

end

x_tap=x1a; x_shunt=x2a; x_vg=x3a;

% With the corrected updated values, modify bus and line matrix

for p=1:pop

for q=1:n_tap

r=pos_tap(q);

line(r,6)=x_tap(p,q); % modification of line matrix acording to the new corrected TAP values

end; clear r

for qa=1:n_Shunt

r=pos_Shunt(qa);

bus(r,9)=x_shunt(p,qa); % modification of bus matrix according to the new corrected Shunt values

end; clear r

for qb=1:length(Bgen)

r=Bgen(qb);

bus(r,2)=x_vg(p,qb); % modification of bus matrix according to the new corrected VG values

end

% Run Newton Raphson

[V_n,Theta_n,~] = PowerFlowClassical(bus,line);

% Objective function

[Fnew,~] = ObjectiveFunction(V_n,line,Bgen,Theta_n,nbranch,FromNode,ToNode,PQ);

Obfunnew(k,p)=Fnew;

end

% Store values of TAPS, SHUNTS AND VGS for every iteration

XTAP(k,:,:)=x1a; XSHUNT(k,:,:)=x2a; XVG(k,:,:)=x3a;

if k>1

for i=1:pop

if(Obfunnew(k-1,i)<Obfunnew(k,i))

x_tap(i,:)=XTAP(k-1,i,:); x_shunt(i,:)=XSHUNT(k-1,i,:); x_vg(i,:)=XVG(k-1,i,:);

Obfunnew(k,i)=Obfunnew(k-1,i);

% In case that we needed the values of the previos iterations,

% we will have to change the storing matrix XTAP XSHUNT and XVG

XTAP(k,i,:)=x_tap(i,:); XSHUNT(k,i,:)=x_shunt(i,:); XVG(k,i,:)=x_vg(i,:);

end

end

end

% best solution at each iteration

bsof(k)=min(Obfunnew(k,:));

% Find the values of TAPs, Shunts and VGs associated to the best solution

for i=1:pop

if bsof(k)==Obfunnew(k,i)

xitap(k,:)=x_tap(i,:); % TAP values associate to the best solution

xishunt(k,:)=x_shunt(i,:); % Shunt values associate to the best solution

xivg(k,:)=x_vg(i,:); % VG values associate to the best solution

end

end

end

% ++++++++++++++++++++++++++++++++++Solution ++++++++++++++++++++++++++++++

% once the optimization algorithm has sttoped, run power flow with the

% solutions provided

% First, we modify line and bus

for q=1:n_tap

r=pos_tap(q);

line(r,6)=xitap(end,q); % modification of line matrix acording to the new corrected TAP values

end; clear r

for qa=1:n_Shunt

r=pos_Shunt(qa);

bus(r,9)=xishunt(end,qa); % modification of bus matrix according to the new corrected Shunt values

end; clear r

for qb=1:length(Bgen)

r=Bgen(qb);

bus(r,2)=xivg(end,qb); % modification of bus matrix according to the new corrected VG values

end

[Vs,Thetas,~] = PowerFlowClassical(bus,line);

[Fobjective,Pls] = ObjectiveFunction(Vs,line,Bgen,Thetas,nbranch,FromNode,ToNode,PQ);

% ++++++++++++++++++++++++++++++ Print results ++++++++++++++++++++++++++++

disp('OPTIMIZACI覰 MEDIANTE ALGORITMO JAYA')

disp(' ')

disp(' ')

disp(' VOLTAGE ANGLE ')

disp(' ----------------- ---------------- ')

disp(' BUS Orig JAYA Orig JAYA ')

disp(' ')

display_1=[bus(:,1) V_o Vs Theta_o*(180/pi) Thetas*(180/pi)];

disp(display_1)

figure (1)

plot(bsof,'r'); xlabel('Iterations'); ylabel('Function value')

figure (2)

title('Voltage profile')

for k=1:n_nodos

Lim1(k)=0.95;

Lim2(k)=1.05;

end

plot(V_o); hold on; plot(Vs); hold on; plot(Lim1,'--k'); hold on; plot(Lim2,'--k'); xlabel('# bus'); ylabel('Magnitude (pu)')

legend('Voltage base case','Voltage for the optimum solution')

figure (3)

title('Active power lossess')

y=[Plosses,Pls];

c=categorical({'Base case','Optimum solution'});

bar(c,y,'FaceColor',[0 .5 .5],'EdgeColor',[0 .9 .9],'LineWidth',1.5)

ylabel('Total active power lossess (pu)')

figure (4)

title('TAP values comparison')

plot(tap_o); hold on; plot(xitap(end,:)); xlabel('# Transformer'); ylabel('TAP value (pu)')

legend('Base case','Optimum solution')

🎉3 参考文献

文章中一些内容引自网络,会注明出处或引用为参考文献,难免有未尽之处,如有不妥,请随时联系删除。

[1]李璇.基于遗传算法的电力系统最优潮流问题研究[D].华中科技大学,2007.

[2]尤金.基于Jaya算法的DG优化配置研究[D].天津大学,2018.

[3]蒋承刚,熊国江,帅茂杭.基于DE-Jaya混合优化算法的电力系统经济调度方法[J].传感器与微系统, 2023.

🌈4 Matlab代码实现

相关推荐
儿创社ErChaungClub11 分钟前
解锁编程新境界:GitHub Copilot 让效率翻倍
人工智能·算法
前端西瓜哥15 分钟前
贝塞尔曲线算法:求贝塞尔曲线和直线的交点
前端·算法
小灰灰爱代码22 分钟前
C++——求3个数中最大的数(分别考虑整数、双精度数、长整数的情况),用函数模板来实现。
开发语言·c++·算法
南加第一划水26 分钟前
Leetcode 每日一题:Evaluate Division
算法·leetcode·职场和发展
逝去的秋风1 小时前
【代码随想录训练营第42期 Day61打卡 - 图论Part11 - Floyd 算法与A * 算法
算法·图论·floyd 算法·a -star算法
zero_one_Machel1 小时前
leetcode73矩阵置零
算法·leetcode·矩阵
青椒大仙KI112 小时前
24/9/19 算法笔记 kaggle BankChurn数据分类
笔记·算法·分类
^^为欢几何^^2 小时前
lodash中_.difference如何过滤数组
javascript·数据结构·算法
豆浩宇2 小时前
Halcon OCR检测 免训练版
c++·人工智能·opencv·算法·计算机视觉·ocr
浅念同学2 小时前
算法.图论-并查集上
java·算法·图论