此帖主要针对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模型参数