当前位置: 首页 > article >正文

【在线优化】【有源程序】基于遗传算法(GA)和粒子群优化(PSO)算法的MPPT控制策略

目录

一、背景

二、源程序及结果

2.1 simulink仿真程序

2.2 GA模块源程序

2.3 PSO模块源程序

三、程序运行结果

3.1 基于GA优化的MPPT

3.2 基于PSO优化的MPPT


一、背景

MPPT策略能够显著提高光伏、风电等发电效率,节省大量成本。该策略的经典算法是:采用遗传算法(GA)和粒子群优化算法(PSO)进行MPPT控制器中调节器占空比的实时寻优。

只有将这两种经典算法吃明白了,才算入了门,可以在后续MPPT策略改进中游刃有余,答辩时也能信手拈来。

GA和PSO策略不多赘述,核心在于此时在线优化,而非离线优化。即以实时局部最优策略进行MPPT控制。建议大家吃透源程序

二、源程序及结果

在线优化有源程序基于遗传算法(GA)和粒子群优化(PSO)算法的MPPT控制策略资源-CSDN文库

2.1 simulink仿真程序

2.2 GA模块源程序
function D = GSA(Vpv,Ipv)
coder.extrinsic('randi')
persistent u;
persistent dcurrent;%store current duty cycle
persistent pbest;%store local best dc for power
persistent force; %store force
persistent acceleration; %store acceleration
persistent mass; % mass
persistent q; %  strength of mass
persistent p; %  power for each particle
persistent p_current; %  power current for each particle
persistent p_min; %  power min for each particle
persistent worse;   %store best worse of each particle 
persistent dc; %store duty cycle ~ position 
persistent v;  %velocity
persistent counter; %delay iteration
persistent iteration;
persistent gbest;%store global best dc for power
%initialization

max_iter = 3000;
if(isempty(counter))
    counter = 0;
    dcurrent = 0.5; 
    gbest = 0.5;
    pbest = zeros(3,1);
    worse = zeros(3,1);
    v = zeros (3,1);
    force = zeros(3,1);
    mass = zeros(3,1);
    q = zeros(3,1);
    p = zeros(3,1);
    p_current = zeros(3,1);
    p_min=zeros(3,1);
   
    acceleration=zeros(3,1);
    u = 0;
    dc = zeros (3,1); 
    iteration = 1;
    
    %initialize position for each particle
        dc(1)=0.69;
        dc(2)= 0.7;
        dc(3)=0.8;
        
end

if(counter >=1 && counter < 3000)
    D=dcurrent;
    counter= counter+1;
    return;
end

if(u>=1 && u<=3)
    p_current(u) = Vpv*Ipv;
    if((Vpv*Ipv)>=p(u))
        p(u) = Vpv*Ipv;
        pbest(u)=dcurrent;
    end
    if(Vpv*Ipv < p_min(u))
        p_min(u) = Vpv*Ipv;
        worse(u) = dcurrent;
    end
end
u=u+1;
if(u==5)
    u=1;
end
if(u >= 1 && u <= 3)
    %Avoid over shooting
    if(iteration < max_iter)
        D=dc(u);
        dcurrent=D;
        counter=1;
    return;
    else
        D = dcurrent;
        return
    end
elseif(u==4)
    iteration = iteration +1;
    [~,i]=max(p);
    gbest=pbest(i);
    D=gbest;
    dcurrent=D;
    counter=1;
     %Calculate strength of mass
    for i = 1:3
     q(i) = (p_current(i) - worse(i))/(pbest(i)-worse(i));
    end
     %Calculate sum of strength of mass

     sum_strength_of_mass = q(1) + q(2) + q(3);
    
    %Calculate mass   
    for i = 1:3
     mass(i) = q(i)/sum_strength_of_mass;
    
    end
    %Calculate force
    alpha = 200;
    G0 = 1;
    G = G0 * exp(-alpha*iteration/max_iter);
    %G = 6.67430 * 10^-13; %gravitational constant
    e = 2.2204*10^-16;
    force(1) = rand()*G*(mass(3)*mass(1)*(dc(3)-dc(1))/(Euclidian_distance(dc(3),dc(1))+e) + mass(2)*mass(1)*(dc(3)-dc(1))/(Euclidian_distance(dc(3),dc(1))+e));
    force(2) = rand()*G*(mass(3)*mass(2)*(dc(3)-dc(2))/(Euclidian_distance(dc(3),dc(2))+e) + mass(1)*mass(2)*(dc(1)-dc(2))/(Euclidian_distance(dc(1),dc(2))+e));
    force(3) = rand()*G*(mass(2)*mass(3)*(dc(2)-dc(3))/(Euclidian_distance(dc(2),dc(3))+e) + mass(1)*mass(3)*(dc(1)-dc(3))/(Euclidian_distance(dc(1),dc(3))+e));
    %Avoid over shooting
    if(iteration == max_iter)
        
        D=dcurrent;
        return;
    end
    %Calculate acceleration 
    for i = 1:3
        acceleration(i) = force(i)/mass(i);
        
    end
    
    for i=1:3
        
     v(i)=updatevelocity(v(i),acceleration(i));
     
     dc(i)=updateduty(dc(i),v(i));
     
    end  
    return;
    
else
    D=0.5;
end
end


function d = Euclidian_distance(d1,d2)
    d = sqrt(d1^2+d2^2);
end


function vfinal=updatevelocity(velocity,acceleration)
    vfinal = rand()*velocity + acceleration;
end

function dfinal=updateduty(d,velocity)
dup=d+velocity;
if(dup>1)
    dfinal=1;
elseif(dup<0.1)
    dfinal=0.1;
else
    dfinal=dup;
end
end
2.3 PSO模块源程序
function D = PSO(Vpv, Ipv)
    coder.extrinsic('randi')
    persistent localbest globalbest k p dc Pbest Pprev dcurrent u v temp;
    c1 = 1;
    c2 = 2;
    P = Ipv * Vpv;
    if isempty(globalbest)
        k = 0;
        dc = zeros(3,1);
        dc(1)=randi( [5 330])/1000;
        dc(2)=randi( [330 660])/1000;
        dc(3)=randi( [660 995])/1000;
        p = zeros(3,1);
        localbest = zeros(3,1);
        v = zeros(3,1);
        Pbest = Ipv * Vpv;
        Pprev = 0;
        dcurrent = 0.5;
        globalbest = dcurrent;
        u=0;
        temp = 0;
    end
    D=dcurrent;
 
    if (temp < 0)
        temp = temp + 1;
        return;
    end
    if (P > Pbest)
        Pbest = P;        
    end
    if (k < 3000)
        k=k+1;
        return;
    else
        k=0;
    end
    if abs(P - Pprev) < 1
       if abs(P - Pbest) > 15
          dc(1)=randi( [5 330])/1000;
          dc(2)=randi( [330 660])/1000;
          dc(3)=randi( [660 995])/1000;
          v = zeros(3,1);
          localbest = zeros(3,1);
          p = zeros(3,1);
          u= 0;
       end
    end
    
    if(u>=1 && u<=3)
        if(P>p(u))
            p(u)=P;
            localbest(u)=dcurrent;
        end
    end
    
    u=u+1;
    
    if (u > 4)
        u=1;
    end
    if (u == 4)
        [~,idx]=max(p);
        globalbest=localbest(idx);
        D = globalbest;
        dcurrent=D;
        for j=1:3
                v(j)=updatevelocity(c1,c2,v(j),localbest(j),dc(j),globalbest);
                dc(j)=updateduty(dc(j),v(j));
        end
    else
        D=dc(u);
        dcurrent=dc(u);
        Pprev = P;
    end
    
  
end

function vfinal=updatevelocity(c1,c2,velocity,pobest,d,gwbest)
    % PSO Parameters
    vfinal = (0.1*velocity)+(c1*rand(1)*(pobest-d))+(c2*rand(1)*(gwbest-d));
end

function dfinal=updateduty(d,velocity)
    dup=d+velocity;
    if(dup>1)
        dfinal=1;
    elseif(dup<0)
        dfinal=abs(dup);
    else
        dfinal=dup;
    end
end

三、程序运行结果

3.1 基于GA优化的MPPT

3.2 基于PSO优化的MPPT

 四、源程序获取

上述章节已经给出了框图和源码,但一定要喂到嘴里,下载即可:

在线优化有源程序基于遗传算法(GA)和粒子群优化(PSO)算法的MPPT控制策略资源-CSDN文库

 


http://www.kler.cn/a/539318.html

相关文章:

  • 【MySQL】深度学习数据库开发技术:使用CC++语言访问数据库
  • PHP 运算符
  • verilog练习:i2c slave 模块设计
  • 智能化食品安全管理:AI视频监控在大型商场的技术方案
  • win32汇编环境,结构体的使用示例一
  • kafka生产端之拦截器、分区器、序列化器
  • PHP的filter_var函数的安全问题
  • 相机开启状态下拔出SD卡导致的数据丢失问题及恢复方法
  • 蓝桥杯小白打卡第三天
  • 最短路径问题-------Dijkstra算法
  • 一个基于ESP32S3和INMP441麦克风实现音频强度控制RGB灯带律动的代码及效果展示
  • 【Java基础】为什么不支持多重继承?方法重载和方法重写之间区别、Exception 和 Error 区别?
  • 【SQLite】设置本地时间戳默认值
  • 【PDF提取内容】如何批量提取PDF里面的文字内容,把内容到处表格或者批量给PDF文件改名,基于C++的实现方案和步骤
  • DeepSeek与Vue.js携手:打造高效分页组件之旅
  • 在CT107D单片机综合训练平台上,8个数码管分别单独依次显示0~9的值,然后所有数码管一起同时显示0~F的值,如此往复。
  • stm32编译过程剖析 MicroPython openmv运行逻辑分析 MicroPython和传统c语言编译的比较 头脑风暴
  • 本地部署DeepSeek-R1模型(新手保姆教程)
  • 树与二叉树的概念
  • Netty:高性能网络应用框架的深度解析
  • C++病毒
  • Chirpy3D:用于创意 3D 鸟类生成的连续部分潜在特征
  • Unity 基础编程
  • 334递增的三元子序列贪心算法(思路解析+源码)
  • feign Api接口中注解问题:not annotated with HTTP method type (ex. GET, POST)
  • 【系统设计】使用Spring Boot连接MySQL数据库