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

news2024/11/13 11:41:46

目录

1.算法描述

2.仿真效果预览

3.MATLAB核心程序

4.完整MATLAB


1.算法描述

        MPPT控制器的全称是“最大功率点跟踪”(Maximum Power Point Tracking)太阳能控制器,是传统太阳能充放电控制器的升级换代产品。MPPT控制器能够实时侦测太阳能板的发电电压,并追踪最高电压电流值(VI),使系统以最大功率输出对蓄电池充电。应用于太阳能光伏系统中,协调太阳能电池板、蓄电池、负载的工作,是光伏系统的大脑。

       最大功率点跟踪系统是一种通过调节电气模块的工作状态,使光伏板能够输出更多电能的电气系统能够将太阳能电池板发出的直流电有效地贮存在蓄电池中,可有效地解决常规电网不能覆盖的偏远地区及旅游地区的生活和工业用电,不产生环境污染。

        目前,光伏阵列的最大功率点跟踪(MPPT)技术,国内外已有了一定的研究,发展出各种控制方法常,常用的有一下几种:恒电压跟踪法(ConstantVoltageTracking简称CVT)、干扰观察法(PerturbationAndObservationmethod简称P&O)、增量电导法(IncrementalConductancemethod简称INC)、基于梯度变步长的电导增量法等等。(这些算法只能用在无遮挡的条件下)

1)单峰值功率输出的MPPT的算法

       目前,在无遮挡条件下,光伏阵列的最大功率点跟踪(MPPT)的控制方法常用的有以下几种:
l恒电压跟踪法(ConstantVoltageTracking简称CVT)
l干扰观察法(PerturbationAndObservationmethod简称P&O)
l增量电导法(IncrementalConductancemethod简称INC)
l基于梯度变步长的电导增量法,等等。

2)多峰值功率输出MPPT算法

       普通的最大功率跟踪算法,如扰动观测发和电导增量法在一片云彩的遮挡下就有可能失效,不能实现真正意义的最大功率跟踪。目前,国际上也有人提出了多峰值的MPPT算法,主要包含如下三种:

结合常规算法的复合MPPT算法
Fibonacci法
短路电流脉冲法
 


   PSO初始化为一群随机粒子(随机解)。然后通过迭代找到最优解。在每一次的迭代中,粒子通过跟踪两个“极值”(pbest,gbest)来更新自己。在找到这两个最优值后,粒子通过下面的公式来更新自己的速度和位置。

在这里插入图片描述

 第①部分称为【记忆项】,表示上次速度大小和方向的影响;

第②部分称为【自身认知项】,是从当前点指向粒子自身最好点的一个矢量,表示粒子的动作来源于自己经验的部分;

第③部分称为【群体认知项】,是一个从当前点指向种群最好点的矢量,反映了粒子间的协同合作和知识共享。粒子就是通过自己的经验和同伴中最好的经验来决定下一步的运动。

以上面两个公式为基础,再来看一个公式:

在这里插入图片描述

2.仿真效果预览

matlab2022a仿真如下:

3.MATLAB核心程序

 

function [sys,x0,str,ts] = BFOA_PSO_pwm(t,x,u,flag)
.............................
 
 
persistent Pbest;
%persistent Pbestval;
 
persistent best_index;
 
persistent c1;
persistent c2;
persistent r1;
persistent r2;
 
switch flag,
    case 0,
        sizes = simsizes;
        sizes.NumContStates = 0;
        sizes.NumDiscStates = 0;
        sizes.NumOutputs     = 1;
        sizes.NumInputs      = 2;
        sizes.DirFeedthrough = 0;
        sizes.NumSampleTimes = 1;
        sys = simsizes(sizes);
        x0=[];
        str=[];
        ts=[0.004 ,0.001];
 
        % initialize the static variables
        first = 1;
        stop = 0;
        i = 0;
        mg = 0;
        count = 3;
        Nc_count = 0;
        Nre_count = 0;
        D_out = zeros(1, NP);                       %初始化D_out、U、fitval_current、fitval_new为全0
        D_out_current = zeros(1,NP);
        best_index = 1;
        %U = zeros(1, NP);
        %V = zeros(1, NP);
        fitval_current = zeros(1, NP);
        fitval_new = zeros(1, NP);
        
        fit_order = zeros(1, NP);
        
 
        Pbest = zeros(1, NP);
        Gbest = 0;
        %Gmaxval = 0;
        %X(:) = unifrnd(XL, XU, 1,NP)
        D_out_current(:) = linspace(XL+0.005,XU-0.005,NP);                 %在[-1,1]间均匀取值
        D_out(:) = D_out_current(:);
        MoveStep = unifrnd(-MaxStep, MaxStep, 1,NP);   %初始化单个细菌的移动速度
        MoveStep_PSO = zeros(1, NP);
        stable_flag = 1;                               %初始化,电路未稳定
        stable_count = 0;
        
        c1 = 0.030;
        c2 = 0.030;
        r1 = rand();
        r2 = rand();
 
    case 3,
        %if count == 3
         %count = count + 1;
            count = 1;
        %迭代完成,输出最优值
        if stop == 1;
            [best, best_index]= max(fitval_current);
            sys = D_out(best_index);
            return;
        end          
        %判断是否迭代完成
        if mg > maxgen
            stop = 1;
        end
        
        if mg == 0  % 第一代,只进行迭代,然后计算各自功率,作为初始比较功率fitval_current   
            
            if i == 0
                i= i + 1;
                sys = D_out_current(1);  
            elseif i > 1 && i < NP
                fitval_current(i-1) = adaptfunc(D_out_current(i-1),Uin);   %记录第一代的上一个个体的功率
                Pbest(i-1) = D_out_current(i-1);
                i= i + 1;
                sys = D_out_current(i);            
            elseif i == NP
                fitval_current(i-1) = adaptfunc(D_out_current(i-1),Uin);
                Pbest(i-1) = D_out_current(i-1);
                i= i + 1;
                sys = D_out_current(NP);
            elseif i == NP + 1
                fitval_current(i-1) = adaptfunc(D_out_current(i-1),Uin);
                Pbest(i-1) = D_out_current(i-1);
                [best, best_index]= max(fitval_current);
                Gbest = D_out_current(best_index);
                 i = 1;
                 Nc_count = Nc_count + 1;
                 Nre_count = Nre_count + 1;
                 mg = mg + 1;
                 for j = 1 : NP                       %第一代种群中个体进行游动
                    MoveStep_PSO = c1*r1*(Pbest(j)-D_out_current(j)) + c2*r2*(Gbest-D_out_current(j));
                    D_out(j) = D_out_current(j)+ MoveStep(j) + MoveStep_PSO;
                    if D_out(j) <= XL
                            D_out(j) = XL+0.001;
                        elseif D_out(j) >= XU
                            D_out(j) = XU-0.001;
                    end
                 end
                 sys = D_out(1);            
            else
                i= i + 1;
                sys = D_out_current(i);            
            end
            
            return;
            
        else   %第一代之后      
            
            if i > 1 && i < NP
                fitval_new(i-1) =adaptfunc(D_out(i-1), Uin);      %计算前一次占空比下的功率
                Pbest(i-1) = D_out(i-1);
                i = i + 1;
                sys = D_out(i);
            elseif i == NP
                fitval_new(i-1) =adaptfunc(D_out(i-1), Uin);
                Pbest(i-1) = D_out(i-1);
                i = i + 1;
                sys = D_out(NP);
            elseif i == 1
                i = i + 1;            
                sys = D_out(i);       
            elseif i == NP + 1 %种群迭代一次结束,开始进行新的一代种群繁殖                            
                %趋向性操作,判定运动方向
                fitval_new(i-1) =adaptfunc(D_out(i-1), Uin);
                Pbest(i-1) = D_out(i-1);
                r1 = rand();
                r2 = rand();
                for j = 1 : NP
                if (fitval_new(j) >= fitval_current(j))
                    D_out_current(j) = D_out(j);
                    fitval_current(j) =  fitval_new(j);
                else
                    MoveStep(j) = - MoveStep(j);  %若该方向功率未改进,说明不适应生存,改变方向运动
                end       
                end
                
                c1 = c1/3;
                c2 = c2/3;
 
                 D_out(:)                              %打印最新的占空比
                [best, best_index]= max(fitval_current);  %计算最大功率点,best为最大功率,best_index为最大功率点在种群中的位置            
                mg
                D_out(best_index)                   %显示最大功率点的占空比
                %Gbest = U(best_index)               %显示最大功率点的电压
                %Gmaxval = best                      %显示最大功率点的功率
                best
                fit_order = order(fitval_current,NP)    %显示当前种群功率从大到小顺序
 
                Gbest = D_out(best_index);
                % mutation
                if Nc_count == Nc %进行满Nc次趋向性操作            
                    Nc_count = 0;
                    Nre_count = Nre_count + 1;
                    %复制操作
                    MaxStep = MaxStep/2;
                    MoveStep = unifrnd(-MaxStep,MaxStep,1,NP);                 %每Nc次繁殖生成一次新的随机步长
                    [fitval_current,D_out_current]=Reproduction(fitval_current,D_out_current,NP);      %复制
                    D_out=D_out_current;
                    if Nre_count == Nre %进行满Nre次复制操作后迁移操作
                        Nre_count = 0;
                        for j=1:NP
                        if(rand(0,1)<Ped)
                            fitval_current = 0;
                            %MoveStep(i) = unifrnd(-MaxStep,MaxStep);
                            D_out(j) = unifrnd(XL,XU);
                        end
                        end
                    end
                else
                    Nc_count = Nc_count + 1;
                    for j=1:NP
                        MoveStep_PSO = c1*r1*(Pbest(j)-D_out(j)) + c2*r2*(Gbest-D_out(j));
                        D_out(j) = D_out(j) + MoveStep(j) + MoveStep_PSO;
                        if D_out(j) <= XL
                            D_out(j) = XL+0.001;
                        elseif D_out(j) >= XU
                            D_out(j) = XU-0.001;
                        end
                    end                
                end          
            %为下一次迭代做准备
            sys = D_out(1);
            i = 1;
            mg = mg +1;
            end
        end
        return;
      
    case 2,
        Uin = u;
    case {1,4,9},
        sys = [];
end
 
A85
 

4.完整MATLAB

V

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/58350.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

30岁自学Python转行靠谱吗?

前言 30岁自学Python转行靠谱吗&#xff1f;若啃学习任何时候都不晚&#xff0c;关键是学习完用来做什么。提高工作效率&#xff0c;写些脚本实现自动化办公这些完全没问题。如果学python是为了转开发&#xff0c;建议慎重考虑&#xff0c;程序开发转Python相对容易些&#xf…

[附源码]计算机毕业设计血库管理系统Springboot程序

项目运行 环境配置&#xff1a; Jdk1.8 Tomcat7.0 Mysql HBuilderX&#xff08;Webstorm也行&#xff09; Eclispe&#xff08;IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持&#xff09;。 项目技术&#xff1a; SSM mybatis Maven Vue 等等组成&#xff0c;B/S模式 M…

计算机网络——运输层【重点】

运输层概述 概念 进程之间的通信 从通信和信息处理的角度看&#xff0c;运输层向它上面的应用层提供通信服务&#xff0c;它属于面向通信部分的最高层&#xff0c;同时也是用户功能中的最低层。当网络的边缘部分中的两个主机使用网络的核心部分的功能进行端到端的通信时&…

【SpingBoot拦截器】实现两个接口,配置拦截路径

文章目录SpingBoot拦截器拦截器与过滤器的区别&#xff1a;1.HandlerInterceptor接口2.WebMvcConfigurer接口3.示例&#xff1a;SpingBoot拦截器 【SpringWeb框架中的拦截器作用类似于过滤器&#xff0c;都可以对一个请求进行拦截处理。】 我们可以用拦截器做很多事情&#xf…

使用HTML制作静态网站作业——我的校园运动会(HTML+CSS)

&#x1f389;精彩专栏推荐 &#x1f4ad;文末获取联系 ✍️ 作者简介: 一个热爱把逻辑思维转变为代码的技术博主 &#x1f482; 作者主页: 【主页——&#x1f680;获取更多优质源码】 &#x1f393; web前端期末大作业&#xff1a; 【&#x1f4da;毕设项目精品实战案例 (10…

Java项目:SSM企业门户网站

作者主页&#xff1a;源码空间站2022 简介&#xff1a;Java领域优质创作者、Java项目、学习资料、技术互助 文末获取源码 项目介绍 本项目分为前后台&#xff0c;前台主要用于官网展示&#xff0c;后台主要为管理员管理&#xff0c; 管理员角色包含以下功能&#xff1a; 管理员…

Rook Ceph浅谈

storageclass是最省心的&#xff0c;上面三种删除了容器存储还在 下图是管理员定义pv&#xff0c;用户不知道这些细节 PersistentVolume pv会跟后端的存储rbd对接 用户通过PVC调用PV ,根据10G容量去pv里找相匹配的自动关联 上图就叫 pvc-demo StorageClass 更厉害 管理员…

PostgreSQL 内核可观测性体系

文章目录背景Metricspgstat指标展示指标统计相关的guc 参数pgstat 实现pg_stat_statements基本用法及指标内容pg_stat_statements 实现Trace总结背景 PG 作为一个演讲30多年历史的TP 数据库&#xff0c;其复杂度极高&#xff0c;如果帮助DBA 在线上分析复杂查询的问题或者构建…

Nexus私服(二)

(一) SpringBoot配置Maven发布至Nexus私服 Nexus默认会带有四常用个仓库&#xff0c;maven-central、maven-public、maven-releases、maven-snapshotsmaven-central类型是proxy代理类型&#xff0c;地址是指向maven中央仓库地址https://repo1.maven.org/maven2/maven-releases、…

空间复杂度(Space Complexity)

预计阅读时间&#xff1a;10分钟 一、简介 随着计算机空间的发展&#xff0c;空间复杂度逐渐变得不那么重要了&#xff0c;但它在比赛中仍然存在。 推导方法&#xff1a; 用常数1取代运行时间中的所有加法常数。 在修改后的运行次数函数中&#xff0c;只保留最高阶项。…

[附源码]Python计算机毕业设计Django旅游网的设计与实现

项目运行 环境配置&#xff1a; Pychram社区版 python3.7.7 Mysql5.7 HBuilderXlist pipNavicat11Djangonodejs。 项目技术&#xff1a; django python Vue 等等组成&#xff0c;B/S模式 pychram管理等等。 环境需要 1.运行环境&#xff1a;最好是python3.7.7&#xff0c;…

2013-2020年全国31省数字经济信息化基础数据

2013-2020年全国31省数字经济信息化基础 1、时间&#xff1a;2013-2020年 2、来源&#xff1a;国家统计J和统计NJ 3、范围&#xff1a;31省 4、指标包括&#xff1a; "光缆线路长度(公里)、移动电话基站&#xff08;万个&#xff09;、信息传输、软件和信息技术服务业…

基于模糊BP神经网络轨迹跟踪(Matlab代码实现)

&#x1f468;‍&#x1f393;个人主页&#xff1a;研学社的博客 &#x1f4a5;&#x1f4a5;&#x1f49e;&#x1f49e;欢迎来到本博客❤️❤️&#x1f4a5;&#x1f4a5; &#x1f3c6;博主优势&#xff1a;&#x1f31e;&#x1f31e;&#x1f31e;博客内容尽量做到思维缜…

【VUE Cli脚手架软件安装篇】

目录 1. 搭建开发环境 1.1. 安装Node.js 1.2. 配置npm源 2. 安装VUE Cli 3. 创建第1个VUE CLI工程 3.1. 创建工程 3.2. 启动服务 3.3. 停止服务 3.4. 重启服务 1. 搭建开发环境 1.1. 安装Node.js 首先需要下载Node.js安装包&#xff0c;下载地址可参考&#xff1a;ht…

【数据结构】顺序表的概念及实现

顺序表1、顺序表概念2、初始化顺序表3、销毁顺序表4、判断顺序表是否为空5、打印顺序表6、检查顺序表的容量&#xff08;同时充当扩容任务&#xff09;7、顺序表的尾插8、顺序表的头插9、顺序表的尾删10、顺序表的头删11、查找顺序表中某个数的位置12、在顺序表pos位置插入数字…

光环:元宇宙概念及生态发展现状与研判——张子良

摘要&#xff1a;文章内容主要来源于光环国际2022年第三届中国科创者大会张子良老师的分享&#xff0c;原分享名称为"元宇宙行业应用实践探索"。讲述了元宇宙的理论知识、元宇宙生态圈及当前发展的情况。提出来看一个概念是否相同可以从引入时间、内容两个方面去界定…

【用python的标准库画出显示实时时间的数码管】

&#x1f935;‍♂️ 个人主页老虎也淘气 个人主页 ✍&#x1f3fb;作者简介&#xff1a;Python学习者 &#x1f40b; 希望大家多多支持我们一起进步&#xff01;&#x1f604; 如果文章对你有帮助的话&#xff0c; 欢迎评论 &#x1f4ac;点赞&#x1f44d;&#x1f3fb; 收藏…

Java项目:SSM电影售票管理系统

作者主页&#xff1a;源码空间站2022 简介&#xff1a;Java领域优质创作者、Java项目、学习资料、技术互助 文末获取源码 项目介绍 管理员角色包含以下功能&#xff1a; 管理员登陆,管理员用户管理,新闻公告增删改查,电影类型增删改查,影院信息增删改查,电影信息增删改查,订单…

计算机网络学习笔记(II)——应用层

文章目录第二章—应用层2.1、应用层原理网络应用的体系结构客服—服务器&#xff08;C/S&#xff09;体系结构对等体&#xff08;P2P&#xff09;体系结构C/S和P2P体系的混合结构进程通信分布式进程通信需要解决的问题应用层协议Internet传输层提供的服务UDP存在的必要性2.2、W…

【Android插件化框架】插件APK中的动态代理

在 Android 中实现插件化框架&#xff0c;需要解决的问题主要如下&#xff1a; 资源和代码的加载Android 生命周期的管理和组件的注册宿主 APK 和插件 APK 资源引用的冲突解决 下面分析几个目前主流的开源框架 DL 动态加载框架 ( 2014 年底) 是基于代理的方式实现插件框架&…