(转载)基于粒子群算法的PID控制器优化设计(matlab实现)

news2024/12/24 3:27:02

1 理论基础

        PID控制器应用广泛,其一般形式为
        可见,PID控制器的性能取决于Kp、Ki、Kd这3个参数是否合理,因此,优化PID控制器参数具有重要意义。目前,PID控制器参数主要是人工调整,这种方法不仅费时,而且不能保证获得最佳的性能。PSO已经广泛应用于函数优化、神经网络训练、模式分类、模糊系统控制以及其他应用领域,本案例将使用PSO进行PID控制器参数的优化设计。

2 案例背景

2.1 问题描述

        PID控制器的系统结构图如图14-1所示。

        在Simulink环境下建立的模型如图14-2所示。
        图14-2中,微分环节由一个一阶环节近似,输出端口1即为式(14-2)所示的ITAE指标,通过将时间及误差绝对值的乘积进行积分后得到。

2.2 解题思路及步骤

        1.优化设计过程
        利用粒子群算法对PID控制器的参数进行优化设计,其过程如图14-3所示。

 

        图14-3中,粒子群算法与Simulink模型之间连接的桥梁是粒子(即PID控制器参数)和该粒子对应的适应值(即控制系统的性能指标)。优化过程如下:PSO产生粒子群(可以是初始化粒子群,也可以是更新后的粒子群),将该粒子群中的粒子依次赋值给PID控制器的参数Kp、Ki、Kd,然后运行控制系统的Simulink模型,得到该组参数对应的性能指标,该性能指标传递到PSO中作为该粒子的适应值,最后判断是否可以退出算法。
        2.粒子群算法实现
        粒子群算法的基本原理在前面已经述及,进一步地,粒子在搜索空间中的速度和位置根据以下公式确定:
        PSO的流程如下:
        (1)初始化粒子群,随机产生所有粒子的位置和速度,并确定粒子的Pt和Gt。
        (2)对每个粒子,将其适应值与该粒子所经历过的最优位置P,的适应值进行比较,如较好,则将其作为当前的Pt。
        (3)对每个粒子,将其适应值与整个粒子群所经历过的最优位置Gt的适应值进行比较,如较好,则将其作为当前的Gt。
        (4)按式(14-4)和式(14-5)更新粒子的速度和位置。
        (5)如果没有满足终止条件(通常为预设的最大迭代次数和适应值下限值),则返回步骤(2);否则,退出算法,得到最优解。

3 MATLAB程序实现

3.1 Simulink部分的程序实现

        图14-3所示的PSO优化PID过程示意图,其右侧的Simulink部分的程序实现如下:
function z=PSO_PID(x)
assignin('base','Kp',x(1));
assignin('base','Ki',x(2));
assignin('base','Kd',x(3));
[t_time,x_state,y_out]=sim('PID_Model',[0,20]);
z=y_out(end,1);
        其中,x为PSO中传递过来的粒子,首先,调用函数assignin将x(1)、x(2)、x(3)的值赋值给Workspace中的Kp、Ki、Kd,该语句实现了图14-3中从PSO部分到Simulink部分的参数传递;然后,调用函数sim对图14-2所示的模型进行仿真,其中,PID_Model为Simulink模型的文件名,[0,20]为仿真时间,返回的y_out即为输出端子1的值;最后,将性能指标ITAE赋值给z,以实现图14-3中从Simulink部分到PSO部分的参数传递。

3.2 PSO部分的程序实现

        设置PSO的参数为:惯性因子w=0.6,加速常数c?=c?=2,维数为3(有3个待优化参数),粒子群规模为100,待优化函数为14.3.1节中的函数PSO_PID,最大迭代次数为100,最小适应值为0.1,速度范围为[-1,1],3个待优化参数范围均为[0,300]。代码如下:
%% 清空环境
clear
clc

%% 参数设置
w = 0.6;      % 惯性因子 
c1 = 2;       % 加速常数
c2 = 2;       % 加速常数

Dim = 3;            % 维数
SwarmSize = 100;    % 粒子群规模
ObjFun = @PSO_PID;  % 待优化函数句柄

MaxIter = 100;      % 最大迭代次数  
MinFit = 0.1;       % 最小适应值 

Vmax = 1;
Vmin = -1;
Ub = [300 300 300];
Lb = [0 0 0];

%% 粒子群初始化
    Range = ones(SwarmSize,1)*(Ub-Lb);
    Swarm = rand(SwarmSize,Dim).*Range + ones(SwarmSize,1)*Lb      % 初始化粒子群
    VStep = rand(SwarmSize,Dim)*(Vmax-Vmin) + Vmin                 % 初始化速度
    fSwarm = zeros(SwarmSize,1);
for i=1:SwarmSize
    fSwarm(i,:) = feval(ObjFun,Swarm(i,:));                         % 粒子群的适应值
end

%% 个体极值和群体极值
[bestf bestindex]=min(fSwarm);
zbest=Swarm(bestindex,:);   % 全局最佳
gbest=Swarm;                % 个体最佳
fgbest=fSwarm;              % 个体最佳适应值
fzbest=bestf;               % 全局最佳适应值

%% 迭代寻优
iter = 0;
y_fitness = zeros(1,MaxIter);   % 预先产生4个空矩阵
K_p = zeros(1,MaxIter);         
K_i = zeros(1,MaxIter);
K_d = zeros(1,MaxIter);
while( (iter < MaxIter) && (fzbest > MinFit) )
    for j=1:SwarmSize
        % 速度更新
        VStep(j,:) = w*VStep(j,:) + c1*rand*(gbest(j,:) - Swarm(j,:)) + c2*rand*(zbest - Swarm(j,:));
        if VStep(j,:)>Vmax, VStep(j,:)=Vmax; end
        if VStep(j,:)<Vmin, VStep(j,:)=Vmin; end
        % 位置更新
        Swarm(j,:)=Swarm(j,:)+VStep(j,:);
        for k=1:Dim
            if Swarm(j,k)>Ub(k), Swarm(j,k)=Ub(k); end
            if Swarm(j,k)<Lb(k), Swarm(j,k)=Lb(k); end
        end
        % 适应值
        fSwarm(j,:) = feval(ObjFun,Swarm(j,:));
        % 个体最优更新     
        if fSwarm(j) < fgbest(j)
            gbest(j,:) = Swarm(j,:);
            fgbest(j) = fSwarm(j);
        end
        % 群体最优更新
        if fSwarm(j) < fzbest
            zbest = Swarm(j,:);
            fzbest = fSwarm(j);
        end
    end 
    iter = iter+1;                      % 迭代次数更新
    y_fitness(1,iter) = fzbest;         % 为绘图做准备
    K_p(1,iter) = zbest(1);
    K_i(1,iter) = zbest(2);
    K_d(1,iter) = zbest(3);
end
%% 绘图输出
figure(1)      % 绘制性能指标ITAE的变化曲线
plot(y_fitness,'LineWidth',2)
title('最优个体适应值','fontsize',18);
xlabel('迭代次数','fontsize',18);ylabel('适应值','fontsize',18);
set(gca,'Fontsize',18);

figure(2)      % 绘制PID控制器参数变化曲线
plot(K_p)
hold on
plot(K_i,'k','LineWidth',3)
plot(K_d,'--r')
title('Kp、Ki、Kd 优化曲线','fontsize',18);
xlabel('迭代次数','fontsize',18);ylabel('参数值','fontsize',18);
set(gca,'Fontsize',18);
legend('Kp','Ki','Kd',1);
        其中,MaxIter和MinFit即终止条件;Vmax和Vmin分别为速度的上限和下限;Ub(i)和Lb(i)分别为第i个待优化参数的上限和下限。粒子群的初始化采用与遗传算法相似的方法(用函数rand且保证粒子在上下限范围内),迭代过程采用while进行大循环,速度更新和位置更新按照式 (14-4)和式(14-5)进行(且在迭代 更新过程中,若超出了限值,则将其 设为限制)。

3.3 结果分析

        运行以上代码,得到优化过程如图14-4和图14-5所示,前者为PID控制器3个参数Ki、Kp、Kd的变化曲线,后者为性能指标ITAE的变化曲线。得到的最优控制器参数及性能指标为
Kp= 33.6469,Ki=0.1662, Kd=38.7990, ITAE =1.0580
        将以上参数代回图14-2所示的模型,得到的单位阶跃响应曲线如图14-6所示。由图14-5可知,算法优化过程中,性能指标ITAE不断减小,PSO不断寻找更优的参数。

 

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

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

相关文章

PaaS平台iuap——数智底座支撑企业的全球化业务拓展

数智化转型是全球化企业非常关注的话题&#xff0c;数智化转型过程中suo 面临的问题与挑战也绝非一套简单的产品能够解决的&#xff0c;必须配合组织、人员、目标制度采用达成目标。iuap平台是整个企业数智化转型的底座&#xff0c;形象来说是我们的土壤&#xff0c;在这个土壤…

借助Aspose.BarCode,轻松实现QR和众多二维码在线扫描

Aspose.BarCode for .NET 是一个功能强大的API&#xff0c;可以从任意角度生成和识别多种图像类型的一维和二维条形码。开发人员可以轻松添加条形码生成和识别功能&#xff0c;以及在.NET应用程序中将生成的条形码导出为高质量的图像格式。 Aspose API支持流行文件格式处理&am…

postgresql多行转一列,再转多列

问题&#xff1a;某个单据明细表需要加上两列审批人 已有数据&#xff1a;单据表&#xff0c;审批记录表 实现&#xff1a; select billno ,split_part(string_agg(checkman,,),,,1) checkman1 ,split_part(string_agg(checkman,,),,,2) checkman2 from ods_workflownote GR…

指数对数计算公式基础知识

指数对数实际中也是比较重要的公式

浅谈智能配电系统在水务行业的应用

关注acrelzxz 摘要&#xff1a;在构建智慧水务和“双碳”时代背景下&#xff0c;智能配电系统在水务行业中发挥日益突出的重要作用。本文首先回顾了智能配电系统在水务行业的发展历程&#xff0c;并对其应用现状进行了分析&#xff0c;进而展望了智能配电系统在水务行业的发展…

不要再犯这些错误了!电脑使用误区大揭秘

本文是向大家介绍关于电脑的误区&#xff0c;电脑是较为贵重的一个电子产品&#xff0c;熟练掌握基本的电脑操作技巧应该是每一个人必备技能。在使用技巧之外&#xff0c;有一些误区是需要我们知道并避免的。 误区一&#xff1a;重装系统对电脑损耗极大 重装系统的损耗和玩游戏…

基于java语言编写的爬虫程序

Java语言可以使用Jsoup、HttpClient等库进行网络爬虫开发&#xff0c;其中Jsoup提供了HTML解析和DOM操作的功能&#xff0c;HttpClient则提供了HTTP协议的支持。你可以通过使用这些库&#xff0c;构建网络爬虫程序来爬取指定网站的数据。需要注意的是&#xff0c;应该遵守网站的…

chatgpt赋能python:Python函数未定义:如何解决?

Python函数未定义&#xff1a;如何解决&#xff1f; 在Python编程过程中&#xff0c;我们可能会遇到函数未定义的问题。这种错误会导致代码无法正常运行&#xff0c;对于开发者而言是非常头疼的问题。本文将介绍函数未定义的原因及解决方案&#xff0c;帮助您更好地解决这个问…

电脑文件怎么加密?文件设置密码保护的方法

在使用电脑的过程中&#xff0c;我们可能需要在计算机上保存各种文件&#xff0c;这其中就有十分重要的文件数据&#xff0c;而为了避免数据泄露事件的发生&#xff0c;我们需要使用合理的方法保护它们。文件加密就是最简单且有效的方法。那么电脑文件该怎么加密呢&#xff1f;…

Linux:LNMP的架构与环境配置

Linux&#xff1a;LNMP的架构与环境配置 一、安装 Nginx 服务1.1 安装依赖包1.2 创建运行用户1.3 编译安装1.4 优化路径1.5 添加 Nginx 系统服务 二、安装 MySQL 服务2.1安装Mysql环境依赖包2.2 创建运行用户2.3 编译安装2.4 修改mysql 配置文件2.5 更改mysql安装目录和配置文件…

VMware vCenter Server 8.0U1a 发布 - 集中式管理 vSphere 环境

VMware vCenter Server 8.0U1a 发布 - 集中式管理 vSphere 环境 请访问原文链接&#xff1a;https://sysin.org/blog/vmware-vcenter-8-u1/&#xff0c;查看最新版。原创作品&#xff0c;转载请保留出处。 作者主页&#xff1a;sysin.org 2023-06-01, VMware vSphere 8.0U1a …

ZSTD 解压缩前端处理方案(干货简单)

如果可以实现记得点赞分享&#xff0c;谢谢老铁&#xff5e; 1.需求描述 由于后台返回数据量大&#xff0c;请求资源比较耗时&#xff0c;需要一个方案来优化性能,下图是一个后台返回一个二进制的文件&#xff0c;需要解析成我们想要的对象 2.使用场景 采用ZSTD方案&#…

otter、canal跨服务器数据同步解决方案详解,包括下载、安装、配置、应用过程解读。

1.背景和原理&#xff1a; 阿里巴巴B2B公司&#xff0c;因为业务的特性&#xff0c;卖家主要集中在国内&#xff0c;买家主要集中在国外&#xff0c;所以衍生出了杭州和美国异地机房的需求&#xff0c;同时为了提升用户体验&#xff0c;整个机房的架构为双A&#xff0c;两边均可…

【数据结构】 队列 queque

一、什么是队列 单端队列&#xff1a;一端入队&#xff0c;一端出队 双端队列&#xff1a;两个口都可以进出 先进先出 二、常用操作 1.原理 访问 access&#xff1a;遍历查找某个元素 时间复杂度&#xff1a;O(N) 搜索 search&#xff1a;遍历查找某个元素 时间复杂度&a…

视频美颜sdk是什么?技术解析与实现原理详解

视频美颜技术的发展则为人们提供了一种美化自己的方式&#xff0c;因此&#xff0c;视频美颜技术成为了一个备受关注的领域。在这个领域中&#xff0c;视频美颜sdk技术则是实现高效美颜的关键因素之一。本文将从技术角度分析视频美颜sdk的实现原理和优势。 一、视频美颜技术的…

【十六】设计模式~~~行为型模式~~~策略模式(Java)

5.1. 模式动机 完成一项任务&#xff0c;往往可以有多种不同的方式&#xff0c;每一种方式称为一个策略&#xff0c;我们可以根据环境或者条件的不同选择不同的策略来完成该项任务。在软件开发中也常常遇到类似的情况&#xff0c;实现某一个功能有多个途径&#xff0c;此时可以…

学编程能参加哪些比赛?

孩子学习编程可以参加这10个竞赛: 下面将会根据孩子所学的编程语言来列举孩子可以参加的竞赛: 一、Scratch编程可参加的比赛 1、全国中小学生电脑制作大赛 电脑制作大赛不能完全说是编程比赛,更多讲究艺术与科技结合。 评选项目要求学生使用计算机设计电子报、网页设计、F…

计网作业练习一

第一章练习 简答题 1. 简述计算机网络业务的分类及各类业务的特点。 按网络的作用范围划分&#xff1a; &#xff08;1&#xff09;广域网 WAN&#xff0c;作用范围通常为几十到几千公里&#xff0c;也称为远程网&#xff0c;是 Internet 的核心部分。 &#xff08;2&#x…

冒泡排序(超详细图解加代码解析,5分钟看懂)

目录 1.冒泡排序的定义 2.冒泡排序的原理 3.代码及其解析 4.冒泡排序的改进 5.实现冒泡排序函数 生命中永远会有令人懊恼的事&#xff0c;但我知道&#xff0c;我们是为了不留遗憾活着的&#xff0c;对吗&#xff1f; 1.冒泡排序的定义 冒泡排序&#xff08;Bubble Sort&…

C++的一些点

P52 函数-值传递 值传递时&#xff0c;函数的形参发生改变&#xff0c;不会影响实参。 P54 函数-函数声明 先函数声明&#xff0c;就可以把函数定义放在main函数后面 声明可以写多次&#xff0c;但是定义只能写一次。 #include<iostream> using namespace std;int ma…