基于粒子群算法的PID控制器优化设计(matlab实现)

1 理论基础

        PID控制器应用广泛,其一般形式为
        可见,PID控制器的性能取决于Kp、Ki、Kd这3个参数是否合理,因此,优化PID控制器参数具有重要意义。目前,PID控制器参数主要是人工调整,这种方法不仅费时,而且不能保证获得最佳的性能。PSO已经广泛应用于函数优化、神经网络训练、模式分类、模糊系统控制以及其他应用领域,本案例将使用PSO进行PID控制器参数的优化设计。

2 案例背景

2.1 问题描述

        PID控制器的系统结构图如图14-1所示。

        在Simulink环境下建立的模型如图14-2所示。
        图14-2中,微分环节由一个一阶环节近似,输出端口1即为式(14-2)所示的ITAE指标,通过将时间及误差绝对值的乘积进行积分后得到。

2.2 解题思路及步骤

        1.优化设计过程
        利用粒子群算法对PID控制器的参数进行优化设计,其过程如图14-3所示。

        图14-3中,粒子群算法与Simulink模型之间连接的桥梁是粒子(即PID控制器参数)和该粒子对应的适应值(即控制系统的性能指标)。优化过程如下:PSO产生粒子群(可以是初始化粒子群,也可以是更新后的粒子群),将该粒子群中的粒子依次赋值给PID控制器的参数Kp、Ki、Kd,然后运行控制系统的Simulink模型,得到该组参数对应的性能指标,该性能指标传递到PSO中作为该粒子的适应值,最后判断是否可以退出算法。
        2.粒子群算法实现
        粒子群算法的基本原理在前面已经述及,进一步地,粒子在搜索空间中的速度和位置根据以下公式确定:
        PSO的流程如下:
        (1)初始化粒子群,随机产生所有粒子的位置和速度,并确定粒子的Pt和Gt。
        (2)对每个粒子,将其适应值与该粒子所经历过的最优位置P,的适应值进行比较,如较好,则将其作为当前的Pt。
        (3)对每个粒子,将其适应值与整个粒子群所经历过的最优位置Gt的适应值进行比较,如较好,则将其作为当前的Gt。
        (4)按式(14-4)和式(14-5)更新粒子的速度和位置。
        (5)如果没有满足终止条件(通常为预设的最大迭代次数和适应值下限值),则返回步骤(2);否则,退出算法,得到最优解。

3 MATLAB程序实现

3.1 Simulink部分的程序实现

        图14-3所示的PSO优化PID过程示意图,其右侧的Simulink部分的程序实现如下:
function z=PSO_PID(x)
assignin('base','Kp',x(1));
assignin('base','Ki',x(2));
assignin('base','Kd',x(3));
[t_time,x_state,y_out]=sim('PID_Model',[0,20]);
z=y_out(end,1);
        其中,x为PSO中传递过来的粒子,首先,调用函数assignin将x(1)、x(2)、x(3)的值赋值给Workspace中的Kp、Ki、Kd,该语句实现了图14-3中从PSO部分到Simulink部分的参数传递;然后,调用函数sim对图14-2所示的模型进行仿真,其中,PID_Model为Simulink模型的文件名,[0,20]为仿真时间,返回的y_out即为输出端子1的值;最后,将性能指标ITAE赋值给z,以实现图14-3中从Simulink部分到PSO部分的参数传递。

3.2 PSO部分的程序实现

        设置PSO的参数为:惯性因子w=0.6,加速常数c?=c?=2,维数为3(有3个待优化参数),粒子群规模为100,待优化函数为14.3.1节中的函数PSO_PID,最大迭代次数为100,最小适应值为0.1,速度范围为[-1,1],3个待优化参数范围均为[0,300]。代码如下:
%% 清空环境
clear
clc

%% 参数设置
w = 0.6;      % 惯性因子 
c1 = 2;       % 加速常数
c2 = 2;       % 加速常数

Dim = 3;            % 维数
SwarmSize = 100;    % 粒子群规模
ObjFun = @PSO_PID;  % 待优化函数句柄

MaxIter = 100;      % 最大迭代次数  
MinFit = 0.1;       % 最小适应值 

Vmax = 1;
Vmin = -1;
Ub = [300 300 300];
Lb = [0 0 0];

%% 粒子群初始化
    Range = ones(SwarmSize,1)*(Ub-Lb);
    Swarm = rand(SwarmSize,Dim).*Range + ones(SwarmSize,1)*Lb      % 初始化粒子群
    VStep = rand(SwarmSize,Dim)*(Vmax-Vmin) + Vmin                 % 初始化速度
    fSwarm = zeros(SwarmSize,1);
for i=1:SwarmSize
    fSwarm(i,:) = feval(ObjFun,Swarm(i,:));                         % 粒子群的适应值
end

%% 个体极值和群体极值
[bestf bestindex]=min(fSwarm);
zbest=Swarm(bestindex,:);   % 全局最佳
gbest=Swarm;                % 个体最佳
fgbest=fSwarm;              % 个体最佳适应值
fzbest=bestf;               % 全局最佳适应值

%% 迭代寻优
iter = 0;
y_fitness = zeros(1,MaxIter);   % 预先产生4个空矩阵
K_p = zeros(1,MaxIter);         
K_i = zeros(1,MaxIter);
K_d = zeros(1,MaxIter);
while( (iter < MaxIter) && (fzbest > MinFit) )
    for j=1:SwarmSize
        % 速度更新
        VStep(j,:) = w*VStep(j,:) + c1*rand*(gbest(j,:) - Swarm(j,:)) + c2*rand*(zbest - Swarm(j,:));
        if VStep(j,:)>Vmax, VStep(j,:)=Vmax; end
        if VStep(j,:)<Vmin, VStep(j,:)=Vmin; end
        % 位置更新
        Swarm(j,:)=Swarm(j,:)+VStep(j,:);
        for k=1:Dim
            if Swarm(j,k)>Ub(k), Swarm(j,k)=Ub(k); end
            if Swarm(j,k)<Lb(k), Swarm(j,k)=Lb(k); end
        end
        % 适应值
        fSwarm(j,:) = feval(ObjFun,Swarm(j,:));
        % 个体最优更新     
        if fSwarm(j) < fgbest(j)
            gbest(j,:) = Swarm(j,:);
            fgbest(j) = fSwarm(j);
        end
        % 群体最优更新
        if fSwarm(j) < fzbest
            zbest = Swarm(j,:);
            fzbest = fSwarm(j);
        end
    end 
    iter = iter+1;                      % 迭代次数更新
    y_fitness(1,iter) = fzbest;         % 为绘图做准备
    K_p(1,iter) = zbest(1);
    K_i(1,iter) = zbest(2);
    K_d(1,iter) = zbest(3);
end
%% 绘图输出
figure(1)      % 绘制性能指标ITAE的变化曲线
plot(y_fitness,'LineWidth',2)
title('最优个体适应值','fontsize',18);
xlabel('迭代次数','fontsize',18);ylabel('适应值','fontsize',18);
set(gca,'Fontsize',18);

figure(2)      % 绘制PID控制器参数变化曲线
plot(K_p)
hold on
plot(K_i,'k','LineWidth',3)
plot(K_d,'--r')
title('Kp、Ki、Kd 优化曲线','fontsize',18);
xlabel('迭代次数','fontsize',18);ylabel('参数值','fontsize',18);
set(gca,'Fontsize',18);
legend('Kp','Ki','Kd',1);
        其中,MaxIter和MinFit即终止条件;Vmax和Vmin分别为速度的上限和下限;Ub(i)和Lb(i)分别为第i个待优化参数的上限和下限。粒子群的初始化采用与遗传算法相似的方法(用函数rand且保证粒子在上下限范围内),迭代过程采用while进行大循环,速度更新和位置更新按照式 (14-4)和式(14-5)进行(且在迭代 更新过程中,若超出了限值,则将其 设为限制)。

3.3 结果分析

        运行以上代码,得到优化过程如图14-4和图14-5所示,前者为PID控制器3个参数Ki、Kp、Kd的变化曲线,后者为性能指标ITAE的变化曲线。得到的最优控制器参数及性能指标为
Kp= 33.6469,Ki=0.1662, Kd=38.7990, ITAE =1.0580
        将以上参数代回图14-2所示的模型,得到的单位阶跃响应曲线如图14-6所示。由图14-5可知,算法优化过程中,性能指标ITAE不断减小,PSO不断寻找更优的参数。

  • 12
    点赞
  • 99
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 6
    评论
粒子群算法可以应用于PID控制PID控制是一种常用的控制算法,但是其参数的整定和优化是一个挑战。为了解决这个问题,许多专家开始使用一些优化算法来进行PID参数的寻优,其中包括粒子群算法粒子群算法是一种模拟鸟群或鱼群行为的优化算法。在粒子群算法中,每个粒子代表一个可能的解,它们通过不断地更新自己的位置和速度来搜索最优解。粒子群算法通过模拟粒子在解空间中的移动和信息交流来寻找最优解。 在PID控制中,粒子群算法可以用来优化PID控制的参数。通过将PID控制的参数作为粒子的位置,根据目标函数的值来评估粒子的适应度,粒子群算法可以不断地调整粒子的位置和速度,以找到最优的PID参数组合。 使用粒子群算法进行PID参数的整定和优化可以提高控制系统的性能和鲁棒性,使得PID控制能够更好地适应复杂和高指标的控制要求。这种方法已经在许多领域中得到了成功的应用,例如汽车半主动悬架控制等。\[1\]\[2\]\[3\] #### 引用[.reference_title] - *1* *3* [《MATLAB智能算法30个案例》:第14章 基于粒子群算法PID控制优化设计](https://blog.csdn.net/sinat_34897952/article/details/125590399)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insert_down1,239^v3^insert_chatgpt"}} ] [.reference_item] - *2* [基于遗传算法和粒子群算法PID悬架控制、LQR悬架控制和滑模悬架控制](https://blog.csdn.net/weixin_50892810/article/details/127502707)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insert_down1,239^v3^insert_chatgpt"}} ] [.reference_item] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

配电网和matlab

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

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

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

打赏作者

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

抵扣说明:

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

余额充值