【粒子群算法整定PID参数】MATLAB2016b(02一些细节问题)

此帖主要针对01帖的细节方面

很抱歉更新的晚了,现在我对01帖发布到现在,用粒子群算法整定PID参数时存在的细节问题进行讲解,以便于帮助大家学会此方法,降低整定参数的难度。


问题一:matlab函数使用问题

这个问题主要针对MATLAB的初学者:
matlab中函数的使用,一般定义一个function,这样可以直接调用使用。我们知道整定参数时要计算参数的适应度,在我的代码中便是通过定义一个function,来获得参数的适应度,以便用于判断当前参数的优劣。所以要明白函数的调用方法。

function z = pso_pid(kp,ki,kd)
%赋值运行且返回参数适应度
%assigin函数,作用是可在m文件里控制simulink,对变量kp进行赋值
assignin('base','kp',kp);
assignin('base','ki',ki);
assignin('base','kd',kd);
try  %% 用于应对simulink仿真异常,返回一个极大值作为适应度,表明当前参数很差
    y_out=sim('l.slx',[0,10]);    %sim函数,可运行siumlink模型,[0,10]代表仿真10s
    z=simout1.data(end,1);		  %适应度用返回给z
catch
    z=1e6;						  %如果异常,就返回1e6。通常异常都是由于参数太差引起的。
end

问题二:仿真运行框中一直出现警报

警报是由于仿真模型部分连接问题或者参数问题:

1.仿真模型连接不完全,有时也会引起警报,但并不影响仿真运行。
2.参数整定的迭代过程中,出现很不符合系统的参数,导致仿真不收敛等情况而出现警报,这会影响仿真运行。
警报图片

解决方案:

出现警报时,同时查看显示波形的示波器:
如果正常运行,则是第一种情况,警报可以忽略。

如果示波器发现仿真卡在某个时间点或者仿真运行很慢,则是第二种情况,此时需要点示波器上的停止按钮,跳过此次仿真。但这样会导致该参数对应的适应度很优秀,这时,我们可以重新设计一个适应度函数,来使它的适应度变的很差。
点击暂停,跳过此次仿真

问题三:为什么整参时很容易出现适应度都是1e6的情况

1.定义的function中有bug,返回适应度值有问题。
2.算法初始取定的参数范围有问题。

1解决方案

.返回函数的问题,即sim函数的问题,一般的代码如下

	y_out=sim('l.slx',[0,10]);    %sim函数,可运行siumlink模型,[0,10]代表仿真10s
    z=simout1.data(end,1);	%simout是simulink中的一个模块,可以记录数值并可以通过m文件得到

这时可能发生bug,y_out是一个结构体,当用z=simout1.data(end,1)时,会出现找不到这个值,所以就会出现异常,z也就取了我们设定的1e6,这样就无法区分参数的优劣。
代码改为如下,可以避免这个BUG

    s_out=sim('zitai_sliding.slx',[0,15]);    %使用命令行运行控制系统模型
    yout=s_out.get('simout');
    z=yout.data(end,1);

2解决方案

如果是电脑性能好,时间足,可以通过增大种群数和迭代次数来克服。但仍要先给出一个粗略的参数可能的取值范围,这样不容易产生令仿真出现异常的参数,同时也可以更大概率的获得全局最优参数。对于不同的系统,仍需要手动调试,这样会避免后续出现的问题、

gens=100;
np=80;
nd=3;
%范围
kpmax=0.1;
kpmin=0;
kimax=0.05;
kimin=0;
kdmax=0.04;
kdmin=0;

这是我自己之前调的一个系统,刚开始定义的参数范围特别大,便让程序开始跑了,结果跑完了发现没有合适的解,这就说明我定义的pid参数范围根本不符合系统。再加上我的种群数量又小,很容易产生不出来适合的解,从而导致一直在非可行域打转。
最后还是通过对被控系统分析了一下,才知道参数不能取的过大,于是我慢慢缩小范围,然后用算法跑,来获得了较优的可行解。
因此,我们在进行参数范围设定时,很有必要花费一点时间手动调试一下适合系统的参数范围,找出一个可行范围,再利用算法跑,这样极不容易出现仿真卡顿,而且粒子群算法的寻优速度快的优势也会被很好的表现出来。

最后

如果仍然难以处理的bug,还没有学会此方法,欢迎加q320820676。
免费提供:简单仿真模型+代码
有偿:包教会,帮调PID、SMC、ADRC模型参数


后续跟新粒子群算法整定ADRC参数

  • 9
    点赞
  • 26
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 5
    评论
粒子算法(Particle Swarm Optimization, PSO)是一种常用的优化算法,可以用于整一阶系统的PID参数。下面是使用MATLAB实现粒子算法一阶系统PID参数的简要步骤: 1. 义目标函数:首先要义一个目标函数,即衡量系统输出与期望输出之间误差的函数。对于一阶系统,常用的目标函数可以是最小二乘法的均方根误差(Root Mean Square Error, RMSE)。目标函数的输入为PID参数,输出为系统输出与期望输出之间的误差。 2. 设参数范围和粒子个数:需要设每个PID参数的搜索范围,以及粒子群个数。对于PID参数,一般来说,比例增益Kp、积分时间Ti和微分时间Td的取值范围需要根据具体系统进行调整。粒子个数一般建议设置为几十到上百个。 3. 初始化粒子群:对于每个粒子,通过随机数生成对应的PID参数。同时,需要设每个粒子的速度和最佳位置,并用于记录全局最佳位置和对应的误差。 4. 更新粒子速度和位置:根据粒子算法的原理,需要根据当前位置和速度,以及全局最佳位置和个体最佳位置的差异,来更新粒子的速度和位置。一般来说,速度更新采用线性加权算法,位置更新采用微分方程求解方法。 5. 计算目标函数值:根据新的粒子位置,计算目标函数的值,并与全局最佳位置对应的误差进行比较。如果粒子的位置得到了改进,更新个体最佳位置和全局最佳位置。 6. 终止条件判断:可以设一个迭代次数的上限,或者设目标函数的阈值。当达到设的终止条件后,终止迭代并输出全局最佳位置和对应的PID参数。 7. 调整PID参数:根据全局最佳位置,得到最优的PID参数。可以将这些参数应用到实际的一阶系统中进行测试。 需要注意的是,整PID参数是一个复杂的过程,需要根据具体的系统特性进行调整和优化。上述步骤仅为粒子算法一阶系统PID参数的一种基本思路。实际应用中,可能需要根据具体问题进行一些调整和改进。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

its rainbow

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

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

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

打赏作者

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

抵扣说明:

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

余额充值