使用體會:
在模擬的時候適合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的誤差。
wkp_1 = 1; %初始化權重
wki_1 = 1;
wkd_1 =100;
加入神經網路
xiteP = 0.5; %定義學習速率
xiteI = 0.5;
xiteD = 0.5;
程序:
神經元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);
推薦閱讀: