基于粒子群优化调整离散 PID 控制器研究(Matlab代码实现)

 👨‍🎓个人主页:研学社的博客   

💥💥💞💞欢迎来到本博客❤️❤️💥💥

🏆博主优势:🌞🌞🌞博客内容尽量做到思维缜密,逻辑清晰,为了方便读者。

⛳️座右铭:行百里者,半于九十。

📋📋📋本文目录如下:🎁🎁🎁

目录

💥1 概述

一、引言

二、PID控制器原理

三、粒子群优化算法原理

四、基于粒子群优化调整离散PID控制器的研究

五、结论与展望

📚2 运行结果

🎉3 参考文献

🌈4 Matlab代码实现


💥1 概述

PID 控制在控制领域中是最为传统、有效的控制方法,因为其结构简单、稳定性好等广泛应用于工业过程控制。其中PID的控制性能主要取决于比例、微分、积分系数的取值,系数的取值影响系统控制的动态性能、系统稳定性、超调量等众多方面。因此,PID 控制器参数选择至关重要,但是PID控制器控制参数不易整定,应对复杂工况时效果不佳[1] ,还需要引入智能算法进行优化。

粒子群优化算法(PSO算法)是一种基于群体协作的随机搜索算法,该算法参数设置少、收敛速度快、实现简单,常常应用于系统辨识,取得了较好的优化结果[2] 。但是单一的粒子群算法容易陷入局部最优,导致误差较大。经过改进的粒子群算法既可以减少迭代次数,还可以提高算法精度及效率,常应用在焊接缺陷成因诊断、灰色预测模型改善等领域[3-4] ,产生了较好的影响。

针对 PID 控制算法和粒子群算法[1] 进行详细介绍。

1)PID 控制器

PID 控制器是最基础的一种负反馈控制器,控制器的控制方程为:

式中:Kp 为比例环节系数; Ti 为积分环节常数; Td 为微分环节系数。PID 控制器的原理如图 3 所示。

 

一、引言

PID控制器作为最为传统、有效的控制方法之一,因其结构简单、稳定性好而被广泛应用于工业过程控制。然而,PID控制器的性能取决于其比例、积分、微分三个参数的取值,这些参数的整定一直是自动控制领域研究的重要问题。传统的参数整定方法如试验加试凑的方式不仅费时,而且不能保证获得最佳的性能。因此,引入智能算法进行优化成为研究热点。粒子群优化算法(PSO)作为一种基于群体协作的随机搜索算法,具有参数设置少、收敛速度快、实现简单的优点,适用于PID控制器的参数优化。

二、PID控制器原理

PID控制器是一种负反馈控制器,其控制方程为:u(t)=Kp×e(t)+Ki×∫e(t)dt+Kd×de(t)/dt,其中Kp为比例环节系数,Ki为积分环节常数,Kd为微分环节系数。PID控制器的性能主要取决于这三个参数的取值,它们影响系统控制的动态性能、系统稳定性、超调量等众多方面。

三、粒子群优化算法原理

粒子群优化算法是Kennedy和Eberhart等受鸟群在寻觅食物时的行为启示,于1995年提出的一种优化算法。在粒子群算法中,每个优化问题的潜在解都可以想象成d维搜索空间上的一个点,这些点被称之为粒子。粒子群算法通过迭代找到最优解,在每一次迭代过程中,粒子跟踪两个极值来更新自己的速度和位置:一个是粒子本身所找到的最优解,称为个体极值;另一个是整个种群目前找到的最优解,称为全局极值。

四、基于粒子群优化调整离散PID控制器的研究

  1. 问题定义:将PID控制器的三个参数Kp、Ki、Kd作为粒子群中的粒子,采用控制误差绝对值时间积分函数作为优化目标,通过粒子群优化算法动态调整这三个参数,实现PID控制参数的实时优化。
  2. 模型建立:建立离散PID控制器模型,并确定粒子群优化算法的适应度函数。
  3. 算法实现:在Matlab环境下进行仿真实验,通过粒子群优化算法对PID控制器的参数进行优化。具体步骤包括初始化粒子群、计算适应度、更新速度和位置、判断终止条件等。
  4. 结果分析:通过仿真实验,得到优化后的PID控制器参数,并比较优化前后的系统性能。结果表明,基于粒子群优化算法的PID控制器参数优化方法具有很强的灵活性、适应性和鲁棒性,能够显著提高系统性能。

五、结论与展望

基于粒子群优化算法的PID控制器参数优化方法具有显著的优势,能够克服传统参数整定方法的缺点,提高系统性能。未来研究可以进一步探索改进粒子群优化算法,提高算法精度和效率,以及将该方法应用于更复杂的控制系统和实际问题中。

📚2 运行结果

主函数代码:

close all;
clear all;
clc;

%parametry symulacji
k_start     =   4;
k_stop      =   800;

%parametry modelu
alfa1 = -1.645679;
alfa2 = 0.675125;
beta1 = 0.01098;
beta2 = 0.009632;

%wartosci poczatkowe zmiennych 
u       =   zeros(1,k_stop);
y       =   zeros(1,k_stop);
x1      =   zeros(1,k_stop);
x2      =   zeros(1,k_stop);
e       =   zeros(1,k_stop);
y_zad   =   [0.5*ones(1,k_stop/4) -0.35*ones(1,k_stop/4) 0.4*ones(1,k_stop/4) -1.2*ones(1,k_stop/4)]; 

%% Regulator PID nastrojony metoda Zieglera-Nicholsa
T=1;  
Tosc = 16.8;  %(192-24)/10    <-- usrednione dla 10 okres贸w
kkr = 3.7;
k_p = 0.6*kkr;
Ti_p = 0.5*Tosc;
Td_p  = 0.125*Tosc;

% Niegasnace oscylacje:
% Ti_p = inf;
% Td_p = 0;
% k_p = kkr;

% Nastawy regulatora PID w wersji dyskretnej
r2=(k_p*Td_p)/T;
r1=k_p*((T/(2*Ti_p))-((2*Td_p)/T)-1);
r0=k_p*(1+(T/(2*Ti_p))+(Td_p/T));

E = 0;
for k = k_start:k_stop    
    %model nieliniowy
    g1      = (exp(5*u(k-3))-1)/(exp(5*u(k-3))+1); 
    x1(k)   = -alfa1*x1(k-1) + x2(k-1) + beta1*g1;
    x2(k)   = -alfa2*x1(k-1) + beta2*g1;
    g2      = 1-exp(-1.5*x1(k)); 
    y(k)    = g2;

   
    e(k)=y_zad(k) - y(k);
    u(k)=r2*e(k-2)+r1*e(k-1)+r0*e(k) + u(k-1);

    if (u(k)>1)
        u(k)=1;
    end
    if (u(k)<-1)
        u(k)=-1;
    end
   
   E = E + (y_zad(k) - y(k))^2;
end

display(sprintf('Wskaznik jakosci E = %f',E))
y1 = y;
u1 = u;

disp('Nacisnij spacje aby kontynuowac');
pause;
  
%% Regulator PID nastrojony PSO

%parametry regulatora obliczone w pliku pid_pso_tun.m
r0 = 1.2230
r1 = -1.4218
r2 = 0.2628

u       =   zeros(1,k_stop);
y       =   zeros(1,k_stop);
x1      =   zeros(1,k_stop);
x2      =   zeros(1,k_stop);
e       =   zeros(1,k_stop);
E = 0;

for k = k_start:k_stop    
    %model nieliniowy
    g1      = (exp(5*u(k-3))-1)/(exp(5*u(k-3))+1); 
    x1(k)   = -alfa1*x1(k-1) + x2(k-1) + beta1*g1;
    x2(k)   = -alfa2*x1(k-1) + beta2*g1;
    g2      = 1-exp(-1.5*x1(k)); 
    y(k)    = g2;

   
    e(k)=y_zad(k) - y(k);
    u(k)=r2*e(k-2)+r1*e(k-1)+r0*e(k) + u(k-1);

    if (u(k)>1)
        u(k)=1;
    end
    if (u(k)<-1)
        u(k)=-1;
    end
   
   E = E + (y_zad(k) - y(k))^2;
end

%%

figure(1) 
clf

subplot(2,1,1)
plot(y);
title('Porownanie przebiegow sygnalow wyjsciowych i wejsciowych regulatora PID nastrojonego dwiema metodami')
hold on
plot(y1,'m')
hold on
plot(y_zad,'r--')
legend('PID PSO','PID Z-N')
ylabel('y(k)')
xlabel('k');
grid on
subplot(2,1,2)
plot(u)
hold on
plot(u1,'m')
grid on
ylabel('u(k)')
xlabel('k');

🎉3 参考文献

部分理论来源于网络,如有侵权请联系删除。

[1]杨雨彬,任天宇,邓宏敬,蔡子龙,杨子墨.基于优化粒子群神经PID的双变量解耦控制[J].科技资讯,2023,21(03):1-5.DOI:10.16661/j.cnki.1672-3791.2206-5042-5807.

[2]李欢欢,刘辉,盖江涛,李训明.基于粒子群优化算法PID参数优化的双电机耦合驱动履带车辆转向控制研究[J/OL].兵工学报:1-8[2023-04-22].

[3]李春亚,杨辰飞.基于粒子群算法和PID相结合的船舶电喷柴油机自动控制[J].舰船科学技术,2023,45(01):147-150.

🌈4 Matlab代码实现

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

荔枝科研社

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值