【控制】基于灰狼算法改进分数阶PD滑模控制器附matlab代码

1 内容介绍

分数微积分已经被研究了将近 个世纪,并且已 经被科学家广泛应用到科学与控制工程领域中分 数阶 PID 控制系统是由斯洛伐克学者 Podlubny于 1994 年提出,并应用于分数阶模糊系统中在此项工 作之后,其他的工程师应用不同的设计与调整方法设 计出分数阶 PID 控制器分数阶微积分为复杂成比例 的系统过程和事件提供完善的数学模型,应用于物理、 生物与控制理论方面。 分数模糊控制器( FFCs) 是传统模糊控制器与分 数阶算子结合,在多种动力系统中表现出比传统的模 糊控制器更好的性能分数阶模糊控制器中的参数估 计问题一般用进化算法去优化求解,提高控制器的精 度与稳定性能例如: 用遗传算法模糊分数阶控制器 模型问题; 用混沌粒子群算法对可再生发电混合动 力系统进行分数阶模糊控制器; 使用微分和声搜索 算法设计分数阶; 采用改进的重力搜索算法对抽水 蓄能水电机组进行快速模糊分数阶 PID 控制; 分数阶模糊 PID 控制器在机械手臂中的应用性能分析; 社会蜘蛛群算法对分数模糊控制器参数标定虽然这些算法都获得比较理想的结果,但是仍然具有一 个很重要的局限性,由于其搜索策略中的勘探与开采 之间的平衡关系,容易陷入局部最优的解,这种行为会 导致整个种群快速集中在最优粒子周围,容易形成早 熟收敛,不利于搜索空间的探索。 灰狼优化算法是由 Mirjalili 等于 2014 年提出 的新型群智能优化算法灰狼优化算法( GWO) 是模 拟灰狼的狩猎机制,包括搜索猎物追踪猎物包围猎 物与捕杀猎物等步骤,与其他的元启发式优化算法不 同,该算法考虑领导阶层由于该算法具有较好的平 衡勘探与开采能力,所以该算法越来越受到相关领域 的人们重视,并成功地应用于一些实际工程问题中

PID模糊控制在工业控制中是最广泛的一种控制方法,在一些复杂的实际系统中,应用分数阶PID模糊控制器在整定系统参数性能上优于整数模糊控制器.分数阶模糊控制器具有较多的控制参数,这些控制参数直接影响了模糊控制器的性能.用传统的算法校准分数阶模糊控制器并不能得到最佳的参数值,而且标定参数的过程较为复杂.因此提出用灰狼优化算法(Grey Wolf Optimizer,GWO)优化分数阶模糊控制器的参数.将基于灰狼优化算法的分数阶模糊控制器优化方法与其他五种典型的基于群智能的优化方法进行了比较.实验结果表明,该方法的控制效果更好.

2 仿真代码

<span style="color:#333333"><span style="background-color:rgba(0, 0, 0, 0.03)"><code>​</code><code>​</code><code><span style="color:#afafaf">%</span> <span style="color:#dd1144">Grey Wolf Optimizer</span></code><code>function <span style="color:#dd1144">[Alpha_score,Alpha_pos,Convergence_curve]=GWOr(SearchAgents_no,Max_iter,lb,ub,dim)</span></code><code>x0=<span style="color:#dd1144">[-pi pi 0 0 0 0];</span></code><code>Ts=<span style="color:#dd1144">[0 5]; </span></code><code><span style="color:#afafaf">%</span> <span style="color:#dd1144">initialize alpha, beta, and delta_pos</span></code><code>Alpha_pos=<span style="color:#dd1144">zeros(1,dim);</span></code><code>Alpha_score=<span style="color:#dd1144">inf; %change this to -inf for maximization problems</span></code><code>​</code><code>Beta_pos=<span style="color:#dd1144">zeros(1,dim);</span></code><code>Beta_score=<span style="color:#dd1144">inf; %change this to -inf for maximization problems</span></code><code>​</code><code>Delta_pos=<span style="color:#dd1144">zeros(1,dim);</span></code><code>Delta_score=<span style="color:#dd1144">inf; %change this to -inf for maximization problems</span></code><code>​</code><code><span style="color:#afafaf">%Initialize</span> <span style="color:#dd1144">the positions of search agents</span></code><code>Positions=<span style="color:#dd1144">initializationr(SearchAgents_no,dim,ub,lb);</span></code><code>​</code><code>Convergence_curve=<span style="color:#dd1144">zeros(1,Max_iter);</span></code><code>​</code><code>l=<span style="color:#dd1144">0;% Loop counter</span></code><code>​</code><code><span style="color:#afafaf">%</span> <span style="color:#dd1144">Main loop</span></code><code>while <span style="color:#dd1144">l<Max_iter</span></code><code>    l</code><code>    for <span style="color:#dd1144">i=1:size(Positions,1)  </span></code><code>        </code><code>        </code><code>       <span style="color:#afafaf">%</span> <span style="color:#dd1144">Return back the search agents that go beyond the boundaries of the search space</span></code><code><span style="color:#afafaf">%</span>         <span style="color:#dd1144">Flag4ub=Positions(i,:)>ub;</span></code><code><span style="color:#afafaf">%</span>         <span style="color:#dd1144">Flag4lb=Positions(i,:)<lb;</span></code><code><span style="color:#afafaf">%</span>         <span style="color:#dd1144">Positions(i,:)=(Positions(i,:).*(~(Flag4ub+Flag4lb)))+ub.*Flag4ub+lb.*Flag4lb;   </span></code><code>        Kpd=<span style="color:#dd1144">Positions(i,:);</span></code><code>        <span style="color:#afafaf">[T,X]</span> = <span style="color:#dd1144">ode45(@(t,x) r2dof(t,x,Kpd),Ts,x0);</span></code><code>​</code><code>        qd1=<span style="color:#dd1144">sin(4.17*T);</span></code><code>        <span style="color:#afafaf">%</span> <span style="color:#dd1144">qdot_r1=4.17*cos(4.17*T);</span></code><code>        <span style="color:#afafaf">%</span> <span style="color:#dd1144">qdot2_r1=-4.17*4.17*sin(4.17*T);</span></code><code>        qd2=<span style="color:#dd1144">1.2*sin(5.11*T);</span></code><code>        <span style="color:#afafaf">%</span> <span style="color:#dd1144">qdot_r2=1.2*5.11*cos(5.11*T);</span></code><code>        <span style="color:#afafaf">%</span> <span style="color:#dd1144">qdot2_r2=-1.2*5.11*5.11*sin(5.11*T);</span></code><code>​</code><code>        th1=<span style="color:#dd1144">X(:,1); %theta1 wavwform</span></code><code>        th2=<span style="color:#dd1144">X(:,2);</span></code><code>        fitness=<span style="color:#dd1144">Fitnessr(th1,th2,qd1,qd2);</span></code><code>        <span style="color:#afafaf">%</span> <span style="color:#dd1144">Calculate objective function for each search agent</span></code><code><span style="color:#afafaf">%</span>         <span style="color:#dd1144">fitness=Fitnessr(Positions(i,:));</span></code><code>        </code><code>        <span style="color:#afafaf">%</span> <span style="color:#dd1144">Update Alpha, Beta, and Delta</span></code><code>        if <span style="color:#dd1144">fitness<Alpha_score </span></code><code>            Alpha_score=<span style="color:#dd1144">fitness; % Update alpha</span></code><code>            Alpha_pos=<span style="color:#dd1144">Positions(i,:);</span></code><code>        end</code><code>        </code><code>        if <span style="color:#dd1144">fitness>Alpha_score && fitness<Beta_score </span></code><code>            Beta_score=<span style="color:#dd1144">fitness; % Update beta</span></code><code>            Beta_pos=<span style="color:#dd1144">Positions(i,:);</span></code><code>        end</code><code>        </code><code>        if <span style="color:#dd1144">fitness>Alpha_score && fitness>Beta_score && fitness<Delta_score </span></code><code>            Delta_score=<span style="color:#dd1144">fitness; % Update delta</span></code><code>            Delta_pos=<span style="color:#dd1144">Positions(i,:);</span></code><code>        end</code><code>    end</code><code>    </code><code>    </code><code>    a=<span style="color:#dd1144">2-l*((2)/Max_iter); % a decreases linearly fron 2 to 0</span></code><code>    </code><code>    <span style="color:#afafaf">%</span> <span style="color:#dd1144">Update the Position of search agents including omegas</span></code><code>    for <span style="color:#dd1144">i=1:size(Positions,1)</span></code><code>        </code><code>        </code><code><span style="color:#afafaf">%</span>         <span style="color:#dd1144">for j=1:size(Positions,2)     </span></code><code>                       </code><code>            r1=<span style="color:#dd1144">rand(); % r1 is a random number in [0,1]</span></code><code>            r2=<span style="color:#dd1144">rand(); % r2 is a random number in [0,1]</span></code><code>            </code><code>            A1=<span style="color:#dd1144">2*a*r1-a; % Equation (3.3)</span></code><code>            C1=<span style="color:#dd1144">2*r2; % Equation (3.4)</span></code><code>            </code><code>            D_alpha=<span style="color:#dd1144">abs(C1*Alpha_pos-Positions(i,:)); % Equation (3.5)-part 1</span></code><code>            X1=<span style="color:#dd1144">Alpha_pos-A1*D_alpha; % Equation (3.6)-part 1</span></code><code>                       </code><code>            r1=<span style="color:#dd1144">rand();</span></code><code>            r2=<span style="color:#dd1144">rand();</span></code><code>            </code><code>            A2=<span style="color:#dd1144">2*a*r1-a; % Equation (3.3)</span></code><code>            C2=<span style="color:#dd1144">2*r2; % Equation (3.4)</span></code><code>            </code><code>            D_beta=<span style="color:#dd1144">abs(C2*Beta_pos-Positions(i,:)); % Equation (3.5)-part 2</span></code><code>            X2=<span style="color:#dd1144">Beta_pos-A2*D_beta; % Equation (3.6)-part 2       </span></code><code>            </code><code>            r1=<span style="color:#dd1144">rand();</span></code><code>            r2=<span style="color:#dd1144">rand(); </span></code><code>            </code><code>            A3=<span style="color:#dd1144">2*a*r1-a; % Equation (3.3)</span></code><code>            C3=<span style="color:#dd1144">2*r2; % Equation (3.4)</span></code><code>            </code><code>            D_delta=<span style="color:#dd1144">abs(C3*Delta_pos-Positions(i,:)); % Equation (3.5)-part 3</span></code><code>            X3=<span style="color:#dd1144">Delta_pos-A3*D_delta; % Equation (3.5)-part 3             </span></code><code>            </code><code>            <span style="color:#afafaf">Positions(i,</span>:<span style="color:#dd1144">)=(X1+X2+X3)/3;% Equation (3.7)</span></code><code>            </code><code><span style="color:#afafaf">%</span>         <span style="color:#dd1144">end</span></code><code>    end</code><code>    l=<span style="color:#dd1144">l+1;    </span></code><code>    <span style="color:#afafaf">Convergence_curve(l)</span>=<span style="color:#dd1144">Alpha_score;</span></code><code>end</code><code>​</code><code>​</code><code>​</code><code>​</code></span></span>

3 运行结果

4 参考文献

[1]范鲁娜. 灰狼算法优化分数阶模糊控制器参数[J]. 计算机应用与软件, 2021, 38(10):6.

[1]阎晓妹, 尚婷, 赵小国. 基于分数阶滑模控制器的不确定分数阶混沌系统同步[J]. 应用数学学报, 2018, 41(6):12.

博主简介:擅长智能优化算法、神经网络预测、信号处理、元胞自动机、图像处理、路径规划、无人机等多种领域的Matlab仿真,相关matlab代码问题可私信交流。

部分理论引用网络文献,若有侵权联系博主删除。

  • 0
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

matlab科研助手

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

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

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

打赏作者

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

抵扣说明:

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

余额充值