|
马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。
您需要 登录 才可以下载或查看,没有账号?我要加入
x
我按照薛定宇那本<<控制系统计算机辅助设计-matlab语言与应用>>设计的REF神经PID控制器,直接把他的控制器用在我的模型上面,但控制效果很差,不知道调节那个参数,请高手指点一下,还有上面的参数nn表示什么意思,能不能把他的程序给详细说明一下? 哪位大侠能来指点一二,非常感谢,
这是他的s函数,请问其中nn代表什么,他的是几层的神经网络?输入,输出各是什么?
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];
% 离散状态变量更新函数
function sys = mdlUpdates(u)
sys=[u(1)-u(2); u(1); u(1)+u(3)-2*u(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);
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]);
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 % Gaussian basis h
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(:)];
|
|