【simulink】模糊PID控制器
1. 输入的e跟ec在哪
e其实很好理解,输入-输出就是我们的误差,也就是开头的sum,那么误差变化率ec呢
Unit Delay(单位延迟模块)

先来看这部分,输出跟输入做差,得到e,这里e分了四路,先看下面两路,一路直接进行sum准备运算,另外一路经过了UD模块,下面介绍一下这个模块
作用:将输入的误差信号\(e(t)\)延迟一个时间步长,输出前一刻的误差\(e(t-1)\)

sum(求和模块,此处做减法)
- 输入: 当前误差\[e(t)\]和延迟后的误差\[e(t-1)\]
- 输出:\[e(t)-e(t-1)\],即误差的变化量△e
这一步是在干啥
计算误差变化率ec:
通过\[e(t)−e(t−1)\],得到误差在单位时间内的变化量(离散系统的微分近似)。
- 物理意义:若 ec>0,误差正在增大;若 ec<0,误差正在减小。
为微分控制(D项)提供输入: 该变化量 ec 会乘以微分系数 *K**d*,生成PID中的微分控制量,用于抑制系统震荡和超调。
2. 准备输入到模糊控制器了

前面我们得到了e跟ec了,然后进入Mux模块
Mux模块(多路复用器)
- 输入: 指有两路独立的输入信号(e跟ec)
- 输出:Mux将两路信号合并为一个向量信号(如[e,ec])
- 物理表现:看似输出是“一路”,但实际上传输的是包含两个分量的数据
- 必要性:模糊控制器的规则库需要同时基于
e
和ec
的状态(例如“误差大且快速增大”),必须将两者合并为统一输入。

Gain(增益模块)
量化因子
3. 模糊控制
3.1 在matlab命令行中输入fuzzy
就打开了下图这玩意

3.2 确定模糊控制工具箱的输入输出
- 输入
- e:实际值与给定值的误差
- ec:为e的导数
- 输出
- △Kp
- △Ki
点一下框选中,然后下侧name改名

最后长这样,就是明确了输入输出
3.3 确定隶属度函数(输入输出都要) 目的:为了模糊化和解模糊
隶属度函数在哪写、
双击 输入/输出,就弹出来新的窗口
一般是用中间三角形隶属函数,两边高斯型隶属函数
这四个圈起来的分别是:
rang
设置输入、输出的边界,下面是个例子,定义输入输出的论域和隶属函数如下图:
一共七个等级,论域是【-3,3】
Name
没看懂啥意义,但是是这么说的:
这里我们要严格按照 matlab 初始的时候给我们的顺序来从左到右定义我们的等级,这样子后面写模糊规则会方便很多。
哦~大概就是按规定的等级,从左到右改名
type
图中圈起来的就是三角跟高斯
Params
三角函数这里的参数有仨数,分别代表了图中的仨实圈,,这里的参数是说的x轴
我们之前选了7个等级吧,那如何产生7个哩
在这一节中,最终得到的隶属函数图如下
3.4 确定模糊规则
这个表应该是写错了吧?,△ki的PM PB应该是PB,还有最后,PB+NS,kp没有ns直接就nm了,可以改成ns试试
3.5 在simulink中实现
关掉保存,取好名字
在simulink中,打开下图的模块

4. 模糊控制器的输出

看上去输出的是三维的[△Kp,△Ki, △Kd]
Demux(多路分解器)

有归一化就得有解归一化,有mux就有demux
- 功能:将一个输入信号拆分为多个独立的输出信号
- 输入:一个信号
- 输出:多路独立信号
这后面的gain
应该就是比例因子了,在经过sum
,就完成了
\[
Kp=Kp+△Kp
\]
5.The End

这里已经是看图说话了,首先还是认识模块
Product(乘法器)

Add(加法器)

所以这里的最终输出也就是pid控制器的那个公式: \[ u(t) = K_p \cdot e + K_s \cdot \int e \, dt + K_d \cdot \frac{de}{dt} \]