正在做BP神经网络的PID控制仿真,用S函数实现神经网络。看了薛定宇老师的《MATLAB控制系统辅助设计》相关章节,有些语句不明白。代码如下:
function [sys,x0,str,ts]=nnbp_pid(t,x,u,flag,T,nh,xite,alfa,kF1,kF2)
switch flag,
case 0, [sys,x0,str,ts] = mdlInitializeSizes(T,nh);
case 3, sys = mdlOutputs(t,x,u,T,nh,xite,alfa,kF1,kF2);
case {1, 2, 4, 9},sys = [];
otherwise, error(['Unhandled flag =',num2str(flag)]);
end;
% 初始化函数
function [sys,x0,str,ts] = mdlInitializeSizes(T,nh)sizes = simsizes;
% 读入模板,得出默认的控制量
sizes.NumContStates = 0;
sizes.NumDiscStates = 0;
sizes.NumOutputs = 4+7*nh;
sizes.NumInputs = 7+14*nh;
sizes.DirFeedthrough = 1;
sizes.NumSampleTimes = 1;
sys = simsizes(sizes); x0 = [];str = []; ts = [T 0];
% 系统输出计算函数
function sys = mdlOutputs(t,x,u,T,nh,xite,alfa,kF1,kF2)
wi_2=reshape(u(8:7+4*nh),nh,4);
wo_2=reshape(u(8+4*nh:7+7*nh),3,nh);
wi_1=reshape(u(8+7*nh:7+11*nh),nh,4);
wo_1=reshape(u(8+11*nh:7+14*nh),3,nh);
xi=[u([6,4,1])', 1];xx=[u(1)-u(2); u(1);
u(1)+u(3)-2*u(2)];I=xi*wi_1';Oh=non_transfun(I,kF1);
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(K,3);delta3=u(1)*dyu*xx.*dK;
wo=wo_1+xite*delta3*Oh+alfa*(wo_1-wo_2)+alfa*(wo_1-wo_2);
dO=2*non_transfun(I,3);wi=wi_1+xite*(dO.*(delta3'*wo))'*xi+alfa*(wi_1-wi_2);
sys=[uu; K;wi(:);wo(:)];
% 激活函数近似
function W1=non_transfun(W,key)
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
1、程序中的第11、12行:sizes.NumOutputs = 4+7*nh; sizes.NumInputs = 7+14*nh 这些数字是怎么来的?
2、wi_2=reshape(u(8:7+4*nh),nh,4);
wo_2=reshape(u(8+4*nh:7+7*nh),3,nh);
wi_1=reshape(u(8+7*nh: 7+11*nh),nh,4);
wo_1=reshape(u(8+11*nh:7+14*nh),3,nh);这几句里的wi_1和wi_2是什么关系?
3、xi=[u([6,4,1])这句也看不懂求哪位知道的大神给解答一下
function [sys,x0,str,ts]=nnbp_pid(t,x,u,flag,T,nh,xite,alfa,kF1,kF2)
switch flag,
case 0, [sys,x0,str,ts] = mdlInitializeSizes(T,nh);
case 3, sys = mdlOutputs(t,x,u,T,nh,xite,alfa,kF1,kF2);
case {1, 2, 4, 9},sys = [];
otherwise, error(['Unhandled flag =',num2str(flag)]);
end;
% 初始化函数
function [sys,x0,str,ts] = mdlInitializeSizes(T,nh)sizes = simsizes;
% 读入模板,得出默认的控制量
sizes.NumContStates = 0;
sizes.NumDiscStates = 0;
sizes.NumOutputs = 4+7*nh;
sizes.NumInputs = 7+14*nh;
sizes.DirFeedthrough = 1;
sizes.NumSampleTimes = 1;
sys = simsizes(sizes); x0 = [];str = []; ts = [T 0];
% 系统输出计算函数
function sys = mdlOutputs(t,x,u,T,nh,xite,alfa,kF1,kF2)
wi_2=reshape(u(8:7+4*nh),nh,4);
wo_2=reshape(u(8+4*nh:7+7*nh),3,nh);
wi_1=reshape(u(8+7*nh:7+11*nh),nh,4);
wo_1=reshape(u(8+11*nh:7+14*nh),3,nh);
xi=[u([6,4,1])', 1];xx=[u(1)-u(2); u(1);
u(1)+u(3)-2*u(2)];I=xi*wi_1';Oh=non_transfun(I,kF1);
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(K,3);delta3=u(1)*dyu*xx.*dK;
wo=wo_1+xite*delta3*Oh+alfa*(wo_1-wo_2)+alfa*(wo_1-wo_2);
dO=2*non_transfun(I,3);wi=wi_1+xite*(dO.*(delta3'*wo))'*xi+alfa*(wi_1-wi_2);
sys=[uu; K;wi(:);wo(:)];
% 激活函数近似
function W1=non_transfun(W,key)
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
1、程序中的第11、12行:sizes.NumOutputs = 4+7*nh; sizes.NumInputs = 7+14*nh 这些数字是怎么来的?
2、wi_2=reshape(u(8:7+4*nh),nh,4);
wo_2=reshape(u(8+4*nh:7+7*nh),3,nh);
wi_1=reshape(u(8+7*nh: 7+11*nh),nh,4);
wo_1=reshape(u(8+11*nh:7+14*nh),3,nh);这几句里的wi_1和wi_2是什么关系?
3、xi=[u([6,4,1])这句也看不懂求哪位知道的大神给解答一下