模糊PID控制器

前言:经典PID控制器的参数需要人工整定且是定参数,那么聪明的工程师们就想到了自动调整参数的PID控制器,其中使用模糊控制的方式调整参数就是本文中讨论的模糊PID

Why Fuzzy PID controller?

在自动控制领域,PID控制器就是爹一般的存在,基本现在市面上过半的控制系统都能看到它。在之前的一篇文章中已经深入剖析了PID控制器的原理,知道了PID确实可以(粗糙的)解决大部分的需求,但是难免还是存在人工调参麻烦的问题,而且最最最主要的问题就是固定参数的话系统的情况变了效果也变了。


以汽车控制来举例
🚗🚗🚗🚗🚗🚗🚗

如果我们就是用的PID控制器,人工整定好了一套非常完美的参数;但是这时候问题来了,车上的乘客是会变的,比如聚会的时候多了两个搭顺风车的朋友,那么我们很容易想到这时候车的整体质量变重了(惯性变大),原本控制器的P参数不足以让汽车在短时间内快速起步了


显然最好的方法,就是随着系统的改变,PID控制器的参数也作出相应的调整。目前自动调节PID参数的算法有时下火爆的神经网络法,以及今天我们讨论的模糊控制法等

What is Fuzzy

根据上面的描述,我们已经可以很容易画出这样一个控制框图

FZPID

用最简单的描述就是,在原本的PID闭环控制系统中,加入了一个调整参数的东西。而在本文中,我们把模块控制器选作这个自动调整器,就是模糊PID了

那么图中的模糊控制器是个什么东西呢?简单来说,就是初中老师教的分类讨论,并没有多高深。从字面意思上去理解“模糊”的概念,就是“差不多”,举个例子:我们站在一个地平面上测量太阳的角度,以中午为0°原点,则太阳升起和下山则分别是±90°角(这就是测量数据范围);这时有同学打电话问你太阳角度,你报个+60°;然后老妈又打电话过来,你说60°她可能直接把你锤了!所以一般会说“挺小的”,这就是模糊估计。把太阳角度进行模糊化上报给老妈就是:

角度 隶属区间
+75°~90° 太阳刚刚升起
+45°~+75° 正的,角度很大
+15°~+45° 正的,角度挺小
-15°~+15° 在中间位置呢
-45°~-15° 负的,角度挺小
-75°~-45° 负的,角度很大
-90°~-75° 太阳马上下山了

模糊PID控制器数学表达

经过上面的例子,相信读者已经了解了模糊的概念,接下来使用数学工具进行严谨滴表示

先复习一下PID的基本数学表示:

$$
u(t) = K_p e(t)+K_i \int e(\tau) d\tau + K_d \frac{de(t)}{dt}
$$

为了方便讲解,同时给出模糊PID控制的demo框图:

FZPID-simulink

一般如上图,模糊控制器的输入有两个数据:误差值和误差变化速度(连续情况是微分值,离散情况是差值)

$$
e_d = \dot{e} = \frac{de}{dt}
$$

在模糊控制系统中,模糊控制器作用就是对这两个量进行:

  1. 模糊化:判断该输入所属的集合并计算出对应的隶属度。计算隶属度的方法有很多,最常用的是使用三角形隶属度函数或梯形隶属度函数等来计算获得
  2. 查规则库:把计算出的隶属度对应的参数从库中以查表等方法提取出
  3. 推理:模拟人的推理决策的思想方法,在一定的输入条件下激活相应的控制规则给出适当的模糊控制输出

可以使用matlab的fuzzy工具箱设计模糊控制器:fuzzy

则对于上给出系统,对两个输入设计模糊子集为:

$$
e,e_d = [ NB,NM,NS,ZO,PS,PM,PB ]
$$

依次表示

子集 NB NM NS ZO PS PM PB
意义 负大 负中 负小 零位 正小 正中 正大

当然,每个子集对应一个区间,在模糊化过程中,为了提高端点抗噪性,NB和PB集选择高斯函数,而其他选择三角形隶属度函数:

$$
NB = \begin{cases}
1, & e,e_d<-3 \\
A\cdot\frac{1}{\sqrt{2\pi} \sigma} e^{-\frac{(x+3)^2}{2\sigma^2}},& -3 \le e,e_d
\end{cases} \\
NM = \begin{cases}
0 , & e,e_d < -3 \\
e-3, & -3 \le e,e_d < -2 \\
-0.5e, & -2 \le e,e_d <0 \\
0, & 0\le e,e_d
\end{cases}
\\
NS = \cdots
\\ \vdots
$$

公式上的表达并不直观,在matlab中用GUI设计输入隶属度函数:

fuzzy-func

上图中所有子集线组成的上边界线,就是输入相对应的子集。每个隶属度函数都可以按系统特性任意选择为高斯型、三角型、升余弦型等

当算出了两个输入对应的子集后,就可以查规则库来知道如何调整系统,对于本文讨论的PID控制器,有如下规则:

  • P
    Prule
  • I
    Irule
  • D
    Drule

该表可以直接在上面打开的fuzzy工具箱面板上双击中间的白色规则库,然后输入。如果是代码实现,直接if-else就完事了

两个输入和一个输出组成了一个二维表。其中,输入分别为两个索引坐标轴,输出为表中的数据。注意,查表得到的是三个参数的变化值,即:

$$
\Delta K_p,\Delta K_i,\Delta K_d = [ NB,NM,NS,ZO,PS,PM,PB ]
$$

以上就是demo框图中的fuzzy controller做的工作。在最后,我们需要对PID控制器的参数进行相应调整:

$$
K_p = A_p\int \Delta K_p \\
K_i = A_i\int \Delta K_i \\
K_d = A_d\int \Delta K_d
$$

框图中以连续形式表示就是积分,而当我们在数字控制器中实现就是累加。并且注意每个积分器\累加器后面都跟有饱和器和一个增益A

参考文献

Donate
  • Copyright: Copyright is owned by the author. For commercial reprints, please contact the author for authorization. For non-commercial reprints, please indicate the source.
  • Copyrights © 2022-2023 RY.J
  • Visitors: | Views:

请我喝杯咖啡吧~

支付宝
微信