[matlab优化算法-18期】基于遗传算法的模糊PID控制优化

遗传算法优化模糊PID控制器:原理与实践

第一节:背景介绍

在现代控制系统中,PID控制器因其结构简单、参数调整方便而被广泛应用。然而,传统PID控制器的参数整定依赖于经验或试错法,难以适应复杂系统的动态变化。模糊控制则通过模糊逻辑处理不确定性信息,具有一定的自适应能力,但其控制规则的优化依赖于专家经验。遗传算法作为一种全局优化算法,模拟生物进化过程,能够有效地搜索最优解。将遗传算法与模糊PID控制器相结合,可以实现模糊控制规则和PID参数的自动优化,提高控制系统的性能。

第二节:模糊PID控制器

2.1 模糊控制器原理

模糊控制器的核心是模糊逻辑推理。它通过模糊化接口将输入的精确值转换为模糊集合,然后根据模糊规则进行推理,最后通过解模糊接口将模糊输出转换为精确控制量。模糊控制器通常采用Mamdani推理机制,其输入输出模糊集合的隶属度函数通常为三角形、高斯型或钟形。

2.2 PID控制器

PID控制器是一种线性控制器,通过比例(P)、积分(I)和微分(D)三个参数的调整来实现对系统的控制。其控制律为: u(t)=Kp​e(t)+Ki​∫e(t)dt+Kd​dtde(t)​ 其中,Kp​、Ki​ 和 Kd​ 分别为比例、积分和微分增益。

2.3 模糊PID控制器

模糊PID控制器结合了模糊控制和PID控制的优点。它通过模糊逻辑调整PID参数,使PID控制器能够更好地适应系统的动态变化。模糊PID控制器的结构通常包括模糊化接口、模糊规则库、模糊推理机和解模糊接口。

第三节:遗传算法

3.1 遗传算法原理

遗传算法是一种模拟生物进化的优化算法,其基本步骤包括编码、适应度评估、选择、交叉和变异。编码是将问题的解表示为染色体的形式,适应度评估是根据目标函数计算每个个体的适应度,选择是根据适应度选择个体进行繁殖,交叉和变异则是通过遗传操作生成新的个体。

3.2 遗传算法的编码方式

常见的编码方式有二进制编码、实数编码和整数编码。在模糊PID控制器的优化中,通常采用整数编码,因为模糊控制规则的变量较多,整数编码更易于实现。

3.3 适应度函数

适应度函数是遗传算法的核心部分,它决定了个体的优劣。在模糊PID控制器的优化中,常用的适应度函数包括ITAE(积分时间绝对误差)和ISE(积分平方误差)。

第四节:基于遗传算法的模糊PID参数优化

4.1 优化流程

基于遗传算法的模糊PID参数优化流程如下:

  1. 初始化种群:随机生成初始种群,每个个体表示一组模糊PID参数。

  2. 适应度评估:计算每个个体的适应度,通常以系统的性能指标(如ITAE)为适应度函数。

  3. 选择操作:根据适应度选择个体进行繁殖,常用的方法有轮盘赌选择法和锦标赛选择法。

  4. 交叉操作:通过交叉操作生成新的个体,常用的交叉方法有单点交叉和多点交叉。

  5. 变异操作:通过变异操作增加种群的多样性,常用的变异方法有均匀变异和高斯变异。

  6. 迭代优化:重复选择、交叉和变异操作,直到满足终止条件(如达到最大迭代次数或适应度收敛)。

4.2 优化目标

优化的目标是找到一组最优的模糊PID参数,使系统的性能指标(如ITAE)最小化。通过遗传算法的全局搜索能力,可以避免陷入局部最优解,从而获得更好的优化结果。

第五节:优化结果分析

5.1 仿真环境

使用MATLAB/Simulink搭建仿真环境,被控对象采用二阶传递函数模型。仿真步长设置为0.01秒,仿真时间为10秒。

5.2 优化结果

通过遗传算法优化后的模糊PID控制器进化曲线如下:

5.3 性能对比

对比优化前后的模糊PID控制器性能,结果如下:

  • 优化前:系统响应时间较长,存在一定的超调,稳态误差较大。

  • 优化后:系统响应时间缩短,超调量减少,稳态误差显著降低。

优化后的模糊PID控制器能够更快地跟踪目标值,且没有明显的超调现象。

5.4 部分代码分享

function fitness=fitness(x)

Ki0=x(1);
Kp0=x(2);

assignin('base','Kp0',Kp0);
assignin('base','Ki0',Ki0);


E1=[-13.33 -10 -6.667];
E2=[-10 -6.667 -3.333];
E3=[-6.667 -3.333 4.441e-16];
E4=[-3.333 -1.11e-16 3.333];
E5=[4.441e-16 3.333 6.667];
E6=[3.333 6.667 10];
E7=[6.667 10 13.33];


EC1=[-13.33 -10 -6.667];
EC2=[-10 -6.667 -3.333];
EC3=[-6.667 -3.333 4.441e-16];
EC4=[-3.333 -1.11e-16 3.333];
EC5=[4.441e-16 3.333 6.667];
EC6=[3.333 6.667 10];
EC7=[6.667 10 13.33];


kp1=[-1.333 -1 -0.6666];
kp2=[-1 -0.6666 -0.3334];
kp3=[-0.6666 -0.3334 0];
kp4=[-0.3334 0 0.3334];
kp5=[0 0.3334 0.6666];
kp6=[0.3334 0.6666 1];
kp7=[0.6666 1 1.334];

ki1=[-1.333 -1 -0.6666];
ki2=[-1 -0.6666 -0.3334];
ki3=[-0.6666 -0.3334 0];
ki4=[-0.3334 0 0.3334];
ki5=[0 0.3334 0.6666];
ki6=[0.3334 0.6666 1];
ki7=[0.6666 1 1.334];

a=newfis('fuzzpid');
a=addvar(a,'input','E',[-10,10]);                        %Parameter E
a=addmf(a,'input',1,'NB','trimf',E1);
a=addmf(a,'input',1,'NM','trimf',E2);
a=addmf(a,'input',1,'NS','trimf',E3);
a=addmf(a,'input',1,'Z','trimf',E4);
a=addmf(a,'input',1,'PS','trimf',E5);
a=addmf(a,'input',1,'PM','trimf',E6);
a=addmf(a,'input',1,'PB','trimf',E7);

a=addvar(a,'input','ec',[-10,10]);                       %Parameter EC
a=addmf(a,'input',2,'NB','trimf',EC1);
a=addmf(a,'input',2,'NM','trimf',EC2);
a=addmf(a,'input',2,'NS','trimf',EC3);
a=addmf(a,'input',2,'Z','trimf',EC4);
a=addmf(a,'input',2,'PS','trimf',EC5);
a=addmf(a,'input',2,'PM','trimf',EC6);
a=addmf(a,'input',2,'PB','trimf',EC7);

a=addvar(a,'output','kp',[-1,1]);                   %Parameter kp
a=addmf(a,'output',1,'NB','trimf',kp1);
a=addmf(a,'output',1,'NM','trimf',kp2);
a=addmf(a,'output',1,'NS','trimf',kp3);
a=addmf(a,'output',1,'Z','trimf',kp4);
a=addmf(a,'output',1,'PS','trimf',kp5);
a=addmf(a,'output',1,'PM','trimf',kp6);
a=addmf(a,'output',1,'PB','trimf',kp7);

a=addvar(a,'output','ki',[-1,1]);             %Parameter ki
a=addmf(a,'output',2,'NB','trimf',ki1);
a=addmf(a,'output',2,'NM','trimf',ki2);
a=addmf(a,'output',2,'NS','trimf',ki3);
a=addmf(a,'output',2,'Z','trimf',ki4);
a=addmf(a,'output',2,'PS','trimf',ki5);
a=addmf(a,'output',2,'PM','trimf',ki6);
a=addmf(a,'output',2,'PB','trimf',ki7);

rulelist=[1, 1, 7 ,0 ,1, 1;
    1, 2, 7 ,0 ,1, 1;
    1, 3, 6 ,0 ,1, 1;
    1 ,4, 6 ,0 ,1, 1;
    1 ,5, 5 ,0 ,1, 1;
    1 ,6, 5 ,0 ,1, 1;
    1 ,7, 4 ,0 ,1, 1;

    2 ,1, 6 ,0 ,1, 1;
    2 ,2, 6 ,0 ,1, 1;
    2 ,3, 5 ,0 ,1, 1;
    2 ,4, 5 ,0 ,1, 1;
    2 ,5, 5 ,0 ,1, 1;
    2 ,6, 4 ,0 ,1, 1;
    2 ,7, 3 ,0 ,1, 1;

    3 ,1, 5 ,0 ,1, 1;
    3 ,2, 5 ,0 ,1, 1;
    3 ,3, 5 ,0 ,1, 1;
    3 ,4, 5 ,0 ,1, 1;
    3 ,5, 5 ,0 ,1, 1;
    3 ,6, 3 ,0 ,1, 1;
    3 ,7, 2 ,0 ,1, 1;

    4 ,1, 7 ,0 ,1, 1;
    4 ,2, 6 ,0 ,1, 1;
    4 ,3, 5 ,0 ,1, 1;
    4 ,4, 4 ,0 ,1, 1;
    4 ,5, 5 ,0 ,1, 1;
    4 ,6, 6 ,0 ,1, 1;
    4 ,7, 7 ,0 ,1, 1;

    5 ,1, 6 ,0 ,1, 1;
    5 ,2, 6 ,0 ,1, 1;
    5 ,3, 6 ,0 , 1,1;
    5 ,4, 5 ,0 ,1, 1;
    5 ,5, 5 ,0 ,1, 1;
    5 ,6, 6 ,0 ,1, 1;
    5 ,7, 6 ,0 ,1, 1;

    6 ,1, 5 ,0 ,1, 1;
    6 ,2, 4 ,0 ,1, 1;
    6 ,3, 3 ,0 ,1, 1;
    6 ,4, 2 ,0 ,1, 1;
    6 ,5, 2 ,0 ,1, 1;
    6 ,6, 2, 0 ,1, 1;
    6 ,7, 1, 0 ,1, 1;
    7 ,1, 5 ,0 ,1, 1;
    7 ,2, 5 ,0 ,1, 1;
    7 ,3, 5, 0 ,1, 1;
    7 ,4, 2, 0 ,1, 1;
    7 ,5, 1, 0 ,1, 1;
    7 ,6, 1, 0 ,1, 1;
    7 ,7, 1, 0 ,1, 1;
    1 ,1, 0 ,7 ,1, 1;
    1 ,2, 0 ,7 ,1, 1;
    1 ,3, 0 ,6 ,1, 1;
    1 ,4, 0 ,6 ,1, 1;
    1 ,5, 0 ,3 ,1, 1;
    1, 6, 0 ,2 ,1, 1;
    1, 7, 0 ,1 ,1, 1;
    2, 1, 0 ,7 ,1, 1;
    2 ,2, 0 ,7 ,1, 1;
    2 ,3, 0 ,6 ,1, 1;
    2 ,4, 0 ,5 ,1, 1;
    2 ,5, 0 ,4 ,1, 1;
    2 ,6, 0 ,3 ,1, 1;
    2 ,7, 0 ,2 ,1, 1;
    3 ,1, 0 ,7 ,1, 1;
    3 ,2, 0 ,7 ,1, 1;
    3 ,3, 0 ,6 ,1, 1;
    3 ,4, 0 ,6 ,1, 1;
    3 ,5, 0 ,5 ,1, 1;
    3 ,6, 0 ,3 ,1, 1;
    3 ,7, 0 ,1 ,1, 1;
    4 ,1, 0 ,7 ,1, 1;
    4 ,2, 0 ,6 ,1, 1;
    4 ,3, 0 ,5 ,1, 1;
    4 ,4, 0 ,5 ,1, 1;
    4 ,5, 0 ,5 ,1, 1;
    4 ,6, 0 ,6 ,1, 1;
    4 ,7, 0 ,7 ,1, 1;
    5 ,1, 0 ,2 ,1, 1;
    5 ,2, 0 ,3 ,1, 1;
    5 ,3, 0 ,4 ,1, 1;
    5 ,4, 0 ,5 ,1, 1;
    5 ,5, 0 ,5 ,1, 1;
    5 ,6, 0 ,6 ,1, 1;
    5 ,7, 0 ,7 ,1, 1;
    6 ,1, 0 ,4 ,1, 1;
    6 ,2, 0 ,4 ,1, 1;
    6 ,3, 0 ,5 ,1, 1;
    6 ,4, 0 ,5 ,1, 1;
    6 ,5, 0 ,6 ,1, 1;
    6 ,6, 0 ,7 ,1, 1;
    6 ,7, 0 ,7 ,1, 1;
    7 ,1, 0 ,1 ,1, 1;
    7 ,2, 0 ,2 ,1, 1;
    7 ,3, 0 ,3 ,1, 1;
    7 ,4, 0 ,6 ,1, 1;
    7 ,5, 0 ,6 ,1, 1;
    7 ,6, 0 ,7 ,1, 1;
    7 ,7, 0 ,7 ,1, 1;];


rulelist(:,5)=x(3:end);
fuzzpid=addrule(a,rulelist);
fuzzpid=setfis(fuzzpid,'DefuzzMethod','centroid');

assignin('base','fuzzpid',fuzzpid);

res=sim('Speed_GA_Fuzzy_PI.slx');

x=res.output.signals.values;
times=res.tout;

%% 稳态误差
target=0.5;
f1=mean(abs(x(end-50:end)-target));
%% 收敛时间
APE_X=abs(x-target)./target;
tx=length(x);
for t=length(x):-1:2
    if APE_X(t)>0.1
        break
    else
        tx=tx-1;
    end
end
f2=times(tx);
if tx==length(x)
    maximum_deviation_x=inf;
else
    maximum_deviation_x=max(abs(x(tx:end)-target));
end

f3=maximum_deviation_x;
w1=0.8;
w2=0.8;
w3=0.4;
fitness=w1*f1+w2*f2+w3*f3;

第六节:总结

本文介绍了遗传算法优化模糊PID控制器的原理和实践。通过遗传算法的全局优化能力,结合模糊控制的灵活性,可以有效地提高模糊PID控制器的性能。优化后的模糊PID控制器在响应速度、超调量和稳态误差等方面均优于优化前的控制器。这种方法特别适合于难以建立精确数学模型的复杂控制系统。未来的研究方向可以包括进一步优化遗传算法的参数设置,以及将该方法应用于其他类型的智能控制系统。

本人擅长各类优化模型的建模和求解,具有近400个优化项目的建模仿真经验,擅长模型构建,算法设计,算法实现和算法改进。累计指导各类建模/算法比赛和SCI写作超过100人次。
本人长期提供: ①源码分享(近1000个本人手写项目) ②辅导答疑(远程桌面一对一语音+文档指导,可以录屏反复观看)
③项目定制(根据您的现实问题,针对性建模求解,提供完整方案+代码实现)
长期在线,欢迎咨询,一般晚上看消息!!

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Kotlin Lambda

Kotlin Lambda 在探索Kotlin Lambda之前,我们先回顾下Java中的Lambda表达式,Java 的 Lambda 表达式是 Java 8 引入的一项强大的功能,它使得函数式编程风格的代码更加简洁和易于理解。Lambda 表达式允许你以一种更简洁的方式表示实现接口&…

实现pytorch注意力机制-one demo

主要组成部分: 1. 定义注意力层: 定义一个Attention_Layer类,接受两个参数:hidden_dim(隐藏层维度)和is_bi_rnn(是否是双向RNN)。 2. 定义前向传播: 定义了注意力层的…

【Prometheus】prometheus结合domain_exporter实现域名监控

✨✨ 欢迎大家来到景天科技苑✨✨ 🎈🎈 养成好习惯,先赞后看哦~🎈🎈 🏆 作者简介:景天科技苑 🏆《头衔》:大厂架构师,华为云开发者社区专家博主,阿里云开发者社区专家博主,CSDN全栈领域优质创作者,掘金优秀博主,51CTO博客专家等。 🏆《博客》:Python全…

基于Java+Springboot+MySQL企业公司网站系统设计与实现

博主介绍:黄菊华老师《Vue.js入门与商城开发实战》《微信小程序商城开发》图书作者,CSDN博客专家,在线教育专家,CSDN钻石讲师;专注大学生毕业设计教育、辅导。 所有项目都配有从入门到精通的基础知识视频课程&#xff…

SQL复习

SQL复习 MySQL SQL介绍 SQL SQL的全拼是什么? SQL全拼:Structured Query Language,也叫结构化查询语言。 SQL92和SQL99有什么区别呢? SQL92和SQL99分别代表了92年和99年颁布的SQL标准。 在 SQL92 中采用(&#xff…

从入门到精通:Postman 实用指南

Postman 是一款超棒的 API 开发工具,能用来测试、调试和管理 API,大大提升开发效率。下面就给大家详细讲讲它的安装、使用方法,再分享些实用技巧。 一、安装 Postman 你能在 Postman 官网(https://www.postman.com )下…

零基础学QT、C++(一)安装QT

目录 如何快速学习QT、C呢? 一、编译器、项目构建工具 1、编译器(介绍2款) 2、项目构建工具 二、安装QT 1、下载QT安装包 2、运行安装包 3、运行QT creator 4、导入开源项目 总结 闲谈 如何快速学习QT、C呢? 那就是项目驱动法&…

【Zookeeper如何实现分布式锁?】

Zookeeper如何实现分布式锁? 一、ZooKeeper分布式锁的实现原理二、ZooKeeper分布式锁的实现流程三、示例代码四、总结一、ZooKeeper分布式锁的实现原理 ZooKeeper是一个开源的分布式协调服务,它提供了一个分布式文件系统的接口,可以用来存储和管理分布式系统的配置信息。 …

2D 游戏艺术、动画和光照

原文:https://unity.com/resources/2d-game-art-animation-lighting-for-artists-ebook 笔记 用Tilemap瓷砖大小为1单元,人物大小在0.5~2单元 PPU :单位像素 pixels per unit 2160 4K分辨率/ 正交相机size*2 完整屏幕显示像素点 有骨骼动…

Office word打开加载比较慢处理方法

1.添加safe参数 ,找到word启动项,右击word,选择属性 , 添加/safe , 应用并确定 2.取消加载项,点击文件,点击选项 ,点击加载项,点击转到,取消所有勾选,确定。

docker 运行 芋道微服务

jar包打包命令 mvn clean install package -Dmaven.test.skiptrue创建文件夹 docker-ai 文件夹下放入需要jar包的文件夹及 docker-compose.yml 文件 docker-compose.yml 内容:我这里的是ai服务,所以将原先的文件内容做了变更,你们需要用到什…

软件定义汽车时代的功能安全和信息安全

我是穿拖鞋的汉子,魔都中坚持长期主义的汽车电子工程师。 老规矩,分享一段喜欢的文字,避免自己成为高知识低文化的工程师: 简单,单纯,喜欢独处,独来独往,不易合同频过着接地气的生活…

ZYNQ TCP Server PS端千兆网口速率低问题,要修改BSP中LWIP配置参数

用VITIS教程里面 TCP UDP应用工程例程 打算测试PS端千兆网口速率。ZYNQ核心板用黑金的,外部板子自画的网口电路和其它电路。TCP SERVER时 iperf测试速率 只有60~70Mbit/s?然后用UDP SERVER方式,发现能达到 950Mbit/s??…

《深度学习》——调整学习率和保存使用最优模型

调整学习率 在使用 PyTorch 进行深度学习训练时,调整学习率是一个重要的技巧,合适的学习率调整策略可以帮助模型更好地收敛。 PyTorch 提供了多种调整学习率的方法,下面将详细介绍几种常见的学习率调整策略及实例代码: torch.opt…

RocketMQ和Kafka如何实现顺序写入和顺序消费?

0 前言 先说明kafka,顺序写入和消费是Kafka的重要特性,但需要正确的配置和使用方式才能保证。本文需要解释清楚Kafka如何通过分区来实现顺序性,以及生产者和消费者应该如何配合。   首先,顺序写入。Kafka的消息是按分区追加写入…

场外个股期权下单后多久成交?场外个股期权对投资组合的影响

对普通老板们而言,它如同精密手术刀——用得好可精准优化投资组合,用不好则可能伤及本金。记住两个关键:一是永远用"亏得起的钱"参与,二是把合约条款当"药品说明书"逐字研读。 场外个股期权下单后多久成交&am…

Android13-包安装器PackageInstaller-之apk安装流程

目的 我们最终是为了搞明白安装的整个流程通过安卓系统自带的包安装器来了解PMS 安装流程实现需求定制:静默安装-安装界面定制-安装拦截验证。【核心目的】 安装流程和PMS了解不用多说了; 安装定制相关: 如 手机上安装时候弹出锁屏界面需要输入密码;安…

UART(一)——UART基础

一、定义 UART(Universal Asynchronous Receiver/Transmitter)是一种广泛使用的串行通信协议,用于在设备间通过异步方式传输数据。它无需共享时钟信号,而是依赖双方预先约定的参数(如波特率)完成通信。 功能和特点 基本的 UART 系统只需三个信号即可提供稳健的中速全双工…

mysql 学习16 视图,存储过程,存储函数,触发器

视图, 视图是一张虚拟存在的表,以方便我们查询。 创建视图 如下的语句中,我们将select 后的数据,作为一个视图 , 视图名字为view_tb_user_1 create or replace view view_tb_user_1 as select tb_user.name,tb_user.a…

大疆无人机需要的kml文件如何制作kml导出(大疆KML文件)

大疆无人机需要的轨迹kml文件,是一种专门的格式,这个kml里面只有轨迹点,其它的属性信息都不需要。 BigemapPro提供了专门的大疆格式输出, 软件这里下载 www.bigemap.com 安装后,kml导入如下图: 然后选择…