function [sys,x0,str,ts]=nnrbf_pid(t,x,u,flag,T,nn,K_pid,...
eta_pid,xite,alfa,beta0,w0)
switch flag,
case 0, [sys,x0,str,ts] = mdlInitializeSizes(T,nn);
case 2, sys = mdlUpdates(u);
case 3, sys = mdlOutputs(t,x,u,T,nn,K_pid,eta_pid,...
xite,alfa,beta0,w0);
case {1, 4, 9}, sys = [];
otherwise, error(['Unhandled flag = ',num2str(flag)]);
end
% 初始化函数
function [sys,x0,str,ts] = mdlInitializeSizes(T,nn)
sizes = simsizes; % 读入模板,得出默认的控制量
sizes.NumContStates = 0; sizes.NumDiscStates = 3;
sizes.NumOutputs = 4+5*nn; sizes.NumInputs = 9+15*nn;
sizes.DirFeedthrough = 1; sizes.NumSampleTimes = 1;
sys=simsizes(sizes); x0=zeros(3,1); str=[]; ts=[T 0];%初始化x为[0;0;0]
% 离散状态变量更新函数
function sys = mdlUpdates(u)
sys=[u(1)-u(2); u(1); u(1)+u(3)-2*u(2)];%u(1)、u(2)、u(3)分别为e(k)、e(k-1)、e(k-2)
% 输出量计算函数
function sys = mdlOutputs(t,x,u,T,nn,K_pid,eta_pid,...
xite,alfa,beta0,w0)
ci_3=reshape(u(7: 6+3*nn),3,nn); ci_2=reshape(u(7+5*nn: 6+8*nn),3,nn);%RBF神经网络的输入为du,y(k),y(k-1);隐含层为nn,辨识网络输出为ym(k).
ci_1=reshape(u(7+10*nn: 6+13*nn),3,nn);
bi_3=u(7+3*nn: 6+4*nn); bi_2=u(7+8*nn: 6+9*nn);
bi_1=u(7+13*nn: 6+14*nn); w_3= u(7+4*nn: 6+5*nn);
w_2= u(7+9*nn: 6+10*nn); w_1= u(7+14*nn: 6+15*nn); xx=u([6;4;5]);%u(6)、u(4)、u(5)分别为du,y(k),y(k-1)
if t==0
ci_1=w0(1)*ones(3,nn); bi_1=w0(2)*ones(nn,1);
w_1=w0(3)*ones(nn,1); K_pid0=K_pid;
else, K_pid0=u(end-2:end); end
for j=1: nn
h(j,1)=exp(-norm(xx-ci_1(:,j))^2/(2*bi_1(j)*bi_1(j)));
end
dym=u(4)-w_1'*h; w=w_1+xite*dym*h+alfa*(w_1-w_2)+beta0*(w_2-w_3);
for j=1:nn
d_bi(j,1)=xite*dym*w_1(j)*h(j)*(bi_1(j)^(-3))*norm(xx-ci_1(:,j))^2;
d_ci(:,j)=xite*dym*w_1(j)*h(j)*(xx-ci_1(:,j))*(bi_1(j)^(-2));
end
bi=bi_1+d_bi+alfa*(bi_1-bi_2)+beta0*(bi_2-bi_3);
ci=ci_1+d_ci+alfa*(ci_1-ci_2)+beta0*(ci_2-ci_3);
dJac=sum(w.*h.*(-xx(1)+ci(1,:)')./bi.^2); % Jacobian
KK=K_pid0+u(1)*dJac*eta_pid.*x; sys=[u(6)+KK'*x; KK; ci(:); bi(:); w(:)];%KK为更新的PID参数,x为[e(k)-e(k-1); e(k); e(k)+e(k-3)-2*e(k-2)]
BP/RBF神经网络仿真框图
需积分: 49 194 浏览量
2017-12-22
20:56:33
上传
评论 2
收藏 28KB RAR 举报
lvjintao123
- 粉丝: 0
- 资源: 1