24小时热门版块排行榜    

查看: 702  |  回复: 0

kaiyu

木虫 (小有名气)

[求助] 基于S函数的BP神经网络P I D控制器,S函数封装问题

今天看了论文《基于S函数的BP神经网络P I D控制器S i m u li n k仿真》按照论文上的步骤做总是出问题,请高手帮忙看一下!
%%m文件
function [sys,x0,str,ts]=bp_pids(t,x,u,flag,T,nh,xite,alfa,kF1,kF2)
T=0.001;
nh=5;
xite=0.25;
alfa=0.05;
kF1=1;
kF2=2;
switch flag,
  
  case 0,
    [sys,x0,str,ts]=mdlInitializeSizes(T,nh);
  
  %case 1,
   % sys=mdlDerivatives(t,x,u);
  
  %case 2,
    %sys=mdlUpdate(t,x,u);
  
  case 3,
    sys=mdlOutputs(t,x,u,T,nh,xite,alfa,kF1,kF2);
  
    case{1,2,4,9},sys=[];
   % sys=mdlGetTimeOfNextVarHit(t,x,u);
  %case 9,
    %sys=mdlTerminate(t,x,u);
  
  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=mdlDerivatives(t,x,u)
sys = [];
function sys=mdlUpdate(t,x,u)
sys = [];
function sys=mdlOutputs(t,x,u,T,nh,xite,alfa,kFuncl,kFunc2)
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_l*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 sys=mdlGetTimeOfNextVarHit(t,x,u)
sampleTime = 1;   
sys = t + sampleTime;
function sys=mdlTerminate(t,x,u)
sys = [];
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 2,W1=2./(exp(W)+exp(-W)).^2;  
end
文中系统仿真的是y(t)=1.2y(t-1))/(1-0.8e^(-0.1t/T))/(1+y(t-1)^2)+u(t),
出现的问题是:在M文件中是77输入,39输出,在文中mask subsystem中得到2输入,2输出的模块,
(其中输入1为给定信号与对象输出信号的误差e(k),输入2为对象输出信号y(k)。输出1为控制器的输出u(k),
输出2为kp,ki,kd-个权值的变化量。)
我用simulink做出程序,但是还是变量个数有问题?
不知文章是怎么实现的?请高手指点~
基于S函数的BP神经网络P I D控制器,S函数封装问题
NNPID.PNG



[ Last edited by kaiyu on 2013-7-15 at 20:21 ]
回复此楼

» 猜你喜欢

已阅   回复此楼   关注TA 给TA发消息 送TA红花 TA的回帖
相关版块跳转 我要订阅楼主 kaiyu 的主题更新
信息提示
请填处理意见