直接上干货,咱们用粒子群算法给PID控制器做个暴力调参。传统PID参数调整像盲人摸象,PSO(粒子群优化)相当于派出一群带雷达的无人机直接扫描整片山区找最优解
基于粒子群算法的PID控制优化算法案例 matlab源代码 代码有详细注释完美运行先看目标——让这个二阶系统达到最顺滑的响应% 被控对象传递函数 sys tf(1, [1 3 2]); t 0:0.01:10; % 时间序列粒子群的核心配置得够骚%% PSO参数 swarm_size 15; % 粒子数量别太多会过拟合 max_iter 20; % 迭代次数实测超过30次收益递减 w 0.6; % 惯性权重调这个能改收敛速度 c1 1.4; % 自我认知系数 c2 1.8; % 社会认知系数 Kp_range [0 5]; % PID参数搜索范围 Ki_range [0 2]; Kd_range [0 2];这里的参数范围设置是门玄学建议先用Ziegler-Nichols法估算大概区间再扩展20%。c2比c1大是为了让粒子多参考群体经验防止在局部最优里鬼打墙。适应度函数用ITSE指标比ISE更治大摆幅function fitness pid_fitness(para) Kp para(1); Ki para(2); Kd para(3); controller pid(Kp, Ki, Kd); sys_cl feedback(controller*sys, 1); y step(sys_cl, t); error 1 - y; % 阶跃输入的误差 % ITSE指标时间加权平方误差积分 fitness sum(t.*(error.^2)*0.01); end注意误差计算用1-y而不是绝对值这样超调会被惩罚得更狠。时间权重让系统更注重快速稳定避免后期误差的微小波动影响评分。基于粒子群算法的PID控制优化算法案例 matlab源代码 代码有详细注释完美运行粒子位置更新是算法的灵魂% 速度更新公式别直接用要限制速度防发散 particle.v w*particle.v ... c1*rand*(particle.pbest - particle.pos) ... c2*rand*(gbest - particle.pos); % 位置越界处理重要否则参数会飞到外太空 particle.pos max(particle.pos, [Kp_range(1), Ki_range(1), Kd_range(1)]); particle.pos min(particle.pos, [Kp_range(2), Ki_range(2), Kd_range(2)]);这里有个坑——没做速度限制的话粒子容易在边界反复横跳。实测加个速度上限能提升收敛效率但代码没写是为了保持简洁。跑完20代后的优化结果可能长这样最优参数: Kp2.35, Ki1.08, Kd0.79 适应度值: 0.056对比传统Ziegler-Nichols法的响应曲线PSO版本的超调量能压掉30%左右稳定时间缩短1秒多。不过别迷信绝对数值换个被控对象可能效果反转。完整代码在GitHub仓库地址假装存在拿回去改个传递函数就能折腾自己的控制系统。记住PSO不是银弹遇到高频振荡系统还是得搬出模糊控制或者神经网络这些大杀器。
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2459319.html
如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!