PID模糊控制算法(附MATLAB仿真程序)

一、基本原理

PID模糊控制算法是一种将传统PID控制与模糊逻辑相结合的控制策略。它利用模糊逻辑处理不确定性和非线性问题的能力,以提高控制系统的性能。以下是PID模糊控制算法的基本原理:

1.1. **误差和误差变化率的计算**:
   - 首先,PID控制器需要计算系统的误差(e)和误差的变化率(Δe)。误差是期望输出与实际输出之间的差异,而误差变化率是误差随时间的变化。

1.2. **模糊化处理**:
   - 将误差和误差变化率这两个精确的数值转换为模糊集合中的隶属度。这一步骤称为模糊化,它将连续的输入值映射到模糊集合中的隶属函数上,通常使用三角形或梯形隶属函数。

1.3. **模糊规则库**:
   - 模糊规则库包含了一系列的if-then规则,这些规则定义了输入(误差和误差变化率)与输出(控制动作)之间的关系。例如,如果误差大且误差变化率小,则增加控制力度。

1.4. **模糊推理**:
   - 根据模糊规则库和模糊化的输入,进行模糊推理过程,以确定控制动作的模糊集合。这一过程通常使用最大-最小合成或乘积-最大合成等推理方法。

1.5. **去模糊化处理**:
   - 将模糊控制动作转换回精确的数值,以便用于实际的控制。去模糊化常用的方法包括质心法(centroid method)或最大隶属度法(maximum membership method)。

1.6. **PID参数的调整**:
   - 在PID模糊控制中,模糊控制的输出用于调整PID控制器的参数(比例P、积分I、微分D)。这些参数可以根据模糊控制的输出进行动态调整,以适应系统的变化。

1.7. **控制执行**:
   - 最后,调整后的PID参数被用于计算控制信号,该信号被发送到被控对象,以减少误差并实现期望的系统行为。

PID模糊控制算法的优点在于它能够处理复杂的非线性系统和不确定性,提高系统的鲁棒性和适应性。通过模糊逻辑的引入,可以减少对精确数学模型的依赖,使得控制系统更加灵活和有效。

二、公式推导

模糊PID控制算法的公式推导涉及到模糊逻辑的基本概念和PID控制理论的结合。以下是模糊PID控制算法的基本步骤和公式推导:

2.1. **误差和误差变化率的计算**:
   - 误差 e 是期望输出与实际输出之间的差异。
   - 误差变化率 \Delta e是误差随时间的变化,即\Delta e=e\left ( k \right )-e\left ( k-1 \right )

2.2. **模糊化处理**:
   - 将误差 e和误差变化率\Delta e 转换为模糊集合中的隶属度。这通常通过定义隶属函数来实现,例如,使用三角形或梯形隶属函数。
   - 论域的确定:假设误差e 和误差变化率\Delta e 的论域范围为[-3, 3],并将其划分为若干模糊集合,如NB(负大)、NM(负中)、NS(负小)、ZO(零)、PS(正小)、PM(正中)、PB(正大)。

2.3. **模糊规则库**:
   - 模糊规则库包含了一系列的if-then规则,这些规则定义了输入(误差和误差变化率)与输出(控制动作)之间的关系。例如,如果误差大且误差变化率小,则增加控制力度。

2.4. **模糊推理**:
   - 根据模糊规则库和模糊化的输入,进行模糊推理过程,以确定控制动作的模糊集合。这一过程通常使用最大-最小合成或乘积-最大合成等推理方法。

2.5. **去模糊化处理**:
   - 将模糊控制动作转换回精确的数值,以便用于实际的控制。去模糊化常用的方法包括质心法(centroid method)或最大隶属度法(maximum membership method)。

2.6. **PID参数的调整**:
   - 模糊控制的输出用于调整PID控制器的参数(比例P、积分I、微分D)。这些参数可以根据模糊控制的输出进行动态调整,以适应系统的变化。

2.7. **控制执行**:
   - 最后,调整后的PID参数被用于计算控制信号,该信号被发送到被控对象,以减少误差并实现期望的系统行为。

具体的公式推导如下:

e\Delta e分别为误差和误差变化率的量化值,K_{p}K_{i}K_{d}为PID的三个参数,\Delta K_{p}\Delta K_{i}\Delta K_{d}为根据模糊推理得到的参数增量。则有:

其中,\Delta K_{p}\Delta K_{i}\Delta K_{d}可以通过模糊推理和去模糊化过程得到。例如,使用质心法进行去模糊化时,参数增量可以表示为:

这里,\mu _{i}是模糊集合 i的隶属度,c_{i} 是对应的控制规则输出。

最终,控制信号u 可以通过调整后的PID参数计算得到:

这里的\Delta t 是采样时间间隔。

以上是模糊PID控制算法的基本公式推导,具体的实现可能会根据模糊规则库和隶属度函数的定义有所不同。


三、MATLAB仿真

步骤一:以下是一个基于MATLAB的PID模糊控制算法的仿真程序示例:

% 定义采样时间
ts = 0.1;  % 建立被控对象传递函数
sys = tf(4.23,[1,1.64,8.46],'ioDelay',3); 
dsys = c2d(sys,ts,'z') ; % 离散化% 获取差分方程的分子和分母
[num,den] = tfdata(dsys,'v');% 初始化参数
x = [0,0,0]'; % 初始状态 [e(k), e(k-1), ∫e(k)]
e_1 = 0; % 上一次误差
ec_1 = 0; % 上一次误差变化率
kp0 = 0.35; % 初始比例参数
ki0 = 0.35; % 初始积分参数
kd0 = 1; % 初始微分参数% 加载模糊控制器
a = readfis('fuzzpid'); % 假设fuzzpid.fis是之前创建的模糊控制器文件% 初始化控制序列
u = zeros(1,32); % 控制序列初始化为0% 仿真时间
for k = 1:1:3000r(k) = 1; % 单位阶跃输入% 使用模糊推理调整PID参数k_pid = evalfis([e_1, ec_1], a);kp(k) = kp0 + k_pid(1);ki(k) = ki0 + k_pid(2);kd(k) = kd0 + k_pid(3);% 系统响应输出序列y(k+2) = -1*den(3)*y(k-2+2) - 1*den(2)*y(k-1+2) + num(2)*u(k-31+32) + num(3)*u(k-32+32);% 计算误差e(k) = r(k) - y(k+2);% 计算控制量u(k+32) = kp(k)*x(1) + kd(k)*x(2) + ki(k)*x(3);% 更新状态x(1) = e(k); % 计算Px(2) = e(k) - e_1; % 计算Dx(3) = x(3) + e(k)*ts; % 计算Iec_1 = x(2);e_1 = e(k);
end% 绘制结果
figure(1);
plot(time,r,'b',time,y(3:3002),'r');
xlim([0,300]);ylim([0,1.2]);grid on;
xlabel('time(s)');ylabel('rin,yout');figure(2);
plot(time,e,'r');
xlabel('time(s)');ylabel('error');figure(3);
plot(time,u(33:3032),'r');
xlabel('time(s)');ylabel('u');figure(4);
plot(time,kp,'r');
xlabel('time(s)');ylabel('kp');figure(5);
plot(time,ki,'r');
xlabel('time(s)');ylabel('ki');figure(6);
plot(time,kd,'r');
xlabel('time(s)');ylabel('kd');

这段代码首先定义了被控对象的传递函数,并对其进行了离散化处理。然后,初始化了PID参数和模糊控制器。在仿真循环中,使用模糊控制器调整PID参数,并计算系统的响应。最后,绘制了系统的输出、误差、控制量以及PID参数随时间的变化。请注意,这段代码需要您事先创建好模糊控制器文件fuzzpid.fis,并且根据您的具体问题调整参数和模型。

步骤二:创建好模糊控制器文件fuzzpid.fis

在MATLAB中创建模糊控制器文件 fuzzpid.fis 需要使用MATLAB的模糊逻辑工具箱。以下是创建一个简单的模糊PID控制器的步骤:

  1. 打开模糊逻辑设计器: 在MATLAB命令窗口中输入 fuzzy,这将打开模糊逻辑设计器。

  2. 创建新的模糊推理系统: 在模糊逻辑设计器中,选择“新建”来创建一个新的模糊推理系统。你可以选择“基于规则的系统”或“基于Mamdani的系统”。

  3. 定义输入和输出变量: 对于PID控制器,通常有两个输入变量(误差e和误差变化率ce)和三个输出变量(调整后的Kp、Ki、Kd)。你需要为这些变量定义适当的范围和隶属函数。

    • 误差e:可以定义为 [-100, 100],隶属函数可以是 "负大"、"负中"、"负小"、"零"、"正小"、"正中"、"正大"。
    • 误差变化率ce:可以定义为 [-100, 100],隶属函数同上。
    • Kp、Ki、Kd:可以定义为 [0, 2],隶属函数可以是 "零"、"小"、"中"、"大"。
  4. 添加模糊规则: 根据你的控制策略添加模糊规则。例如,如果误差很大且误差变化率很小,那么可能需要增加Kp和Kd。

  5. 生成M文件: 在模糊逻辑设计器中,选择“文件”->“生成M文件”,这将生成一个MATLAB函数,该函数可以用于仿真和控制。

  6. 保存模糊推理系统: 保存你的模糊推理系统为 fuzzpid.fis 文件。

以下是一个简单的示例代码,展示了如何在MATLAB中创建模糊控制器:

% 创建一个新的模糊推理系统
fis = newfis('fuzzpid', 'mamdani', 'min', 'max', 'min', 'max', 'centroid');% 添加输入变量
fis = addvar(fis, 'input', 'e', [-100 100]);
fis = addvar(fis, 'input', 'ce', [-100 100]);% 添加输出变量
fis = addvar(fis, 'output', 'Kp', [0 2]);
fis = addvar(fis, 'output', 'Ki', [0 2]);
fis = addvar(fis, 'output', 'Kd', [0 2]);% 为输入和输出变量添加隶属函数
fis = addmf(fis, 'input', 1, 'nb', 'gaussmf', [-100 -100 100]);
fis = addmf(fis, 'input', 1, 'nm', 'gaussmf', [-50 -50 100]);
fis = addmf(fis, 'input', 1, 'ns', 'gaussmf', [-10 -10 100]);
fis = addmf(fis, 'input', 1, 'ze', 'gaussmf', [0 0 100]);
fis = addmf(fis, 'input', 1, 'ps', 'gaussmf', [10 10 100]);
fis = addmf(fis, 'input', 1, 'pm', 'gaussmf', [50 50 100]);
fis = addmf(fis, 'input', 1, 'pb', 'gaussmf', [100 100 100]);% 为输出变量添加隶属函数
fis = addmf(fis, 'output', 1, 'z', 'gaussmf', [0.5 0.5 0.5]);
fis = addmf(fis, 'output', 1, 's', 'gaussmf', [1 1 1]);
fis = addmf(fis, 'output', 1, 'm', 'gaussmf', [1.5 1.5 1]);% 添加模糊规则
rule1 = "If e is nb and ce is nb then Kp is z and Ki is z and Kd is z";
rule2 = "If e is pb and ce is ze then Kp is m and Ki is s and Kd is s";
fis = addrule(fis, [rule1, rule2]);% 保存模糊推理系统
savefis(fis, 'fuzzpid.fis');

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【leetcode100】螺旋矩阵

1、题目描述 给你一个 m 行 n 列的矩阵 matrix ,请按照 顺时针螺旋顺序 ,返回矩阵中的所有元素。 示例 1: 输入:matrix [[1,2,3],[4,5,6],[7,8,9]] 输出:[1,2,3,6,9,8,7,4,5] 2、初始思路 2.1 思路 定义上下左右…

2024.11.29(单链表)

思维导图 声明文件 #ifndef __LINKLIST_H__ #define __LINKLIST_H__#include <myhead.h>typedef char datatype; //数据元素类型 //定义节点类型 typedef struct Node {union{int len; //头节点数据域datatype data; //普通节点数据域};struct Node *next; //指针域…

第六届金盾信安杯-SSRF

操作内容&#xff1a; 进入环境 可以查询网站信息 查询环境url https://114.55.67.167:52263/flag.php 返回 flag 就在这 https://114.55.67.167:52263/flag.php 把这个转换成短连接&#xff0c;然后再提交 得出 flag

【Linux】进程控制,手搓简洁版shell

⭐️个人主页&#xff1a;小羊 ⭐️所属专栏&#xff1a;Linux 很荣幸您能阅读我的文章&#xff0c;诚请评论指点&#xff0c;欢迎欢迎 ~ 目录 1、进程创建2、进程终止3、进程等待4、进程程序替换5、手写简洁版shell 1、进程创建 fork函数&#xff1a;从已经存在的进程中创…

逆向攻防世界CTF系列42-reverse_re3

逆向攻防世界CTF系列42-reverse_re3 参考&#xff1a;CTF-reverse-reverse_re3&#xff08;全网最详细wp&#xff0c;超4000字有效解析&#xff09;_ctfreverse题目-CSDN博客 64位无壳 _int64 __fastcall main(__int64 a1, char **a2, char **a3) {int v4; // [rsp4h] [rbp-…

安装 RabbitMQ 服务

安装 RabbitMQ 服务 一. RabbitMQ 需要依赖 Erlang/OTP 环境 (1) 先去 RabbitMQ 官网&#xff0c;查看 RabbitMQ 需要的 Erlang 支持&#xff1a;https://www.rabbitmq.com/ 进入官网&#xff0c;在 Docs -> Install and Upgrade -> Erlang Version Requirements (2) …

ECharts柱状图-交错正负轴标签,附视频讲解与代码下载

引言&#xff1a; 在数据可视化的世界里&#xff0c;ECharts凭借其丰富的图表类型和强大的配置能力&#xff0c;成为了众多开发者的首选。今天&#xff0c;我将带大家一起实现一个柱状图图表&#xff0c;通过该图表我们可以直观地展示和分析数据。此外&#xff0c;我还将提供…

Scala关于成绩的常规操作

score.txt中的数据&#xff1a; 姓名&#xff0c;语文&#xff0c;数学&#xff0c;英语 张伟&#xff0c;87&#xff0c;92&#xff0c;88 李娜&#xff0c;90&#xff0c;85&#xff0c;95 王强&#xff0c;78&#xff0c;90&#xff0c;82 赵敏&#xff0c;92&#xff0c;8…

【机器学习】入门机器学习:从理论到代码实践

我的个人主页 我的领域&#xff1a;人工智能篇&#xff0c;希望能帮助到大家&#xff01;&#xff01;&#xff01;点赞❤ 收藏❤ 机器学习&#xff08;Machine Learning&#xff09;是人工智能的一个分支&#xff0c;它通过算法从数据中学习规律&#xff0c;并基于这些规律进行…

Spring Web开发(请求)获取JOSN对象| 获取数据(Header)

大家好&#xff0c;我叫小帅今天我们来继续Spring Boot的内容。 文章目录 1. 获取JSON对象2. 获取URL中参数PathVariable3.上传⽂件RequestPart3. 获取Cookie/Session3.1 获取和设置Cookie3.1.1传统获取Cookie3.1.2简洁获取Cookie 3. 2 获取和存储Session3.2.1获取Session&…

[Deep Learning] 深度学习中常用函数的整理与介绍(pytorch为例)

文章目录 深度学习中常用函数的整理与介绍常见损失函数1. L2_loss | nn.MSELoss()公式表示&#xff1a;特点&#xff1a;应用&#xff1a;缺点&#xff1a;主要参数&#xff1a;示例用法&#xff1a;注意事项&#xff1a; 2. L1 Loss | nn.L1Loss数学定义&#xff1a;特点&…

0017. shell命令--tac

目录 17. shell命令--tac 功能说明 语法格式 选项说明 实践操作 注意事项 17. shell命令--tac 功能说明 Linux 的 tac 命令用于按行反向输出文件内容&#xff0c;与 cat 命令的输出顺序相反。非常有趣&#xff0c;好记。也就是说&#xff0c;当我们使用tac命令查看文件内…

SpringBoot整合Retry详细教程

问题背景 在现代的分布式系统中&#xff0c;服务间的调用往往需要处理各种网络异常、超时等问题。重试机制是一种常见的解决策略&#xff0c;它允许应用程序在网络故障或临时性错误后自动重新尝试失败的操作。Spring Boot 提供了灵活的方式来集成重试机制&#xff0c;这可以通过…

爬取boss直聘上海市人工智能招聘信息+LDA主题建模

爬取boss直聘上海市人工智能招聘信息 import time import tqdm import random import requests import json import pandas as pd import os from selenium import webdriver from selenium.webdriver.common.by import By from selenium.webdriver.support.ui import WebDriv…

项目快过:知识蒸馏 | 目标检测 |FGD | Focal and Global Knowledge Distillation for Detectors

公开时间&#xff1a;2022年3月9号 项目地址&#xff1a;https://github.com/yzd-v/FGD 论文地址&#xff1a;https://arxiv.org/pdf/2111.11837 知识蒸馏已成功地应用于图像分类。然而&#xff0c;目标检测要复杂得多&#xff0c;大多数知识蒸馏方法都失败了。本文指出&#…

【Linux】匿名管道通信场景——进程池

&#x1f525; 个人主页&#xff1a;大耳朵土土垚 &#x1f525; 所属专栏&#xff1a;Linux系统编程 这里将会不定期更新有关Linux的内容&#xff0c;欢迎大家点赞&#xff0c;收藏&#xff0c;评论&#x1f973;&#x1f973;&#x1f389;&#x1f389;&#x1f389; 文章目…

Sybase数据恢复—Sybase数据库无法启动,Sybase Central连接报错的处理案例

Sybase数据库数据恢复环境&#xff1a; Sybase数据库版本&#xff1a;SQL Anywhere 8.0。 Sybase数据库故障&分析&#xff1a; Sybase数据库无法启动。 错误提示&#xff1a; 使用Sybase Central连接报错。 数据库数据恢复工程师经过检测&#xff0c;发现Sybase数据库出现…

分布式FastDFS存储的同步方式

目录 一&#xff1a;FatsDFS的结构图 二&#xff1a;FatsDFS文件同步 前言&#xff1a; 1&#xff1a;同步日志所在目录 2&#xff1a;binlog格式 3&#xff1a;同步规则 4&#xff1a;binlog同步过程 1 &#xff1a;获取组内的其他Storage信息 tracker_report_thread_e…

【绘图】数据可视化(python)

对于数据绝对值差异较大&#xff08;数据离散&#xff09; 1. 对数坐标直方图&#xff08;Histogram with Log Scale&#xff09; import pandas as pd import matplotlib.pyplot as plt import numpy as np# 示例数据 data {count: [10, 20, 55, 90, 15, 5, 45, 80, 1000, …

使用Dify与BGE-M3搭建RAG(检索增强生成)应用-改进一,使用工作流代替Agnet

文章目录 前言Agent vs 工作流编写工作流 前言 在上一篇中&#xff0c;我们实现了一个基本的基于Dify的RAG的示范。 使用Dify与BGE-M3搭建RAG&#xff08;检索增强生成&#xff09;应用 这个效果确实很差。 我们一起来看看&#xff0c;该怎么改进。 今天我们就尝试一下&…