MATLAB实现粒子群算法优化PID参数

MATLAB实现粒子群算法优化PID参数

一、问题描述

粒子群算法(PSO)通过模拟鸟群觅食行为搜索最优解,适用于PID参数整定问题。

被控对象: G(s)=1s2+1.5s+1G(s) = \frac{1}{s^2 + 1.5s + 1}G(s)=s2+1.5s+11

优化目标: 最小化ITAE指标

二、PSO算法原理

每个粒子代表一组PID参数,通过跟踪个体最优和全局最优更新位置:

  • vt+1=wvt+c1r1(pbest−xt)+c2r2(gbest−xt)v_{t+1} = w v_t + c_1 r_1(p_{best} - x_t) + c_2 r_2(g_{best} - x_t)vt+1=wvt+c1r1(pbest−xt)+c2r2(gbest−xt)
  • xt+1=xt+vt+1x_{t+1} = x_t + v_{t+1}xt+1=xt+vt+1

算法参数

参数 数值
粒子数 30
迭代次数 80
惯性权重w 0.7
学习因子c1/c2 1.5 / 1.5

三、MATLAB代码

matlab 复制代码
%% PSO-PID: 粒子群算法优化PID参数
clc; clear; close all; rng(42);

s = tf('s'); G = 1/(s^2+1.5*s+1);
Kp_r=[0,10]; Ki_r=[0,5]; Kd_r=[0,3];

swarm=30; max_iter=80; w=0.7; c1=1.5; c2=1.5;
pos=rand(swarm,3).*[Kp_r(2),Ki_r(2),Kd_r(2)];
vel=randn(swarm,3)*0.1;
pbest=pos; pbest_val=eval_pop(pos,G);
[gbest_val,i]=min(pbest_val); gbest=pos(i,:);
h=[gbest_val];

for iter=1:max_iter
    r1=rand(swarm,3); r2=rand(swarm,3);
    vel=w*vel+c1*r1.*(pbest-pos)+c2*r2.*(gbest-pos);
    pos=max(0,pos+vel);
    pos(:,1)=min(pos(:,1),Kp_r(2));
    pos(:,2)=min(pos(:,2),Ki_r(2));
    pos(:,3)=min(pos(:,3),Kd_r(2));
    val=eval_pop(pos,G);
    for i=1:swarm
        if val(i)<pbest_val(i)
            pbest_val(i)=val(i); pbest(i,:)=pos(i,:);
        end
        if val(i)<gbest_val
            gbest_val=val(i); gbest=pos(i,:);
        end
    end
    h=[h,gbest_val];
end

fprintf('Kp=%.4f Ki=%.4f Kd=%.4f ITAE=%.4f\n',gbest,gbest_val);

function f=eval_pop(pop,G)
    n=size(pop,1); f=zeros(n,1); t=0:0.01:5;
    for i=1:n
        try
            C=pid(pop(i,1),pop(i,2),pop(i,3));
            [y,~]=step(feedback(C*G,1),t);
            e=1-y; f(i)=sum(t'.*abs(e))*0.01;
            if isnan(f(i))||f(i)>100, f(i)=100; end
        catch, f(i)=100; end
    end
end

四、运行结果

4.1 控制台输出

复制代码
PSO 20/80: ITAE=0.1047
PSO 40/80: ITAE=0.1039
PSO 60/80: ITAE=0.1039
PSO 80/80: ITAE=0.1039

===== PSO-PID =====
Kp=4.6586 Ki=3.1215 Kd=3.0000 ITAE=0.1039

五、结果分析

PSO优化得到的PID参数ITAE=0.1039,优于GA的0.1861:

  • 收敛更快:PSO在40代前就已收敛
  • 精度更高:ITAE指标更优
  • 参数合理:Kd达到上限3.0,表明系统需要较强微分作用

六、参数设置建议

参数 说明
粒子数20~50 影响搜索广度
学习因子1~2 控制个体与全局搜索比例
惯性权重0.4~0.9 大值全局搜索,小值局部搜索

完整MATLAB代码可直接运行,如有问题欢迎交流!

相关推荐
Cx330❀2 分钟前
【Qt 进阶指南】详解 Qt 常用标准对话框与主窗口组件架构
开发语言·qt·ui·性能优化·架构·图形渲染
Light Gao3 分钟前
Encoder 与 Decoder 详解:从 Embedding 到 Seq2Seq 的完整数据流
java·开发语言·embedding
HZZD_HZZD4 分钟前
弱网下CoAP还省吗?合众致达Cat.1电表90天实测:MQTT重连流量占52%、续航差距从38%拉大到73%
开发语言·物联网·php·腾讯云
web打印社区7 分钟前
Windows 网页静默打印设置步骤:客户端、防火墙与联调清单
开发语言·前端·javascript·chrome·pdf·ecmascript
小师兄吃牛肉16 分钟前
什么是R语言?如何快速学习R语言
开发语言·学习·r语言
All for pursuit.19 分钟前
【回溯-2】22.括号生成
数据结构·c++·算法·leetcode
longlongzihan37 分钟前
LeetCode 1004.最大连续1的个数III 滑动窗口及动态规划题解
c++·算法·leetcode·dp·滑动窗口
Evand J38 分钟前
【MATLAB例程】三维快速扩展随机树(RRT)路径规划与到达角(AOA)、到达时间差(TDOA)融合定位,附下载链接
开发语言·matlab·代码·定位·例程
执明wa40 分钟前
Android RecyclerView 实战:点击频道栏切换对应内容
android·开发语言·windows·microsoft·android studio
开开心心就好42 分钟前
图片白底怎么去掉?抠图工具抠完背景透明
java·服务器·开发语言·pdf·ocr·散列表·启发式算法