神經(jīng)元PID
單神經(jīng)元結(jié)構(gòu)
??單神經(jīng)元含有n個(gè)輸入,僅1個(gè)輸出,每個(gè)輸入端可記作
x
i
(
i
=
1
,
2
,
.
.
.
n
)
x_i (i=1,2,...n)
xi?(i=1,2,...n),若該神經(jīng)元為多元組成網(wǎng)絡(luò)中某一層(輸入層/輸出層/隱含層)其中的一個(gè)單元,記該神經(jīng)元輸出為
o
j
(
j
=
1
,
2
,
.
.
.
)
o_j(j=1,2,...)
oj?(j=1,2,...);不同輸入端進(jìn)入該單元的連接權(quán)值不同,記作
ω
i
j
\omega_{ij}
ωij?,表示連接第
j
j
j個(gè)神經(jīng)元的第
i
i
i個(gè)輸入端的連接權(quán)值。
??另外,神經(jīng)元在接收多個(gè)輸入時(shí),應(yīng)有累加-整合的過程,即先有:
n
e
t
j
=
∑
i
=
1
n
ω
i
j
?
x
i
j
net_j=\sum_{i=1}^n\omega_{ij}\cdot x_{ij}
netj?=∑i=1n?ωij??xij?,再經(jīng)歷:
o
j
=
f
(
n
e
t
j
)
o_j=f(net_j)
oj?=f(netj?)才得到輸出。累加運(yùn)算也可表述為矩陣運(yùn)算形式如:n維權(quán)向量
ω
j
\omega_j
ωj?的轉(zhuǎn)置(列向量)與n維輸入向量
x
j
x_j
xj?(行向量)相乘,得到標(biāo)量
n
e
t
j
net_j
netj?,即有:
n
e
t
j
=
ω
j
T
?
x
j
(1)
net_j=\omega_j^T\cdot x_j\tag{1}
netj?=ωjT??xj?(1)
??整合
n
e
t
j
net_j
netj?的
f
f
f即稱為激活函數(shù),可選用各種有閾值限制的非線性函數(shù),如常用的有:切換函數(shù)
f
(
n
e
t
)
=
s
g
n
(
n
e
t
)
f(net)=sgn(net)
f(net)=sgn(net)、反正切函數(shù)
f
(
n
e
t
)
=
a
t
a
n
(
n
e
t
)
f(net)=atan(net)
f(net)=atan(net),等等。
學(xué)習(xí)規(guī)則
??神經(jīng)元/神經(jīng)網(wǎng)絡(luò)的學(xué)習(xí)規(guī)則,即修正(更新)連接權(quán)值所選用的算法,可分類為有監(jiān)督學(xué)習(xí)或無監(jiān)督學(xué)習(xí)。
無監(jiān)督Hebb學(xué)習(xí)
??連接權(quán)值的修正與輸入
x
i
x_i
xi?和輸出
o
j
o_j
oj?的乘積成正比,即有:
Δ
ω
i
j
(
k
)
=
η
?
(
x
i
(
k
)
?
o
j
(
k
)
)
(2)
\Delta\omega_{ij}^{(k)}=\eta\cdot (x_i^{(k)}\cdot o_j^{(k)}) \tag{2}
Δωij(k)?=η?(xi(k)??oj(k)?)(2)
有監(jiān)督Delta學(xué)習(xí)
??在無監(jiān)督Hebb的基礎(chǔ)上,引入教師信號(hào),將輸出
o
j
o_j
oj?替換為實(shí)際輸出
o
j
o_j
oj?相對(duì)期望輸出
d
j
d_j
dj?的誤差,即有:
Δ
ω
i
j
(
k
)
=
η
?
[
x
i
(
k
)
?
(
d
j
(
k
)
?
o
j
(
k
)
)
]
(3)
\Delta\omega_{ij}^{(k)}=\eta\cdot [x_i^{(k)}\cdot (d_j^{(k)}-o_j^{(k)})] \tag{3}
Δωij(k)?=η?[xi(k)??(dj(k)??oj(k)?)](3)
有監(jiān)督Hebb學(xué)習(xí)
??結(jié)合無監(jiān)督Hebb和有監(jiān)督Delta,即連接權(quán)更新正比于輸入、輸出、輸出誤差的乘積,即有:
Δ
ω
i
j
(
k
)
=
η
?
[
(
d
j
(
k
)
?
o
j
(
k
)
)
?
x
i
(
k
)
?
o
j
(
k
)
]
(4)
\Delta\omega_{ij}^{(k)}=\eta\cdot[(d_j^{(k)}-o_j^{(k)})\cdot x_i^{(k)} \cdot o_j^{(k)}] \tag{4}
Δωij(k)?=η?[(dj(k)??oj(k)?)?xi(k)??oj(k)?](4)
上述各式中:
??上角標(biāo)
(
k
)
(k)
(k)表示當(dāng)前的迭代輪次;
Δ
ω
i
j
\Delta\omega_{ij}
Δωij?為計(jì)算得的連接權(quán)值的修正量,即有:
ω
i
j
(
k
+
1
)
=
ω
i
j
(
k
)
+
Δ
ω
i
j
(
k
+
1
)
(5)
\omega_{ij}^{(k+1)}=\omega_{ij}^{(k)}+\Delta\omega_{ij}^{(k+1)}\tag{5}
ωij(k+1)?=ωij(k)?+Δωij(k+1)?(5)
神經(jīng)元PID控制過程
輸入更新
??對(duì)于單神經(jīng)元PID控制而言,我們的目的是要自適應(yīng)地更新三個(gè)控制器參數(shù)Kp,Ki,Kd,輸入維數(shù)n=3;而PID控制器的輸入量與傳統(tǒng)PID一樣,為當(dāng)前被控對(duì)象的實(shí)際輸出
y
(
k
)
y^{(k)}
y(k)相對(duì)目標(biāo)輸出
y
d
(
k
)
y_d^{(k)}
yd(k)?的誤差,即有:
e
(
k
)
=
y
d
(
k
)
?
y
(
k
)
(6)
e^{(k)}=y_d^{(k)}-y^{(k)}\tag{6}
e(k)=yd(k)??y(k)(6)
??若PID控制器模式選用增量式PID,即$\Delta u^{(k)}=K_p \cdot (e{(k)}-e{(k-1)})+K_i \cdot
對(duì)于神經(jīng)元輸入
對(duì)于神經(jīng)元輸入
對(duì)于神經(jīng)元輸入x_{ij}$,應(yīng)有:
x
1
j
(
k
)
=
e
(
k
)
?
e
(
k
?
1
)
x
2
j
(
k
)
=
e
(
k
)
x
3
j
(
k
)
=
e
(
k
)
?
2
e
(
k
?
1
)
+
e
(
k
?
2
)
(7)
\begin{aligned} &x_{1j}^{(k)}=e^{(k)}-e^{(k-1)}\tag{7} \\ &x_{2j}^{(k)}=e^{(k)} \\ &x_{3j}^{(k)}=e^{(k)}-2e^{(k-1)}+e^{(k-2)} \end{aligned}
?x1j(k)?=e(k)?e(k?1)x2j(k)?=e(k)x3j(k)?=e(k)?2e(k?1)+e(k?2)?(7)
連接權(quán)值更新、歸一化
??在已有更新的輸入值
x
i
j
(
k
)
x_{ij}^{(k)}
xij(k)?和已有的輸出值
o
j
(
k
?
1
)
o_j^{(k-1)}
oj(k?1)?后,即可更新本輪次神經(jīng)元運(yùn)算需用到的連接權(quán)值
ω
i
j
(
k
\omega_{ij}^{(k}
ωij(k?;設(shè)選用了有監(jiān)督的Hebb學(xué)習(xí)規(guī)則,即同時(shí)調(diào)用了本輪更新的輸出誤差
e
(
k
)
e^{(k)}
e(k),則有:
ω
1
j
(
k
)
=
ω
1
j
(
k
?
1
)
+
η
p
?
[
e
(
k
)
?
x
1
(
k
)
?
o
j
(
k
?
1
)
]
ω
2
j
(
k
)
=
ω
2
j
(
k
?
1
)
+
η
i
?
[
e
(
k
)
?
x
2
(
k
)
?
o
j
(
k
?
1
)
]
ω
3
j
(
k
)
=
ω
3
j
(
k
?
1
)
+
η
d
?
[
e
(
k
)
?
x
3
(
k
)
?
o
j
(
k
?
1
)
]
(11)
\begin{aligned} &\omega_{1j}^{(k)}=\omega_{1j}^{(k-1)}+\eta_p\cdot[e^{(k)}\cdot x_1^{(k)} \cdot o_j^{(k-1)}]\tag{11} \\ &\omega_{2j}^{(k)}=\omega_{2j}^{(k-1)}+\eta_i\cdot[e^{(k)}\cdot x_2^{(k)} \cdot o_j^{(k-1)}] \\ &\omega_{3j}^{(k)}=\omega_{3j}^{(k-1)}+\eta_d\cdot[e^{(k)}\cdot x_3^{(k)} \cdot o_j^{(k-1)}] \end{aligned}
?ω1j(k)?=ω1j(k?1)?+ηp??[e(k)?x1(k)??oj(k?1)?]ω2j(k)?=ω2j(k?1)?+ηi??[e(k)?x2(k)??oj(k?1)?]ω3j(k)?=ω3j(k?1)?+ηd??[e(k)?x3(k)??oj(k?1)?]?(11)
式中,
η
p
\eta_p
ηp?、
η
i
\eta_i
ηi?、
η
d
\eta_d
ηd?分別為神經(jīng)元PID的比例項(xiàng)、積分項(xiàng)、微分項(xiàng)的學(xué)習(xí)速率。
??在得到上述更新的連接權(quán)值
ω
i
j
(
k
)
\omega_{ij}^{(k)}
ωij(k)?后,還需要做類似于單位化的歸一化操作,即有:
ω
i
j
(
k
)
=
ω
i
j
(
k
)
/
∑
i
=
1
n
∣
ω
i
j
(
k
)
∣
,
i
=
1
,
2
,
3
(10)
\omega_{ij}^{(k)}=\omega_{ij}^{(k)}/ \sum_{i=1}^n \lvert\omega_{ij}^{(k)} \rvert ,i=1,2,3\tag{10}
ωij(k)?=ωij(k)?/i=1∑n?∣ωij(k)?∣,i=1,2,3(10)
??不難理解可知,一直在更新并用于與式(7)所示的
x
1
j
x_{1j}
x1j?、
x
2
j
x_{2j}
x2j?、
x
3
j
x_{3j}
x3j?相乘再累加的連接權(quán)值
ω
1
j
\omega_{1j}
ω1j?、
ω
2
j
\omega_{2j}
ω2j?、
ω
3
j
\omega_{3j}
ω3j?,乘上神經(jīng)元比例系數(shù)
?
\epsilon
?,即是我們神經(jīng)元PID的自適應(yīng)參數(shù)
K
p
K_p
Kp?、
K
i
K_i
Ki?、
K
d
K_d
Kd?。
輸出更新
??單神經(jīng)元的輸出如同普通PID一樣,為輸入到被控對(duì)象的供給量
u
u
u(控制器輸出,即控制律),即經(jīng)過神經(jīng)元,輸出得到控制律
u
(
k
)
u^{(k)}
u(k)變化量。另外,當(dāng)前輪次k用到的是當(dāng)前輪次k的輸入、連接權(quán),即有:
n
e
t
j
(
k
)
=
∑
i
=
1
n
ω
i
j
(
k
)
?
x
i
j
(
k
)
(8)
net_j^{(k)}=\sum_{i=1}^n\omega_{ij}^{(k)}\cdot x_{ij}^{(k)}\tag{8}
netj(k)?=i=1∑n?ωij(k)??xij(k)?(8)
??整合函數(shù)無非線性要求,直接成比例輸出,則控制律更新有:
u
(
k
)
=
u
(
k
?
1
)
+
?
?
n
e
t
j
(
k
)
(9)
u^{(k)}=u^{(k-1)}+\epsilon\cdot net_j^{(k)}\tag{9}
u(k)=u(k?1)+??netj(k)?(9)
式中,
?
\epsilon
?為神經(jīng)元的比例系數(shù)。當(dāng)然,神經(jīng)元輸出符號(hào)代換有:
o
j
(
k
)
=
u
(
k
)
(10)
o_j^{(k)}=u^{(k)}\tag{10}
oj(k)?=u(k)(10)
??上述各part表達(dá)為控制流圖,即如下所示:
![]
代碼實(shí)現(xiàn)和展示
主程序
??編寫成Matlab代碼,程序框架(主程序)如下所示:
close all;clear
% 迭代次數(shù):
Num=2000;
% 迭代周期:
T=0.001; % T=0.01s
% 連接權(quán)值初始化:
omega=[0.1,0.1,0.1];
% 輸入變量初始化:
x=[0,0,0]';
% 輸出變量初始化:
u(1)=0; % u(k)
u_1=0; % u(k-1)
u_2=0; % u(k-2)
u_3=0; % u(k-3)
net=0; % net=omega'*x; u(k)=u(k-1)+eps*net
y(1)=0; % 被控對(duì)象實(shí)際輸出
y_1=0; % y(k-1)
y_2=0; % y(k-2)
% 誤差變量初始化:
err_0(1)=0; % e(k)
err_1=0; % e(k-1)
err_2=0; % e(k-2)
% 控制律輸出限幅:
u_max=1.2;
u_min=-1.2;
% 神經(jīng)元參數(shù)設(shè)置:
eps=0.12; % 神經(jīng)元比例系數(shù)
eta_p=0.4; % 比例項(xiàng)學(xué)習(xí)速率
eta_i=0.35; % 積分項(xiàng)學(xué)習(xí)速率
eta_d=0.4; % 微分項(xiàng)學(xué)習(xí)速率
w1(1)=0;
w2(1)=0;
w3(1)=0;
%%% 進(jìn)入控制-訓(xùn)練輪次:
for k=1:Num
% 目標(biāo)輸出:
yd(k)=Target_Oput(k,T);
% 輸入到被控對(duì)象,實(shí)際輸出:
y(k)=Controlled_Obj(y_2,y_1,u_2,u_1);
% 計(jì)算輸出誤差:
err_0(k)=yd(k)-y(k);
% (神經(jīng)元)輸入更新:
x(1)=err_0(k)-err_1;
x(2)=err_0(k);
x(3)=err_0(k)-2*err_1+err_2;
% (神經(jīng)元)連接權(quán)值更新
omega=Hebb_Learning(omega,eta_p,eta_i,eta_d,...
err_0(k),x,u_1);
omega=Omega_Norm(omega);
% (神經(jīng)元)輸出更新:
u(k)=u_1+eps*omega*x; % 輸出控制律
if(u(k)>u_max) u(k)=u_max;
elseif(u(k)<u_min) u(k)=u_min;end
% 誤差序列更新:
err_2=err_1;
err_1=err_0(k);
% 控制序列更新:
u_3=u_2;
u_2=u_1;
u_1=u(k);
% 輸出序列更新:
y_2=y_1;
y_1=y(k);
% 用于顯示Kp,Ki,Kd:
w1(k)=eps*omega(1);
w2(k)=eps*omega(2);
w3(k)=eps*omega(3);
end
%%% 畫圖展示:
time=T:T:Num*T;
figure % 輸出響應(yīng)
plot(time,yd,'r');hold on;
plot(time,y,'b');title("輸出響應(yīng)");
ylabel('yt');xlabel('time');legend('目標(biāo)輸出-yd','實(shí)際輸出-y');
figure % 誤差響應(yīng)+控制律變化
subplot(2,1,1);plot(time,err_0,'-r');title("誤差響應(yīng)");
ylabel('error');xlabel('time');
subplot(2,1,2);plot(time,u,'-g');title("控制律變化");
ylabel('ut');xlabel('time');
figure % PID參數(shù)變化
subplot(3,1,1);plot(time,w1,'r');ylabel('Kp');title("PID參數(shù)");
subplot(3,1,2);plot(time,w2,'b');ylabel('Ki');
subplot(3,1,3);plot(time,w3,'k');ylabel('Kd');xlabel('time');
子函數(shù)——連接權(quán)值更新(使用有監(jiān)督Hebb學(xué)習(xí)規(guī)則)
??在每輪神經(jīng)元運(yùn)算之前,更新連接權(quán)值 ω i j \omega_{ij} ωij?,這里示例用的是有監(jiān)督Hebb學(xué)習(xí)規(guī)則,對(duì)應(yīng)公式(11),如下所示:
function [omega_new]=Hebb_Learning(omega,eta_p,eta_i,eta_d,...
err,x,u)
w1=omega(1);
w2=omega(2);
w3=omega(3);
x1=x(1);
x2=x(2);
x3=x(3);
if err>1;err=-err;end % 隨便加的,合法有效但有病
w1=w1+eta_p*(err*x1*u);
w2=w2+eta_i*(err*x2*u);
w3=w3+eta_d*(err*x3*u);
omega_new=[w1,w2,w3];
end
子函數(shù)——連接權(quán)值歸一化
??對(duì)應(yīng)公式(10),完成連接權(quán)值 ω i j \omega_{ij} ωij?更新后的歸一化(單位化)步驟,如下所示:
function [omega_new]=Omega_Norm(omega)
w1=omega(1);
w2=omega(2);
w3=omega(3);
wsum=abs(w1)+abs(w2)+abs(w3);
w1=w1/wsum;
w2=w2/wsum;
w3=w3/wsum;
omega_new=[w1,w2,w3];
end
子函數(shù)——目標(biāo)輸出設(shè)置
??設(shè)計(jì)跟蹤目標(biāo)輸出為上下幅值為±1的正負(fù)階躍信號(hào)(方波信號(hào)),如下示例有:
function [yd_k]=Target_Oput(k,T)
yd_k=sign(sin(2*pi*k*T));
% yd_k=sin(2*pi*k*T);
end
??注釋中的是將目標(biāo)輸出切換為正弦函數(shù) y d = s i n ( 2 π t ) y_d =sin(2\pi t) yd?=sin(2πt),你也可以試著復(fù)現(xiàn)下看看效果~
子函數(shù)——控制對(duì)象設(shè)置
??相當(dāng)于我們?cè)诳刂葡到y(tǒng)中所見到的傳遞函數(shù)G(s)的部分,只不過這里的對(duì)象是離散系統(tǒng),并且將該數(shù)學(xué)描述換用了狀態(tài)空間表達(dá)式的形式,具體怎么推導(dǎo)的可以看看我這段子程序開頭的注釋,如下有:文章來源:http://www.zghlxwxcb.cn/news/detail-597835.html
% 被控對(duì)象的狀態(tài)空間表達(dá)式:
% dx=A*x+B*u;
% 令x1=y(k-2),x2=y(k-1),則:dx1=y(k-1)=x2,dx2=y(k);
% y(k-1)=[0 1]*[y(k-2) y(k-1)]'+0*u,不用寫;
% y(k)=[a21 a22]*[y(k-2) y(k-1)]'+[b21 b22]*[u2 u1]';
% u1=u(k-1),u2=u(k-2);
function [y_k]=Controlled_Obj(y_2,y_1,u_2,u_1)
y_k=0.26*y_2+0.368*y_1+0.632*u_2+0.1*u_1;
end
運(yùn)行結(jié)果展示
運(yùn)行結(jié)果展示
??運(yùn)行主程序代碼(程序要“添加到路徑”),輸出該單神經(jīng)元PID控制仿真結(jié)果(使用的是有監(jiān)督Hebb學(xué)習(xí)規(guī)則),跟蹤三個(gè)上下擺動(dòng)周期,如下所示:
??目標(biāo)輸出–實(shí)際輸出跟蹤曲線:
??輸出誤差曲線+控制律輸入曲線
??P-I-D系數(shù)迭代變化曲線
??文章來源地址http://www.zghlxwxcb.cn/news/detail-597835.html
未完待續(xù) ~ ~
到了這里,關(guān)于自適應(yīng)PID算法學(xué)習(xí)(01)——單神經(jīng)元PID控制的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!