function [duty,iterations] = TSOMPPT(vpv,ipv) persistent p u dc dbest counter iteration iter_max num; if isempty(num) num=10; end if isempty(p) p=zeros(1,num); dbest=0; counter=0; u=1; iteration=0; iter_max=15; end if isempty(dc) dc=linspace(0,0.7,num); end iterations=iteration; if iterations<=iter_max if(counter>=1 && counter<=100) duty=dc(u); counter=counter+1; return; end if(u>=1 && u<=num) p(u)=vpv*ipv; end u=u+1; if(u<num+1) duty=dc(u); counter=1; return; end u=1; counter=1; iteration=iteration+1; [m,i]=max(p); dbest=dc(i); dc1=EPOUpdateDuty(dbest,dc,iteration,iter_max,num); dc=dc1; duty=dc(u); return; else duty=dbest; return; end end function D=EPOUpdateDuty(dbest,d,iter,iter_max,num) D=zeros(1,num); dup=zeros(1,num); persistent s; if isempty(s) s=0.5; end res=0.01; if iter>iter_max iter=iter_max; end eta=(res/s)^(iter/iter_max); s=s*eta for i=1:num deltaD=s*(2*rand()-1); if d(i)==dbest dup(i)=dbest; else dup(i)=dbest+deltaD; end if dup(i)>1 dup(i)=1; end if dup(i)<0 dup(i)=0; end end D=dup; end 把这个代码改写成基于粒子群优化算法
时间: 2023-12-07 11:02:31 浏览: 29
function [duty,iterations] = PSOMPPT(vpv,ipv) persistent p u dc dbest counter iteration iter_max num; if isempty(num) num=10; end if isempty(p) p=zeros(1,num); dbest=0; counter=0; u=1; iteration=0; iter_max=15; end if isempty(dc) dc=linspace(0,0.7,num); end iterations=iteration; if iterations<=iter_max if(counter>=1 && counter<=100) duty=dc(u); counter=counter+1; return; end if(u>=1 && u<=num) p(u)=vpv*ipv; end u=u+1; if(u<num+1) duty=dc(u); counter=1; return; end u=1; counter=1; iteration=iteration+1; [m,i]=max(p); dbest=dc(i); dc1=EPOUpdateDutyPSO(dbest,dc,iteration,iter_max,num); dc=dc1; duty=dc(u); return; else duty=dbest; return; end end function D=EPOUpdateDutyPSO(dbest,d,iter,iter_max,num) D=zeros(1,num); persistent w c1 c2 v pbest gbest; if isempty(w) w=0.72; end if isempty(c1) c1=1.49; end if isempty(c2) c2=1.49; end if isempty(v) v=zeros(num,1); end if isempty(pbest) pbest=d; end if isempty(gbest) gbest=dbest; end res=0.01; if iter>iter_max iter=iter_max; end eta=(res/w)^(iter/iter_max); w=w*eta for i=1:num v(i)=w*v(i)+c1*rand()*(pbest(i)-d(i))+c2*rand()*(gbest-d(i)); d(i)=d(i)+v(i); if d(i)>1 d(i)=1; end if d(i)<0 d(i)=0; end end p=vpv*ipv; [m,i]=max(p); if p(i)>pbest(i) pbest(i)=d(i); end if p(i)>gbest gbest=d(i); end D=pbest; end