使用粒子群PSO算法实现MPPT-M语言仿真

article/2025/10/22 21:16:56

在Octave以及Matlab上,仿真了使用粒子群PSO实现MPPT的过程。粒子数为4。太阳能电池为4个串联。

2019年4月24日更新matlab代码。

目录

1.1 先绘制出PV曲线(Octave)

1.2 PSO算法(Octave)

2.1 绘制PV曲线(Matlab)

2.2 PSO.m(Matlab)

3 仿真结果


 


本文主要是代码。

我的软件环境是winxp(32bit),Octave4.4.0。Matlab2010b。

Octave和Matlab的函数有些差异。要在Octave上运行,请使用1.1和1.2的代码。要在Matlab上运行 ,请使用2.1和2.2的代码。

1.1 先绘制出PV曲线(Octave)

光伏电阻串联的方法如下图。每个光伏电池都有各自的反向并联二极管。此处二极管的作用是保护光伏电池避免经过大电流,造成过度发热。

代码中仿真得到了,由4个光伏电池串联成的光伏电池组特性曲线,如下图。

红色线代表理想情况下的曲线。而蓝色线是串联起来的光伏电池组的PV特性曲线。没达到理想曲线的原因是,每个光伏电池都受到不同程度的遮挡。以下是代码。

新建一个文件:mySolarPannel_4inseries.m。把以下代码复制进去:

clear
clc%-----------------------------------------------
%-----------------------------------------------
%pannel in series
%first pannel
S_1=1000;
Tair_1=25;Sref=1000;  %1000W/m^2
Tref=25;    %25degree celciusUoc=44.2;
Um=35.4;
Isc=5.29;
Im=4.95;a=0.00255;
b=0.55;
c=0.00285;T_1 = Tair_1 + 0.028*S_1;
T_delta_1 = T_1 - Tref;
S_delta_1 = S_1/Sref - 1;Isc_comp_1 = Isc*S_1/Sref*(1+a*T_delta_1);
Uoc_comp_1 = Uoc*(1-c*T_delta_1)*log(e+b*S_delta_1);
Im_comp_1  = Im*S_1/Sref*(1+a*T_delta_1);
Um_comp_1  = Um*(1-c*T_delta_1)*log(e+b*S_delta_1);C2_1=(Um_comp_1/Uoc_comp_1-1)*(log(1-Im_comp_1/Isc_comp_1))^(-1);
C1_1=(1-Im_comp_1/Isc_comp_1)*exp(-Um_comp_1/(C2_1*Uoc_comp_1));U_1=0:0.01:Uoc_comp_1;
Iph_1=Isc_comp_1*(1-C1_1*(exp(U_1/(C2_1*Uoc_comp_1))-1));%-----------------------------------------------
%second pannel
S_2=800;
Tair_2=25;Sref=1000;  %1000W/m^2
Tref=25;    %25degree celciusUoc=44.2;
Um=35.4;
Isc=5.29;
Im=4.95;a=0.00255;
b=0.55;
c=0.00285;T_2 = Tair_2 + 0.028*S_2;
T_delta_2 = T_2 - Tref;
S_delta_2 = S_2/Sref - 1;Isc_comp_2 = Isc*S_2/Sref*(1+a*T_delta_2);
Uoc_comp_2 = Uoc*(1-c*T_delta_2)*log(e+b*S_delta_2);
Im_comp_2  = Im*S_2/Sref*(1+a*T_delta_2);
Um_comp_2  = Um*(1-c*T_delta_2)*log(e+b*S_delta_2);C2_2=(Um_comp_2/Uoc_comp_2-1)*(log(1-Im_comp_2/Isc_comp_2))^(-1);
C1_2=(1-Im_comp_2/Isc_comp_2)*exp(-Um_comp_2/(C2_2*Uoc_comp_2));U_2=0:0.01:Uoc_comp_2;
Iph_2=Isc_comp_2*(1-C1_2*(exp(U_2/(C2_2*Uoc_comp_2))-1));%-----------------------------------------------
%third pannel
S_3=600;
Tair_3=25;Sref=1000;  %1000W/m^2
Tref=25;    %25degree celciusUoc=44.2;
Um=35.4;
Isc=5.29;
Im=4.95;a=0.00255;
b=0.55;
c=0.00285;T_3 = Tair_3 + 0.028*S_3;
T_delta_3 = T_3 - Tref;
S_delta_3 = S_3/Sref - 1;Isc_comp_3 = Isc*S_3/Sref*(1+a*T_delta_3);
Uoc_comp_3 = Uoc*(1-c*T_delta_3)*log(e+b*S_delta_3);
Im_comp_3  = Im*S_3/Sref*(1+a*T_delta_3);
Um_comp_3  = Um*(1-c*T_delta_3)*log(e+b*S_delta_3);C2_3=(Um_comp_3/Uoc_comp_3-1)*(log(1-Im_comp_3/Isc_comp_3))^(-1);
C1_3=(1-Im_comp_3/Isc_comp_3)*exp(-Um_comp_3/(C2_3*Uoc_comp_3));U_3=0:0.01:Uoc_comp_3;
Iph_3=Isc_comp_3*(1-C1_3*(exp(U_3/(C2_3*Uoc_comp_3))-1));%-----------------------------------------------
%forth pannel
S_4=400;
Tair_4=25;Sref=1000;  %1000W/m^2
Tref=25;    %25degree celciusUoc=44.2;
Um=35.4;
Isc=5.29;
Im=4.95;a=0.00255;
b=0.55;
c=0.00285;T_4 = Tair_4 + 0.028*S_4;
T_delta_4 = T_4 - Tref;
S_delta_4 = S_4/Sref - 1;Isc_comp_4 = Isc*S_4/Sref*(1+a*T_delta_4);
Uoc_comp_4 = Uoc*(1-c*T_delta_4)*log(e+b*S_delta_4);
Im_comp_4  = Im*S_4/Sref*(1+a*T_delta_4);
Um_comp_4  = Um*(1-c*T_delta_4)*log(e+b*S_delta_4);C2_4=(Um_comp_4/Uoc_comp_4-1)*(log(1-Im_comp_4/Isc_comp_4))^(-1);
C1_4=(1-Im_comp_4/Isc_comp_4)*exp(-Um_comp_4/(C2_4*Uoc_comp_4));U_4=0:0.01:Uoc_comp_4;
Iph_4=Isc_comp_4*(1-C1_4*(exp(U_4/(C2_4*Uoc_comp_4))-1));plot(U_1,Iph_1)
plot(U_2,Iph_2)
plot(U_3,Iph_3)
plot(U_4,Iph_4)
%-----------------------------------------------
% 4 in series
% U=C2*Uoc*log((Isc-I)/(C1*Isc)+1)
%Iph_1 > Iph_2 > Iph_3U_s = 0:0.01:Uoc_comp_1*4;
Iph_s=Isc_comp_1*(1-C1_1*(exp(U_s/(C2_1*Uoc_comp_1*4))-1));
plot(U_s,Iph_s,'k')U_ss = zeros(1,size(U_1)(2)+size(U_2)(2)+size(U_3)(2)+size(U_4)(2));
Iph_ss = U_ss;
%for i = 1 : size(U_1)(2)
%    U_ss(i) = U_1(i);
%    Iph_ss(i) = Iph_1(i);
%endfor i = 1 : size(U_1)(2)if Iph_1(i)>=Iph_2(1)U_ss(i) = U_1(i);Iph_ss(i) = Iph_1(i);step1 = i;elsebreak;end
end
for i = 1 : size(U_2)(2)if Iph_2(i)>Iph_3(1)U_ss(step1+i) = U_2(i) + U_ss(step1);Iph_ss(step1+i) = Iph_2(i);step2 = step1+i;elsebreak;end
end
for i = 1 : size(U_3)(2)if Iph_3(i)>Iph_4(1)U_ss(step2+i) = U_3(i) + U_ss(step2);Iph_ss(step2+i) = Iph_3(i);step3 = step2+i;elsebreak;end
end
for i = 1 : size(U_4)(2)U_ss(step3+i) = U_ss(step3) + U_4(i);Iph_ss(step3+i) = Iph_4(i);
end%plot(U_1,Iph_1)               I-U
%plot(U_2,Iph_2)
%plot(U_ss,Iph_ss,'+')
%plot(U_ss,Iph_ss,'+')figure(1)
plot(U_ss,Iph_ss,'+')
xlabel('U/V')
ylabel('I/A')
title('U-I')
figure(2)
P_ss = U_ss .* Iph_ss;
plot(U_ss,P_ss)
xlabel('U/V')
ylabel('P/W')
title('U-W')
hold on
P_1 = U_1*4 .* Iph_1;
plot(U_1*4,P_1)

执行完以后,会得到电压电流特性曲线见figure(1)和电压功率特性曲线见figure(2),还有好多参数在工作区内。

 

1.2 PSO算法(Octave)

算法的作用是,在PV曲线中均匀布防4只个体。4只个体会共享数据,并能引导群体往最优值靠近。因此并不会陷入局部最优,可以找到整体最优解。

新建一个文件:PSO.m。把以下内容复制进去:(20190414更新了代码。我是电气工程背景的,编的代码没有那些开源代码那么清晰请多多见谅。)


gbest = 0;
# initialize
currentN = 1;
maxN = 100;
#2. 
N=4;
Uoc_module = Uoc_comp_4;
Uoc_array = Uoc_comp_4 * N;
v_i = 0.25/(N-1)*Uoc_module;
x_max = 0.95 * Uoc_array;
v_max = Uoc_module;
i=1;
Vo_1 = 0.7* (i-1)*Uoc_module;    #i<N
i=2;
Vo_2 = 0.7* (i-1)*Uoc_module;    #i<N
i=3;
Vo_3 = 0.7* (i-1)*Uoc_module;    #i<N
i=4;
Vo_4 = 0.7* Uoc_array;          #i=N;
Uoc_array = Uoc * N;
v_i = 0.25/(N-1)*Uoc_module;
x_max = 0.95 * Uoc_array;
v_max = Uoc_module;
P_1_max = 0;
P_2_max = 0;
P_3_max = 0;
P_4_max = 0;
Power_1_max = 0;
Power_2_max = 0;
Power_3_max = 0;
Power_4_max = 0;
f_g = 0;
f_g_voltage =0;
c1_begin = 2.7;
c1_end = 1.2;
c2_begin = 0.5;
c2_end = 2.2;
v_1 = 0.25/(N-1)*Uoc_module;
v_2 = 0.25/(N-1)*Uoc_module;
v_3 = 0.25/(N-1)*Uoc_module;
v_4 = 0.25/(N-1)*Uoc_module;#----------------------------------------------------------------------
#Power_1 = GetResult_U_to_P(Vo_1);
if  round(Vo_1*100)==0Power_1 = P_ss(1);
elsePower_1=P_ss(round(Vo_1*100));    
end#Power_2 = GetResult_U_to_P(Vo_2);
if  round(Vo_2*100)==0Power_2 = P_ss(1);
elsePower_2=P_ss(round(Vo_2*100));    
end
#Power_3 = GetResult_U_to_P(Vo_3);
if  round(Vo_3*100)==0Power_3 = P_ss(1);
elsePower_3=P_ss(round(Vo_3*100));    
end
#Power_4 = GetResult_U_to_P(Vo_4);
if  round(Vo_4*100)==0Power_4 = P_ss(1);
elsePower_4=P_ss(round(Vo_4*100));    
end
Power_N = [Power_1,Power_2,Power_3,Power_4]
Vo_N = [Vo_1, Vo_2, Vo_3, Vo_4];
disp(currentN)
disp(Vo_N);
disp(Power_N);for currentN = 1 : maxN-1r1 = rand();r2 = rand();c1 = c1_begin + (c1_end - c1_begin)*(1-acos(-2*currentN/maxN+1)/pi);c2 = c2_begin + (c2_end - c2_begin)*(1-acos(-2*currentN/maxN+1)/pi);#f_avg = sum(f_i)/N;   #paticle power average#f_avg = (P_1+ P_2 + P_3 + P_4)/4;f_avg = sum(Power_N)/N;if f_g < max(Power_N)f_g = max(Power_N);for j=1:Nif Power_N(j) == max(Power_N)f_g_voltage = Vo_N(j);endendendphi = abs(f_g-f_avg);   #f_g: the optimized onef_1 = Power_1;w_1=abs((f_1-f_avg)/phi);f_2 = Power_2;w_2=abs((f_2-f_avg)/phi);f_3 = Power_3;w_3=abs((f_3-f_avg)/phi);f_4 = Power_4;w_4=abs((f_4-f_avg)/phi);w_N = [w_1, w_2, w_3, w_4];if Power_1_max < Power_1P_1_max = Vo_1;Power_1_max = Power_1;endif Power_2_max < Power_2P_2_max = Vo_2;Power_2_max = Power_2;endif Power_3_max < Power_3P_3_max = Vo_3;Power_3_max = Power_3;endif Power_4_max < Power_4P_4_max = Vo_4;Power_4_max = Power_4;endP_N_max = [P_1_max, P_2_max, P_3_max, P_4_max];Power_N_max = [Power_1_max, Power_2_max, Power_3_max, Power_4_max];v_1_next = w_1 * v_1 + c1*r1*(P_1_max - Vo_1) + c2*r2*(f_g_voltage - Vo_1);v_2_next = w_2 * v_2 + c1*r1*(P_2_max - Vo_2) + c2*r2*(f_g_voltage - Vo_2);v_3_next = w_3 * v_3 + c1*r1*(P_3_max - Vo_3) + c2*r2*(f_g_voltage - Vo_3);v_4_next = w_4 * v_4 + c1*r1*(P_4_max - Vo_4) + c2*r2*(f_g_voltage - Vo_4);if v_1_next > Uoc_modulev_1_next = Uoc_module;endif v_2_next > Uoc_modulev_2_next = Uoc_module;endif v_3_next > Uoc_modulev_3_next = Uoc_module;endif v_4_next > Uoc_modulev_4_next = Uoc_module;endv_N_next = [v_1_next, v_2_next, v_3_next, v_4_next];Vo_1 = Vo_1 + v_1_next;Vo_2 = Vo_2 + v_2_next;Vo_3 = Vo_3 + v_3_next;Vo_4 = Vo_4 + v_4_next;if Vo_1 < 0Vo_1 = 0;endif Vo_2 < 0Vo_2 = 0;endif Vo_3 < 0Vo_3 = 0;endif Vo_4 < 0Vo_4 = 0;endif Vo_1 > 0.91*Uoc_arrayVo_1 = 0.91*Uoc_array;endif Vo_2 > 0.91*Uoc_arrayVo_2 = 0.91*Uoc_array;endif Vo_3 > 0.91*Uoc_arrayVo_3 = 0.91*Uoc_array;endif Vo_4 > 0.91*Uoc_arrayVo_4 = 0.91*Uoc_array;end  #Power_1 = GetResult_U_to_P(Vo_1);if  round(Vo_1*100)==0Power_1 = P_ss(1);elsePower_1=P_ss(round(Vo_1*100));    end#Power_2 = GetResult_U_to_P(Vo_2);if  round(Vo_2*100)==0Power_2 = P_ss(1);elsePower_2=P_ss(round(Vo_2*100));    end#Power_3 = GetResult_U_to_P(Vo_3);if  round(Vo_3*100)==0Power_3 = P_ss(1);elsePower_3=P_ss(round(Vo_3*100));    end#Power_4 = GetResult_U_to_P(Vo_4);if  round(Vo_4*100)==0Power_4 = P_ss(1);elsePower_4=P_ss(round(Vo_4*100));    endPower_N = [Power_1,Power_2,Power_3,Power_4]Vo_N = [Vo_1, Vo_2, Vo_3, Vo_4];disp(currentN)disp('P_N_max: individual output voltage of maximum power')disp(P_N_max);disp('Power_N_max: individual maximum power output')disp(Power_N_max)disp('f_g: global max')disp(f_g)disp('Vo_N: output voltage')disp(Vo_N);disp('power_N: output power')disp(Power_N);#disp('v_N_next')#disp(v_N_next)v_1 = v_1_next;v_2 = v_2_next;v_3 = v_3_next;v_4 = v_4_next;v_N = [v_1, v_2, v_3, v_4];differ = (abs(Vo_1-sum( Vo_N)/N) + abs(Vo_2-sum( Vo_N)/N) + abs(Vo_2-sum( Vo_N)/N) + abs(Vo_4-sum( Vo_N)/N))if gbest ==0gbest = f_g;elsegbest = [gbest, f_g];endiffigure(2)clfplot(U_ss,P_ss)xlabel('U/V')ylabel('P/W')title('U-W')hold onplot(Vo_N, Power_N, 'k+')if differ< (0.1*Uoc_array)break;endend
#v_i_next = w*v_i_k + c1*r1*(P_max - V_i_output) + c2*r2*(G_max - V_i_output);
#plot(f_g_voltage, f_g, 'k+')
#figure(2)
#hold on
#plot(v_N, Power_N, 'k+')

2.1 绘制PV曲线(Matlab)

新建一个文件:mySolarPannel_4inseries.m。将以下代码复制进去。

clear
clc%-----------------------------------------------
%-----------------------------------------------
%pannel in series
%first pannel
S_1=1000;
Tair_1=25;Sref=1000;  %1000W/m^2
Tref=25;    %25degree celciusUoc=44.2;
Um=35.4;
Isc=5.29;
Im=4.95;a=0.00255;
b=0.55;
c=0.00285;T_1 = Tair_1 + 0.028*S_1;
T_delta_1 = T_1 - Tref;
S_delta_1 = S_1/Sref - 1;Isc_comp_1 = Isc*S_1/Sref*(1+a*T_delta_1);
Uoc_comp_1 = Uoc*(1-c*T_delta_1)*log(exp(1)+b*S_delta_1);
Im_comp_1  = Im*S_1/Sref*(1+a*T_delta_1);
Um_comp_1  = Um*(1-c*T_delta_1)*log(exp(1)+b*S_delta_1);C2_1=(Um_comp_1/Uoc_comp_1-1)*(log(1-Im_comp_1/Isc_comp_1))^(-1);
C1_1=(1-Im_comp_1/Isc_comp_1)*exp(-Um_comp_1/(C2_1*Uoc_comp_1));U_1=0:0.01:Uoc_comp_1;
Iph_1=Isc_comp_1*(1-C1_1*(exp(U_1/(C2_1*Uoc_comp_1))-1));%-----------------------------------------------
%second pannel
S_2=800;
Tair_2=25;Sref=1000;  %1000W/m^2
Tref=25;    %25degree celciusUoc=44.2;
Um=35.4;
Isc=5.29;
Im=4.95;a=0.00255;
b=0.55;
c=0.00285;T_2 = Tair_2 + 0.028*S_2;
T_delta_2 = T_2 - Tref;
S_delta_2 = S_2/Sref - 1;Isc_comp_2 = Isc*S_2/Sref*(1+a*T_delta_2);
Uoc_comp_2 = Uoc*(1-c*T_delta_2)*log(exp(1)+b*S_delta_2);
Im_comp_2  = Im*S_2/Sref*(1+a*T_delta_2);
Um_comp_2  = Um*(1-c*T_delta_2)*log(exp(1)+b*S_delta_2);C2_2=(Um_comp_2/Uoc_comp_2-1)*(log(1-Im_comp_2/Isc_comp_2))^(-1);
C1_2=(1-Im_comp_2/Isc_comp_2)*exp(-Um_comp_2/(C2_2*Uoc_comp_2));U_2=0:0.01:Uoc_comp_2;
Iph_2=Isc_comp_2*(1-C1_2*(exp(U_2/(C2_2*Uoc_comp_2))-1));%-----------------------------------------------
%third pannel
S_3=600;
Tair_3=25;Sref=1000;  %1000W/m^2
Tref=25;    %25degree celciusUoc=44.2;
Um=35.4;
Isc=5.29;
Im=4.95;a=0.00255;
b=0.55;
c=0.00285;T_3 = Tair_3 + 0.028*S_3;
T_delta_3 = T_3 - Tref;
S_delta_3 = S_3/Sref - 1;Isc_comp_3 = Isc*S_3/Sref*(1+a*T_delta_3);
Uoc_comp_3 = Uoc*(1-c*T_delta_3)*log(exp(1)+b*S_delta_3);
Im_comp_3  = Im*S_3/Sref*(1+a*T_delta_3);
Um_comp_3  = Um*(1-c*T_delta_3)*log(exp(1)+b*S_delta_3);C2_3=(Um_comp_3/Uoc_comp_3-1)*(log(1-Im_comp_3/Isc_comp_3))^(-1);
C1_3=(1-Im_comp_3/Isc_comp_3)*exp(-Um_comp_3/(C2_3*Uoc_comp_3));U_3=0:0.01:Uoc_comp_3;
Iph_3=Isc_comp_3*(1-C1_3*(exp(U_3/(C2_3*Uoc_comp_3))-1));%-----------------------------------------------
%forth pannel
S_4=400;
Tair_4=25;Sref=1000;  %1000W/m^2
Tref=25;    %25degree celciusUoc=44.2;
Um=35.4;
Isc=5.29;
Im=4.95;a=0.00255;
b=0.55;
c=0.00285;T_4 = Tair_4 + 0.028*S_4;
T_delta_4 = T_4 - Tref;
S_delta_4 = S_4/Sref - 1;Isc_comp_4 = Isc*S_4/Sref*(1+a*T_delta_4);
Uoc_comp_4 = Uoc*(1-c*T_delta_4)*log(exp(1)+b*S_delta_4);
Im_comp_4  = Im*S_4/Sref*(1+a*T_delta_4);
Um_comp_4  = Um*(1-c*T_delta_4)*log(exp(1)+b*S_delta_4);C2_4=(Um_comp_4/Uoc_comp_4-1)*(log(1-Im_comp_4/Isc_comp_4))^(-1);
C1_4=(1-Im_comp_4/Isc_comp_4)*exp(-Um_comp_4/(C2_4*Uoc_comp_4));U_4=0:0.01:Uoc_comp_4;
Iph_4=Isc_comp_4*(1-C1_4*(exp(U_4/(C2_4*Uoc_comp_4))-1));%{
plot(U_1,Iph_1)
hold on
plot(U_2,Iph_2)
hold on
plot(U_3,Iph_3)
hold on
plot(U_4,Iph_4)
%}
%-----------------------------------------------
% 4 in series
% U=C2*Uoc*log((Isc-I)/(C1*Isc)+1)
%Iph_1 > Iph_2 > Iph_3U_s = 0:0.01:Uoc_comp_1*4;
Iph_s=Isc_comp_1*(1-C1_1*(exp(U_s/(C2_1*Uoc_comp_1*4))-1));
plot(U_s,Iph_s,'k')U_ss = zeros(size(U_1)+size(U_2)+size(U_3)+size(U_4));
Iph_ss = U_ss;
%for i = 1 : size(U_1)(2)
%    U_ss(i) = U_1(i);
%    Iph_ss(i) = Iph_1(i);
%endfor i = 1 : length(U_1)if Iph_1(i)>=Iph_2(1)U_ss(i) = U_1(i);Iph_ss(i) = Iph_1(i);step1 = i;elsebreak;end
end
for i = 1 : length(U_2)if Iph_2(i)>Iph_3(1)U_ss(step1+i) = U_2(i) + U_ss(step1);Iph_ss(step1+i) = Iph_2(i);step2 = step1+i;elsebreak;end
end
for i = 1 : length(U_3)if Iph_3(i)>Iph_4(1)U_ss(step2+i) = U_3(i) + U_ss(step2);Iph_ss(step2+i) = Iph_3(i);step3 = step2+i;elsebreak;end
end
for i = 1 : length(U_4)U_ss(step3+i) = U_ss(step3) + U_4(i);Iph_ss(step3+i) = Iph_4(i);
end%plot(U_1,Iph_1)               I-U
%plot(U_2,Iph_2)
%plot(U_ss,Iph_ss,'+')
%plot(U_ss,Iph_ss,'+')figure(1)
plot(U_ss,Iph_ss,'+')
xlabel('U/V')
ylabel('I/A')
title('U-I')
figure(2)
P_ss = U_ss .* Iph_ss;
plot(U_ss,P_ss)
xlabel('U/V')
ylabel('P/W')
title('U-W')
hold on
P_1 = U_1*4 .* Iph_1;
plot(U_1*4,P_1)

2.2 PSO.m(Matlab)

新建一个文件:PSO.m,将以下代码复制进去


gbest = 0;
% initialize
currentN = 1;
maxN = 100;
%2. 
N=4;
Uoc_module = Uoc_comp_4;
Uoc_array = Uoc_comp_4 * N;
v_i = 0.25/(N-1)*Uoc_module;
x_max = 0.95 * Uoc_array;
v_max = Uoc_module;
i=1;
Vo_1 = 0.7* (i-1)*Uoc_module;    %i<N
i=2;
Vo_2 = 0.7* (i-1)*Uoc_module;    %i<N
i=3;
Vo_3 = 0.7* (i-1)*Uoc_module;    %i<N
i=4;
Vo_4 = 0.7* Uoc_array;          %i=N;
Uoc_array = Uoc * N;
v_i = 0.25/(N-1)*Uoc_module;
x_max = 0.95 * Uoc_array;
v_max = Uoc_module;
P_1_max = 0;
P_2_max = 0;
P_3_max = 0;
P_4_max = 0;
Power_1_max = 0;
Power_2_max = 0;
Power_3_max = 0;
Power_4_max = 0;
f_g = 0;
f_g_voltage =0;
c1_begin = 2.7;
c1_end = 1.2;
c2_begin = 0.5;
c2_end = 2.2;
v_1 = 0.25/(N-1)*Uoc_module;
v_2 = 0.25/(N-1)*Uoc_module;
v_3 = 0.25/(N-1)*Uoc_module;
v_4 = 0.25/(N-1)*Uoc_module;%----------------------------------------------------------------------
%Power_1 = GetResult_U_to_P(Vo_1);
if  round(Vo_1*100)==0Power_1 = P_ss(1);
elsePower_1=P_ss(round(Vo_1*100));    
end%Power_2 = GetResult_U_to_P(Vo_2);
if  round(Vo_2*100)==0Power_2 = P_ss(1);
elsePower_2=P_ss(round(Vo_2*100));    
end
%Power_3 = GetResult_U_to_P(Vo_3);
if  round(Vo_3*100)==0Power_3 = P_ss(1);
elsePower_3=P_ss(round(Vo_3*100));    
end
%Power_4 = GetResult_U_to_P(Vo_4);
if  round(Vo_4*100)==0Power_4 = P_ss(1);
elsePower_4=P_ss(round(Vo_4*100));    
end
Power_N = [Power_1,Power_2,Power_3,Power_4]
Vo_N = [Vo_1, Vo_2, Vo_3, Vo_4];
disp(currentN)
disp(Vo_N);
disp(Power_N);for currentN = 1 : maxN-1r1 = rand();r2 = rand();c1 = c1_begin + (c1_end - c1_begin)*(1-acos(-2*currentN/maxN+1)/pi);c2 = c2_begin + (c2_end - c2_begin)*(1-acos(-2*currentN/maxN+1)/pi);%f_avg = sum(f_i)/N;   %paticle power average%f_avg = (P_1+ P_2 + P_3 + P_4)/4;f_avg = sum(Power_N)/N;if f_g < max(Power_N)f_g = max(Power_N);for j=1:Nif Power_N(j) == max(Power_N)f_g_voltage = Vo_N(j);endendendphi = abs(f_g-f_avg);   %f_g: the optimized onef_1 = Power_1;w_1=abs((f_1-f_avg)/phi);f_2 = Power_2;w_2=abs((f_2-f_avg)/phi);f_3 = Power_3;w_3=abs((f_3-f_avg)/phi);f_4 = Power_4;w_4=abs((f_4-f_avg)/phi);w_N = [w_1, w_2, w_3, w_4];if Power_1_max < Power_1P_1_max = Vo_1;Power_1_max = Power_1;endif Power_2_max < Power_2P_2_max = Vo_2;Power_2_max = Power_2;endif Power_3_max < Power_3P_3_max = Vo_3;Power_3_max = Power_3;endif Power_4_max < Power_4P_4_max = Vo_4;Power_4_max = Power_4;endP_N_max = [P_1_max, P_2_max, P_3_max, P_4_max];Power_N_max = [Power_1_max, Power_2_max, Power_3_max, Power_4_max];v_1_next = w_1 * v_1 + c1*r1*(P_1_max - Vo_1) + c2*r2*(f_g_voltage - Vo_1);v_2_next = w_2 * v_2 + c1*r1*(P_2_max - Vo_2) + c2*r2*(f_g_voltage - Vo_2);v_3_next = w_3 * v_3 + c1*r1*(P_3_max - Vo_3) + c2*r2*(f_g_voltage - Vo_3);v_4_next = w_4 * v_4 + c1*r1*(P_4_max - Vo_4) + c2*r2*(f_g_voltage - Vo_4);if v_1_next > Uoc_modulev_1_next = Uoc_module;endif v_2_next > Uoc_modulev_2_next = Uoc_module;endif v_3_next > Uoc_modulev_3_next = Uoc_module;endif v_4_next > Uoc_modulev_4_next = Uoc_module;endv_N_next = [v_1_next, v_2_next, v_3_next, v_4_next];Vo_1 = Vo_1 + v_1_next;Vo_2 = Vo_2 + v_2_next;Vo_3 = Vo_3 + v_3_next;Vo_4 = Vo_4 + v_4_next;if Vo_1 < 0Vo_1 = 0;endif Vo_2 < 0Vo_2 = 0;endif Vo_3 < 0Vo_3 = 0;endif Vo_4 < 0Vo_4 = 0;endif Vo_1 > 0.91*Uoc_arrayVo_1 = 0.91*Uoc_array;endif Vo_2 > 0.91*Uoc_arrayVo_2 = 0.91*Uoc_array;endif Vo_3 > 0.91*Uoc_arrayVo_3 = 0.91*Uoc_array;endif Vo_4 > 0.91*Uoc_arrayVo_4 = 0.91*Uoc_array;end  %Power_1 = GetResult_U_to_P(Vo_1);if  round(Vo_1*100)==0Power_1 = P_ss(1);elsePower_1=P_ss(round(Vo_1*100));    end%Power_2 = GetResult_U_to_P(Vo_2);if  round(Vo_2*100)==0Power_2 = P_ss(1);elsePower_2=P_ss(round(Vo_2*100));    end%Power_3 = GetResult_U_to_P(Vo_3);if  round(Vo_3*100)==0Power_3 = P_ss(1);elsePower_3=P_ss(round(Vo_3*100));    end%Power_4 = GetResult_U_to_P(Vo_4);if  round(Vo_4*100)==0Power_4 = P_ss(1);elsePower_4=P_ss(round(Vo_4*100));    endPower_N = [Power_1,Power_2,Power_3,Power_4]Vo_N = [Vo_1, Vo_2, Vo_3, Vo_4];disp(currentN)disp('P_N_max: individual output voltage of maximum power')disp(P_N_max);disp('Power_N_max: individual maximum power output')disp(Power_N_max)disp('f_g: global max')disp(f_g)disp('Vo_N: output voltage')disp(Vo_N);disp('power_N: output power')disp(Power_N);%disp('v_N_next')%disp(v_N_next)v_1 = v_1_next;v_2 = v_2_next;v_3 = v_3_next;v_4 = v_4_next;v_N = [v_1, v_2, v_3, v_4];differ = (abs(Vo_1-sum( Vo_N)/N) + abs(Vo_2-sum( Vo_N)/N) + abs(Vo_2-sum( Vo_N)/N) + abs(Vo_4-sum( Vo_N)/N))if gbest ==0gbest = f_g;elsegbest = [gbest, f_g];endfigure(2)clfplot(U_ss,P_ss)xlabel('U/V')ylabel('P/W')title('U-W')hold onplot(Vo_N, Power_N, 'k+')  if differ< (0.1*Uoc_array)break;endend
%v_i_next = w*v_i_k + c1*r1*(P_max - V_i_output) + c2*r2*(G_max - V_i_output);
%plot(f_g_voltage, f_g, 'k+')
%figure(2)
%hold on
%plot(v_N, Power_N, 'k+')

需要注意的是,在Matlab中运行时候,需要把以上两份文件放在同一个文件夹内。先运行mySolarPannel_4inseries.m,然后运行pso.m。

3 仿真结果

初始化将4个个体均匀放置在曲线上。

第7次迭代计算:

 

第13次迭代计算:

第14次迭代计算:

我每次只允许个体改变2V电压,因此速度有点慢。

第33次迭代计算,个体的差异低于设定值1.768V,因此结束计算:

 

说明:

将上面提到的这二个文件放在同一个文件夹内。首先执行mySolarPannel_4.m,然后执行PSO.m。

 

另外在for循环内设置一个断点,那么每次迭代的结果都会在图形上显示。

 


http://chatgpt.dhexx.cn/article/p1RecwRa.shtml

相关文章

MPP概述

什么是MPP MPP (Massively Parallel Processing)&#xff0c;即大规模并行处理&#xff0c;在数据库非共享集群&#xff08;传统的单节点不属于集群&#xff0c;双机热备或Oracle RAC等&#xff0c;均是基于共享存储的&#xff09;中&#xff0c;每个节点都有独立的磁盘存储系…

粒子群算法(PSO)光伏发电 MPPT实现多峰值寻优,阴影遮蔽光伏发电算法 使用s函数编写粒子群算法,阴影遮蔽,实现多峰值寻优

粒子群算法&#xff08;PSO&#xff09;光伏发电 MPPT实现多峰值寻优&#xff0c;阴影遮蔽光伏发电算法 使用s函数编写粒子群算法&#xff0c;阴影遮蔽&#xff0c;实现多峰值寻优&#xff0c;解决经典mppt算法会形成局部最优的问题&#xff0c;追踪到最大峰值功率输出。 粒子群…

基于PSO粒子群算法的MPPT最大功率跟踪Simulink仿真,PSO采用S函数实现

目录 1.算法描述 2.仿真效果预览 3.MATLAB核心程序 4.完整MATLAB 1.算法描述 MPPT控制器的全称是“最大功率点跟踪”&#xff08;Maximum Power Point Tracking&#xff09;太阳能控制器&#xff0c;是传统太阳能充放电控制器的升级换代产品。MPPT控制器能够实时侦测太阳能…

理解MP算法

转载&#xff1a;http://blog.csdn.net/u010103202/article/details/50932936 2&#xff0e;MP算法 作为一类贪婪算法&#xff0c;MP算法的基本思路是在迭代中不断找寻最有测量矩阵列来逼近被表示向量&#xff0c;继而寻得最优的稀疏逼近&#xff0c;使得x与y的残差最小。对于…

matlab simulink光伏发电系统MPPT算法

1、内容简介 略 553-可以交流、咨询、答疑 2、内容说明 世界各国能源需求的不断增长&#xff0c;以及传统能源资源的消耗和对环境的不良影 响&#xff0c;促使社会寻找替代能源。因此光伏发电成为研究热点之一&#xff0c;在对光伏电池的 研究中最大功率点追踪 (Maximum Pow…

MP算法与OMP算法

稀疏编码的一般最优化公式为&#xff1a; 其中的零范数为非凸优化。那么如何解这么一个非凸优化问题呢&#xff1f;其中一个常用的解法就是MP算法。 MP算法 MP算法是一种贪心算法&#xff08;greedy&#xff09;&#xff0c;每次迭代选取与当前样本残差最接近的原子&#xff0…

光伏并网MPPT算法控制解析

01 MPPT介绍 太阳能光伏发电是当前利用新能源的主要方式之一&#xff0c;光伏并网发电的主要问题是提高系统中太阳能电池阵列的工作效率和整个系统的工作稳定性&#xff0c;MPPT&#xff08;Maximum power point tracking,最大功率点跟踪&#xff09;是太阳能光伏发电系统中的…

MPC算法

MPC算法 一. 引言 在工程技术方面&#xff0c;MPC全称可指Model Predictive Control模型预测控制&#xff08;又称RHC, Receding Horizon &#xff09;。 模型预测控制算法 一种进阶过程控制方法&#xff0c;自1980年以来开始在化工炼油等过程工业得到应用&#xff0c;并在经…

MP算法和OMP算法及其思想与实现

主要介绍MP(Matching Pursuits)算法和OMP(Orthogonal Matching Pursuit)算法[1]&#xff0c;这两个算法虽然在90年代初就提出来了&#xff0c;但作为经典的算法&#xff0c;国内文献(可能有我没有搜索到)都仅描述了算法步骤和简单的应用&#xff0c;并未对其进行详尽的分析&…

MP算法

MP算法 MP算法是一种贪心算法&#xff08;greedy&#xff09;&#xff0c;每次迭代选取与当前样本残差最接近的原子&#xff0c;直至残差满足一定条件。 求解方法 首先解决两个问题&#xff0c;怎么定义“最接近原子”&#xff0c;怎么计算残差&#xff1f; 选择最接近残差的原…

MP算法和OMP算法及其思想

主要介绍MP(Matching Pursuits)算法和OMP(Orthogonal Matching Pursuit)算法[1]&#xff0c;这两个算法虽然在90年代初就提出来了&#xff0c;但作为经典的算法&#xff0c;国内文献(可能有我没有搜索到)都仅描述了算法步骤和简单的应用&#xff0c;并未对其进行详尽的分析&…

学习笔记2 光伏MPPT算法

目录 前言1. 光伏电池的分类1.1 按照电池结构分类1.2 按照电池材料分类: 2. 光伏电池模型及光伏特性曲线2.1 光伏电池模型2.2 光伏特性曲线 3. 影响光伏电池输出特性曲线的两个主要因素3.1 光照的影响3.1.1 光照对I-V曲线的影响3.1.2 光照对P-V曲线的影响3.1.3 光照对P-I曲线的…

光伏发电最大功率点跟踪MPPT(粒子群算法)

光伏电池作为太阳能发电的核心部件&#xff0c;实现了太阳能到电能的转换&#xff0c;但是由于光伏电池器件本身的复杂性以及现如今光电材料的限制&#xff0c;光伏电池的转换效率总体来说还是比较低&#xff0c;而且其输出还是非线性的&#xff0c;并且光照强度和外界温度对其…

光伏逆变器MPPT基本算法介绍-李星硕

前言 在上一个话题中&#xff0c;我们阐述了光伏MPPT基本原理&#xff1a;从本质上来说&#xff0c;MPPT算法均是通过DC-DC的占空比d来进行控制的。至于如何计算占空比d的值&#xff0c;则取决于具体的MPPT算法。那么在本话题中&#xff0c;我们将介绍两种基本的MPPT算法&#…

MPPT算法(恒定电压、扰动观察、电导增量)介绍与实现过程

目录 1、太阳能板的特性曲线 2、固定电压法 3、MPPT-P&O算法 4、电导增量算法 5、系统实现方案 1、太阳能板的特性曲线 太阳能板也叫光伏电池。是通过光电效应&#xff0c;把光能转换为电能的设备。 先介绍太阳能板的特性。太阳能的额定参数是在地面光伏组件标准测试…

嵌入式怎么入门,嵌入式应该先学习什么

嵌入式到底是什么&#xff0c;很多对这个概念都很迷糊&#xff0c;许多人都认为这是工程师的代名词。 嵌入式工程师可以说是目前涵盖面最广、最火的职业之一&#xff0c;那么到底什么是嵌入式呢&#xff1f; 狭义上嵌入式系统由硬件和软件组成&#xff0e;是能够独立进行运作的…

嵌入式通用学习路线整理

大家好&#xff0c;我是小麦。 从事嵌入式相关行业&#xff0c;差不多快有10年时间了&#xff0c;走过很多弯路&#xff0c;踩过很多坑。 很多人会问&#xff0c;嵌入式真的没有前途吗&#xff1f;这个我其实也无法回答。用发展的眼光来看&#xff0c;万物都有周期。 这个和嵌入…

嵌入式学习(一)嵌入式c语言

第一章.c数据类型及语句 1.01 第一个c程序的编写 下载好VScode并配置好环境&#xff0c;可以开始进行第一个c程序的编写。 #include <stdio.h>int main(int argc,char *argv[]) {printf("Hello World!\n");return 0 ; } 需要注意的几点&#xff1a; 1.#inclu…

嵌入式学习难吗?

首先来说&#xff0c;学习任何一门技术都有它难的地方。如果说嵌入式学习难&#xff0c;那它就难在于嵌入式知识比较综合&#xff0c;比如C语言、数据结构、通信原理、单片机、数字电路、 arm体系、驱动开发、系统移植、Lora&#xff0c;NB-IOT等&#xff0c;大学里开过很多课都…

嵌入式学习(一)—— 初步认识

嵌入式学习&#xff08;一&#xff09;—— 初步认识 一、认识嵌入式二、嵌入式学习内容1.C语言学习2. 模拟电路&#xff0c;数字电路基础- 模拟电路- 数字电路 3. 硬件知识掌握4. 裸机开发5. 认识使用外设模块6. OS学习7.Linux开发板学习8.应用层学习9. PCB学习 三、推荐网站及…