用鲸鱼优化算法(WOA)整定PID参数:Matlab与Simulink实战
鲸鱼优化算法WOA整定 PID 参数m 文件加 simulink仿真仿真程序给出适应度优化曲线参数优化曲线以及优化对比波形适用 matlab 2021b 及以上版本在自动控制领域PID控制器因其结构简单、稳定性好、工作可靠、调整方便等优点被广泛应用。然而如何精准地整定PID参数让控制器达到最优性能一直是研究的热点。今天咱们就聊聊用鲸鱼优化算法WOA来整定PID参数并且结合Matlab和Simulink完成仿真全过程。鲸鱼优化算法WOA简介鲸鱼优化算法是一种模拟座头鲸捕食行为的元启发式优化算法。座头鲸在捕食时会采用一种独特的“气泡网”策略算法就基于这个过程进行建模。鲸鱼优化算法WOA整定 PID 参数m 文件加 simulink仿真仿真程序给出适应度优化曲线参数优化曲线以及优化对比波形适用 matlab 2021b 及以上版本在WOA中搜索代理也就是潜在的解模拟鲸鱼的位置。算法的主要步骤包括包围猎物、气泡网攻击和搜索猎物。用代码简单示意一下包围猎物这个步骤Matlab代码% 包围猎物 a 2 - iter * (2 / Max_iter); % a 随迭代次数线性减少 r rand(); % 随机数 l randn(); % 随机数 p rand(); % 随机数 if p 0.5 if abs(A) 1 % 更新鲸鱼位置向猎物靠近 D abs(C * Xp - X(i, :)); X(i, :) Xp - A * D; else % 随机选择一个位置 rand_leader_index floor(rand() * SearchAgents_no) 1; X_rand X(rand_leader_index, :); D abs(C * X_rand - X(i, :)); X(i, :) X_rand - A * D; end end这里a随着迭代次数iter的增加而线性减小r、l、p都是随机数通过这些随机数和a的值来决定鲸鱼下一步是靠近当前最优解猎物位置Xp还是随机选择一个位置移动以此来探索解空间。PID参数整定与WOA结合我们的目标是利用WOA找到最优的PID参数Kp、Ki、Kd使得系统性能达到最佳。在Matlab中我们可以这样定义适应度函数来评估一组PID参数的好坏function fitness fitnessFunction(pid_params) Kp pid_params(1); Ki pid_params(2); Kd pid_params(3); % 创建PID控制器 pid pid(Kp, Ki, Kd); % 这里假设已经定义了系统模型sys % 用feedback函数构建闭环系统 sys_cl feedback(pid * sys, 1); % 进行阶跃响应仿真 [y, t] step(sys_cl); % 计算适应度这里以积分时间绝对误差ITAE为例 fitness sum(t.* abs(1 - y)); end这个适应度函数接受一组PID参数构建一个PID控制器并与系统模型组成闭环系统然后对闭环系统进行阶跃响应仿真最后根据积分时间绝对误差ITAE计算这组参数的适应度值ITAE值越小说明这组PID参数越好。Matlab m文件实现WOA整定PID参数下面是完整的用WOA整定PID参数的Matlab m文件代码框架% WOA整定PID参数主程序 clc; clear all; close all; % 定义系统模型这里假设一个简单的二阶系统 num [1]; den [1 1 0]; sys tf(num, den); % WOA参数设置 Max_iter 100; % 最大迭代次数 SearchAgents_no 30; % 鲸鱼数量 dim 3; % PID参数维度Kp, Ki, Kd lb [0 0 0]; % 下限 ub [100 100 100]; % 上限 % 初始化鲸鱼位置 X initialPosition(SearchAgents_no, dim, lb, ub); % 计算初始适应度 fitness zeros(SearchAgents_no, 1); for i 1:SearchAgents_no fitness(i) fitnessFunction(X(i, :)); end [best_fitness, best_index] min(fitness); Xp X(best_index, :); % 初始最优解 % WOA主循环 for iter 1:Max_iter % 更新a, A, C a 2 - iter * (2 / Max_iter); for i 1:SearchAgents_no r rand(); l randn(); p rand(); if p 0.5 if abs(A) 1 D abs(C * Xp - X(i, :)); X(i, :) Xp - A * D; else rand_leader_index floor(rand() * SearchAgents_no) 1; X_rand X(rand_leader_index, :); D abs(C * X_rand - X(i, :)); X(i, :) X_rand - A * D; end else % 气泡网攻击模式 D abs(Xp - X(i, :)); X(i, :) Xp cos(2 * pi * l) * D * exp(l); end % 边界检查 X(i, :) boundaryCheck(X(i, :), lb, ub); % 计算新的适应度 fitness(i) fitnessFunction(X(i, :)); if fitness(i) best_fitness best_fitness fitness(i); Xp X(i, :); end end % 记录每代最优适应度 best_fitness_record(iter) best_fitness; end这个代码首先定义了系统模型设置了WOA算法的参数初始化鲸鱼位置并计算初始适应度。然后在主循环中按照WOA的步骤更新鲸鱼位置进行边界检查并重新计算适应度记录每代的最优适应度。Simulink仿真在Matlab 2021b及以上版本中我们可以将优化得到的PID参数应用到Simulink模型中进行仿真。搭建一个简单的Simulink模型包含一个输入信号比如阶跃信号一个PID控制器模块以及系统模型模块。将Matlab中优化得到的Kp、Ki、Kd参数填入PID控制器模块。仿真结果展示适应度优化曲线通过记录每代的最优适应度我们可以绘制适应度优化曲线。在Matlab中用以下代码就可以绘制figure; plot(1:Max_iter, best_fitness_record); xlabel(迭代次数); ylabel(最优适应度); title(适应度优化曲线);这条曲线展示了随着迭代次数增加WOA算法找到的最优适应度值的变化情况直观地反映了算法的收敛过程。参数优化曲线为了观察Kp、Ki、Kd在迭代过程中的变化我们可以记录每次迭代中最优解对应的PID参数值并绘制曲线。% 假设记录了每次迭代的最优PID参数 Kp_record zeros(Max_iter, 1); Ki_record zeros(Max_iter, 1); Kd_record zeros(Max_iter, 1); for iter 1:Max_iter Kp_record(iter) Xp(1); Ki_record(iter) Xp(2); Kd_record(iter) Xp(3); end figure; subplot(3,1,1); plot(1:Max_iter, Kp_record); xlabel(迭代次数); ylabel(Kp); title(Kp优化曲线); subplot(3,1,2); plot(1:Max_iter, Ki_record); xlabel(迭代次数); ylabel(Ki); title(Ki优化曲线); subplot(3,1,3); plot(1:Max_iter, Kd_record); xlabel(迭代次数); ylabel(Kd); title(Kd优化曲线);这些曲线展示了每个PID参数是如何在WOA迭代过程中逐渐优化到最优值的。优化对比波形在Simulink仿真中我们可以将优化前和优化后的系统输出波形进行对比。通过示波器模块记录不同PID参数下系统的阶跃响应波形就能直观地看到WOA优化PID参数后系统性能的提升比如超调量减小、调节时间缩短等。通过以上步骤我们利用鲸鱼优化算法WOA完成了PID参数的整定并通过Matlab和Simulink进行了仿真验证展示了算法优化过程和系统性能提升的效果。希望这篇文章能给在自动控制领域探索的小伙伴们一些启发。
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2474918.html
如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!