您的位置:首页 > 编程语言 > MATLAB

基于单神经元的自适应PID算法实现步骤与MATLAB代码

2018-03-07 23:46 281 查看
        近期研究了下单神经元的自适应PID,发现挺有意思,这里我分享下自己的理解,文中的代码都是来自《先进PID控制MATLAB仿真》第四版 刘金琨编著。
        自适应PID的好处在于它的灵活性,而神经网络PID正是因为它的可学习性决定了他的强大性,该文章使用的仅是单神经元,本以为性能可能不会太好,但是仿真发现无论是上升时间亦或是超调量等指标都还不错,拿出来与大家分享。

        既然是神经网络PID那就不可以绕开神经网络,网上有很多这方面的讲解,我水平也没各位大神高,小弟就厚着脸皮说说自己的理解,要搞懂还是要去看看各位大神的文章。

       神经网络的基本组成是神经元,而神经元也称之为感知器,而貌似无论什么复杂的神经网络都是又这些感知器组成的,而本文章就是用单一感知器这一最基本的神经网络来实现的。
        鄙人认为神经网络就是通过不同的权重再经过激活函数来对获得结果,例如最经典的苹果香蕉的例子而至于详细的解释本文就不再叙述了,因为水平有限,不敢献丑,总结来说,神经网络的识别就是对输入施加不同的权重然后通过函数将结果筛选出来,而训练就是通过正确的样本对网络的权重不断更新来得到最合适的权重,有什么问题可以探讨的可通过文末的联系方式一起探讨。



                                                                                图一  单神经元PID的神经网络

图中神经网络的输入量有三个分别对应的是error-error1、error、error-2*error1-error2;因此不难看出该算法采用的是增量式PID。
公式:
                


其中x1(k) = e(k)-e(k-1); x2(k) = e(k); x3(k) = e(k)-2*e(k-1)+e(k-2); z(k) = e(k); 
其中K是神经元比例系数,K的选择很关键,K越大,快速性越好,但是超调量也大。而3、4、5则是网络的反向传播更新权重的公式。clear all;
clc
x = [0,0,0]'; %定义输入矩阵
xiteP = 0.4; %定义学习速率
xiteI = 0.35;
xiteD = 0.4;

wkp_1 = 0.1; %初始化权重
wki_1 = 0.1;
wkd_1 = 0.1;

erro_1 = 0; %初始化误差
erro_2 = 0;
y_1 = 0;y_2 = 0;y_3 = 0; %初始化被控对象模型
u_1 = 0;u_2 = 0;u_3 = 0;

ts = 0.001; %定义时间步长

for k=1:1:1000 %循环迭代
time(k) = k*ts; %时间为K*ts总时间也就是1
yd(k) = 1; %目标值
if k==100
y(k) = 0.368*y_1+0.264*y_2+0.1*u_1+0.632*u_2+0.2; %当迭代到100次加入扰动0.2
else
y(k) = 0.368*y_1+0.264*y_2+0.1*u_1+0.632*u_2; %被控对象模型
end
erro(k) = yd(k)-y(k); %获取误差

wkp(k) = wkp_1+xiteP*erro(k)*u_1*x(1); %更新权重
wki(k) = wki_1+xiteI*erro(k)*u_1*x(2);
wkd(k) = wkd_1+xiteD*erro(k)*u_1*x(3);
K = 0.12; %定义比例系数

x(1) = erro(k)-erro_1; %给输入矩阵赋值
x(2) = erro(k);
x(3) = erro(k)-2*erro_1+erro_2;

wadd(k) = abs(wkp(k))+abs(wki(k))+abs(wkd(k)); %将权重求和
w11(k) = wkp(k)/wadd(k); %得出P
w22(k) = wki(k)/wadd(k); %I
w33(k) = wkd(k)/wadd(k); %D
w = [w11(k),w22(k),w33(k)];

u(k) = u_1 + K*w*x; %增量式PID
erro_2 = erro_1; %e(k-2)
erro_1 = erro(k);%e(k-1)

u_3 = u_2;u_2 = u_1;u_1 = u(k);
y_3 = y_2;y_2 = y_1;y_1 = y(k);

wkp_1 = wkp(k); %w1(k-1)
wkd_1 = wkd(k);
wki_1 = wki(k);
end

figure(1);

plot(time,yd,'r',time,y,'k','linewidt
894c
h',2);%显示被控模型曲线和设定曲线
xlabel('time(s)');ylabel('yd,y');
legend('ideal position','position tracking');
figure(2);
plot(time,u,'r','linewidth',2); %显示输入PID输出曲线
xlabel('time(s)');ylabel('Control input');
figure(3);
plot(time,w11,'g',time,w22,'r',time,w33,'b','linewidth',2); %显示PID参数调整曲线
xlabel('time(s)');ylabel('PID');
legend('P','I','D');


                                     图2 yd、y曲线



                                          图3 u曲线



                                      图4 PID参数调整曲线
文献1:《先进PID控制MATLAB仿真》第四版 刘金琨编著
有问题探讨可邮件:lingrobepy@gmail.com
如需转载请联系本人,若有侵权可联系本人
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐