使用體會

在模擬的時候適合pid調的很差的情況,如果pid本身調的就可以了,那麼使用神經元pid控制,效果不會有太大改善。

1.學習規則

1.1概念:

學習規則

神經元激活值

權值更新梯度

學習率

1.2關係:

學習規則即:計算權值更新梯度的方法,此方法一般為學習率神經元激活值的組合

1.3學習規則實例:

2.神經網路PID

2.1概念:

P I D、權值更新、誤差

輸入、輸出

學習規則

2.2關係:

1.下述的x1x2x3即為增量式PID(比例積分微分的值),他們與誤差的關係如下圖所示。

2.權值即為PID值的係數。

3.權值更新是根據上述學習規則進行的。

4.輸入 u(k)=u(k-1)+w1p+w2i+w3*d

5.神經網路PID的參數學習是一個學習規則的一個實例。pid的參數為權值,pid的值為輸出神經元,系統的給定值為輸入神經元。

由於誤差值=輸出-期望,但是x1,x2,x3的期望值是未知的,而由於y是他們的線性疊加,因此可以通過y的誤差反應x1,x2,x3的誤差。

3.模擬

wkp_1 = 1; %初始化權重

wki_1 = 1;

wkd_1 =100;

加入神經網路

xiteP = 0.5; %定義學習速率

xiteI = 0.5;

xiteD = 0.5;

wkp_1 = 1; %初始化權重

wki_1 = 1;

wkd_1 =100;

程序:

神經元pid函數:

function [u,po,io,do] = fcn(e)
%UNTITLED2 此處顯示有關此函數的摘要
% 此處顯示詳細說明
persistent ell;
if isempty(ell)
ell=0;
end
persistent el;
if isempty(el)
el=0;
end
persistent ul;
if isempty(ul)
ul=0;
end

persistent p;
if isempty(p)
p=1;
end
persistent i;
if isempty(i)
i=1;
end
persistent d;
if isempty(d)
d=100;
end
persistent p_l;
if isempty(p_l)
p_l=1;
end
persistent i_l;
if isempty(i_l)
i_l=1;
end
persistent d_l;
if isempty(d_l)
d_l=100;
end

%%定義學習率
a_p=0;
a_i=0;
a_d=0;

p_value=e-el;
i_value=e;
d_value=e-2*el+ell;

K = 0.12;

%%更新pid的參數,此部分是神經元pid區別於pid的主要部分
p_l=p_l+a_p*e*ul*p_value;
i_l=i_l+a_i*e*ul*i_value;
d_l=d_l+a_d*e*ul*d_value;

pid_he=abs(p_l)+abs(i_l)+abs(d_l);
p=p_l/pid_he;
i=i_l/pid_he;
d=d_l/pid_he;

%%進行pid輸出計算
u_delta=p*p_value+i*i_value+d*d_value;
ul=ul+K*u_delta;
ell=el;
el=e;

po=p;
io=i;
do=d;
u=ul;
end
%主程序:
clc
x = [0,0,0]; %定義輸入矩陣
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; %定義時間步長5

for k=1:1:10000 %循環迭代
time(k) = k*ts; %時間為K*ts總時間也就是1
yd(k) = sin(k*ts); %目標值
if k==4000
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); %獲取誤差
[u(k),w11(k),w22(k),w33(k)]=fcn(erro(k));
u_3 = u_2;u_2 = u_1;u_1 = u(k);
y_3 = y_2;y_2 = y_1;y_1 = y(k);end

figure(1);

plot(time,yd,r,time,y,k,linewidth,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);

推薦閱讀:

相關文章