資源簡介
關于楊藝的那篇《基于S函數的BP神經網絡PID控制器及simulink仿真》,我自己在Matlab2016b搭建出來的SIMULINK模型,親測可用

代碼片段和文件信息
function?[sysx0strts]=my_exppidf(txuflag)
switch?flag
????case?0
????????[sysx0strts]=mdlInitializeSizes;
????case?2
????????sys=mdlUpdates(xu);
????case?3
????????sys=mdlOutputs(txu);
????case?{149}
????????sys=[];
????otherwise
????????error([‘unhandled?flag=‘num2str(flag)]);%異常處理
end
function[sysx0strts]=mdlInitializeSizes
????sizes=simsizes;%用于設置模塊參數的結構體用simsizes來生成
????sizes.NumContStates=0;%模塊連續狀態變量的個數
????sizes.NumDiscStates=3;%模塊離散狀態變量的個數
????sizes.NumOutputs=4;%模塊輸出變量的個數
????sizes.NumInputs=7;%模塊輸入變量的個數
????sizes.DirFeedthrough=1;%模塊是否存在直接貫通,1表示存在直接貫通,若為0,則mdlOutputs函數里不能有u
????sizes.NumSampleTimes=1;%模塊的采樣時間個數至少是一個
????sys=simsizes(sizes);%設置完后賦給sys輸出
????x0=zeros(31);%系統狀態變量設置
????str=[];
????ts=[0?0];%采樣周期設為0表示是連續系統,
%?????ts=[0.001?0];%采樣周期設為0表示是連續系統,
function?sys=mdlUpdates(xu)
????????T=0.001;
????????x=[u(5);x(2)+u(5)*T;(u(5)-u(4))/T];%3個狀態量(偏差、偏差和以及偏差變化量),u(5)是偏差,u(4)是上一次的偏差,x(2)則是之前的偏差和
????????sys=[x(1);x(2);x(3)];
function?sys=mdlOutputs(txu)
????????????xite=0.2;
????????????alfa=0.05;
????????????IN=3;H=5;OUT=3;
????????????wi=rand(53);%產生一個5*3的隨機數矩陣,隨機數在(0,1)區間
????????????wi_1=wi;wi_2=wi;wi_3=wi;
????????????wo=rand(35);
????????????wo_1=wo;wo_2=wo;wo_3=wo;
????????????Oh=zeros(51);%產生一個1*5的零矩陣(行矩陣)
????????????I=Oh;
????????????xi=[u(1)u(3)u(5)];%神經網絡訓練的3個輸入,期望值、誤差以及實際值
????????????epid=[x(1);x(2);x(3)];%3個狀態變量(偏差、偏差和、偏差變化量)(3*1矩陣,列向量)
????????????I=xi*wi‘;%隱層的輸入
????????????for?j=1:1:5
????????????????Oh(j)=(exp(I(j))-exp(-I(j)))/(exp(I(j))+exp(-I(j)));%隱層的輸出值(1*5矩陣)行矩陣
????????????end
????????????K1=wo*Oh;%輸出層的輸入(3*1矩陣)
????????????for?i=1:1:3
????????????????K(i)=exp(K1(i))/(exp(K1(i))+exp(-K1(i)));%得到輸出層的輸出(KP、KI、KD)(1*3矩陣,行向量)
????????????end
????????????u_k=K*epid;%計算得到控制律u,1個值
????????????%%以下是權值調整
????????????%隱含層至輸出層的權值調整
????????????dyu=sign((u(3)-u(2))/(u(7)-u(6)+0.0001));
????????????for?j=1:1:3
????????????????dK(j)=2/(exp(K1(j))+exp(-K1(j)))^2;?%輸出層的輸出的一階導
????????????end
????????????for?i=1:1:3
????????????????delta3(i)=u(5)*dyu*epid(i)*dK(i);??%輸出層的delta
????????????end
????????????for?j=1:1:3
????????????????for?i=1:1:5
????????????????????d_wo=xite*delta3(j)*Oh(i)+alfa*(wo_1-wo_2);
????????????????end
????????????end
????????????wo=wo_1+d_wo;
????????????%以下是輸入層至隱含層的權值調整
????????????for?i=1:1:5
????????????????dO(i)=4/(exp(I(i))+exp(-I(i)))^2;%(1*5矩陣)
????????????end
????????????segma=delta3*wo;%(1*5矩陣,行向量)
????????????delta2?=?dO.*segma;
????????????d_wi?=?delta2‘*xi+alfa*(wi_1-wi_2);
????????????wi=wi_1+d_wi;
????????????wo_3=wo_2;
????????????wo_2=wo_1;
????????????wo_1=wo;%儲存輸出層本次調整后的權值
????????????wi_3=wi_2;
????????????wi_2=wi_1;
????????????wi_1=wi;%儲存隱層本次調整后的權值
?????????Kp=K(1);Ki=K(2);Kd=K(3);
?????????sys=[u_kKpKiKd];???????
?屬性????????????大小?????日期????時間???名稱
-----------?---------??----------?-----??----
?????文件??????36686??2018-05-27?18:39??Matlab2016b\fig0.02.jpg
?????文件??????40098??2018-05-27?18:40??Matlab2016b\fig0.1.jpg
?????文件??????38329??2018-05-27?17:15??Matlab2016b\fig0.2.jpg
?????文件??????23874??2018-05-27?18:41??Matlab2016b\MyBPPID.slx
?????文件???????3251??2018-05-24?21:18??Matlab2016b\my_exppidf.m
?????文件?????160169??2018-05-27?18:53??Matlab2016b\必讀.docx
?????目錄??????????0??2018-05-27?18:53??Matlab2016b
-----------?---------??----------?-----??----
???????????????302407????????????????????7
- 上一篇:MATLAB海雜波模型仿真
- 下一篇:免疫遺傳算法
評論
共有 條評論