資源簡介
參照薛定宇教授《控制系統計算機輔助設計:MATLAB語言與應用》第二版中8.3.3章節中的內容編寫代碼和搭建模型,對書中代碼進行了部分修改,解決了權值初始化問題,采用二次選擇后的權值做初值,控制效果比較理想,并在代碼中編寫了比較詳細的注釋。

代碼片段和文件信息
function?[sysx0strts]=nnbp_pid(txuflagTnhxitealfakF1kF2)
%T是采樣時間,nh是隱含層數量,xite是學習率,alfa是動量因子,kF1和kF2的值分別來選擇隱含層和輸出層的激活函數
%以上參數在雙擊main中BP_PID模塊后可以設置
switch?flag?
????
case?0?[sysx0strts]?=?mdlInitializeSizes(Tnh);?
case?3?sys?=?mdlOutputs(txuTnhxitealfakF1kF2);?
case?{1?2?4?9}sys?=?[];?
otherwise?error([‘Unhandled?flag?=‘num2str(flag)]);
????
end;
%?初始化函數
function?[sysx0strts]?=?mdlInitializeSizes(Tnh)
sizes?=?simsizes;?
%?讀入模板,得出默認的控制量
sizes.NumContStates?=?0;
sizes.NumDiscStates?=?0;
sizes.NumOutputs?=?4+7*nh;
%輸出包括ukpkikdwi(4*nh)個及wo(3*nh)個
sizes.NumInputs?=?7+14*nh;
%輸入包括error(k)error(k-1)error(k-2)yout(k)yout(k-1)...
%rinu(k-1)wi_2(4*nh)個wo_2(3*nh)wi_1(4*nh)個及wo_1(3*nh)個
sizes.DirFeedthrough?=?1;
sizes.NumSampleTimes?=?1;
sys?=?simsizes(sizes);
x0?=?[];
str?=?[];
ts?=?[T?0];
%?系統輸出計算函數
function?sys?=?mdlOutputs(txuTnhxitealfakF1kF2)
wi_2=reshape(u(8:7+4*nh)nh4);
wo_2=reshape(u(8+4*nh:7+7*nh)3nh);
wi_1=reshape(u(8+7*nh:7+11*nh)nh4);
wo_1=reshape(u(8+11*nh:7+14*nh)3nh);
%權值更新,但有初始化問題(若不初始化,權值初值均為0,pid三個參數經過計算會一直保持為0.5)
%?if?sum(wi_2)==0??%初始化
%?????wi_2=0.5*rands(nh4);
%?????wo_2=0.5*rands(3nh);
%?????wi_1=0.5*rands(nh4);
%?????wo_1=0.5*rands(3nh);
%?end
%以上注釋的if---end部分為隨機初始權值,效果不理想,采用以下代碼對權值進行二次選擇后作為初始權值,效果比較理想
%w_data.mat文件為權值隨機初始化,輸出穩定后確定的權值數據,可以load后作為網絡初始權值,控制效果比較理想
if?sum(wi_2)==0??%權值二次選擇后初始化
????load?w_data;?
????u=WW‘;???????%WW里面前7個數據沒有用,只是為了保持代碼一致,隨機給賦了7個值
????wi_2=reshape(u(8:7+4*nh)nh4);
????wo_2=reshape(u(8+4*nh:7+7*nh)3nh);
????wi_1=reshape(u(8+7*nh:7+11*nh)nh4);
????wo_1=reshape(u(8+11*nh:7+14*nh)3nh);
end
??
xi=[u([641])‘?1];?%xi=[rinyouterror1]
xx=[u(1)-u(2);u(1);u(1)+u(3)-2*u(2)];?%增量式PID三個本量
I=xi*wi_1‘;
Oh=non_transfun(IkF1);?
K=non_transfun(wo_1*Oh‘kF2);
uu=u(7)+K‘*xx;
dyu=sign((u(4)-u(5))/(uu-u(7)+0.0000001));
dK=non_transfun(K3);??%輸出層激活函數的導數
delta3=u(1)*dyu*xx.*dK;
wo=wo_1+xite*delta3*Oh+alfa*(wo_1-wo_2);
dO=2*non_transfun(I3);??%隱含層激活函數的導數
wi=wi_1+xite*(dO.*(delta3‘*wo))‘*xi+alfa*(wi_1-wi_2);
sys=[uu;?K;wi(:);wo(:)];??%輸出數量為4+7*nh
%?激活函數及導數
function?W1=non_transfun(Wkey)
switch?key?
case?1?W1=(exp(W)-exp(-W))./(exp(W)+exp(-W));?%隱層激活函數
case?2?W1=exp(W)./(exp(W)+exp(-W));???????????%輸出層激活函數
case?3?W1=2./(exp(W)+exp(-W)).^2;?????????????%輸出層激活函數的導數
end
?屬性????????????大小?????日期????時間???名稱
-----------?---------??----------?-----??----
?????文件???????2654??2018-11-07?19:46??sfunction_Cnnbp_pid.m
?????文件????????772??2018-11-01?21:08??w_data.mat
?????文件??????16239??2018-11-07?19:53??main.slx
-----------?---------??----------?-----??----
????????????????19665????????????????????3
- 上一篇:雙饋風電機組
- 下一篇:邁克爾遜實驗matlab仿真
評論
共有 條評論