Bootstrap

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:3000
    r(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); % 计算P
    x(2) = e(k) - e_1; % 计算D
    x(3) = x(3) + e(k)*ts; % 计算I
    
    ec_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');

;