基于麻雀算法,调控PID参数

最近研究了智能算法,略有收获,下面说一下我的收获,如有错误,请大家批评指正,不胜感激。

因目前主流麻雀算法主要以matlab进行展示,但为了理解更加深入,我以C#重新进行书写并展示。

目的:以麻雀算法计算一个最优PID参数,用来控制一个函数模型,使输出波形与输入波形一致。如下图所示:

当输入波形是一个正弦函数时,受不同PID参数的影响,输出波形也截然不同。如下图,这是我随意设置的一个函数模型,随便整了个PID参数进行控制后的结果:

输入波形 :Finput(x)= 100*sin(x);

PID控制器参数:kp:0.052,ki:0.043,kd:0.048

函数模型:

输出波形 即:

底层框架就是这些,以人工经验,多次调整PID参数后,应该可以得出一个优解,但今天主题是麻雀算法,所以在这些底层函数上,需要以麻雀算法计算出一个最优解。

根据网上大多数人对麻雀算法的拆分,可以将麻雀算法分为四个部分:

发现者、追随者、报警者、以及适应度函数

主要逻辑就是随机生成100(种群数量)个PID参数组,然后带入适应度函数计算出最优适应度,然后根据发现者、追随者、报警者三个公式计算更新PID参数,然后不断排列取优,在经过多次迭代后,取出最优解。

前三者网上都有固定的公式,只要将其套入使用,基本没有什么差别。公式详情可以百度,可以参考下面的连接,至于用C#如何实现可以看我的代码。

(46条消息) 基于麻雀算法求解函数最优解_小小初心的博客-CSDN博客

主要是适应度函数,如何在PID控制器中成立,这里我借鉴了下面这位大哥的文章:

(46条消息) 智能优化算法应用:基于麻雀搜索算法PID参数优化 - 附代码_智能算法研学社(Jack旭)的博客-CSDN博客_pid优化算法

实现方法也很简单粗暴,如下描述:

将PID参数带入底层模型运行10个周期,即可计算出适应度Fout大小。

 完工后,对C#的窗体进行操作,再加个定时器就可以看到麻雀算法迭代时的PID参数对曲线的影响了:如下

这是麻雀算法第一次迭代生成的PID参数组,对函数模型的影响,可以看出完全没有正弦的样子,适应度Fout也达到了七百多万。

(下列红框中,2代表迭代次数,Fout:代表当前最优解的适应度大小,适应度越小代表曲线越近似正弦,后续三个参数分别是PID参数中的Kp、Ki、Kd。)

但是在经过100次迭代后,可以看到PID参数对曲线的影响,很快就取到了一个相对优秀的解。适应度由七百多万降低到了十八万左右(186818)。

 接下来我们看一千多次迭代后的PID参数组,可以看出此时的麻雀算法,已经算出了一个比较优秀的解,PID控制下的输出曲线也近似完美的正弦。适应度更是由十八万降低到俩万以下(19969

 再次迭代一千次后,如下图,适应度仅降低至19703,比一千次迭代前仅降低了266,说明整个麻雀算法已经收敛,目前输出已经近似最优解了,再迭代下去也影响不大。

如下图,我们迭代至五千次后,输出基本没有什么改变,适应度也仅降低至19701,整个麻雀算法已经完全收敛,再迭代下去也没有任何意义。当前PID参数组就是最适合目前函数模型的最优解。

下面我们来看一组动态图,看看麻雀算法迭代过程中的曲线变化趋势:

代码如下:

基于C#展示麻雀算法求PID控制器参数最优解-C#文档类资源-CSDN文库

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值