[已答复] 用S函数编写BP神经网络的程序有几点不明白

[复制链接]
243015239 发表于 2014-7-16 12:41:40
正在做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

12 条回复


243015239 发表于 2014-9-2 08:55:46
问题已经解决,有同样疑问的可以跟帖交流

hongishcking 发表于 2014-10-18 20:18:05
怎么在simulink里面做神经网络,S函数怎么用啊,能教教我吗

曹操大妈 发表于 2014-11-16 11:18:42
恩,我也有疑问,他的s函数直接就mdloutputs了,中间没有更新。在mdloutputs中,就是你画红色的地方,同样不懂,求讨论,求解释。

243015239 发表于 2014-11-19 18:19:16
hongishcking 发表于 2014-10-18 20:18
怎么在simulink里面做神经网络,S函数怎么用啊,能教教我吗

薛定宇老师的《MATLAB控制系统辅助设计》这本书,里面有范例,可以直接拿来用的

243015239 发表于 2014-11-19 18:27:48
曹操大妈 发表于 2014-11-16 11:18
恩,我也有疑问,他的s函数直接就mdloutputs了,中间没有更新。在mdloutputs中,就是你画红色的地方,同样 ...

这个是可以自动更新的,原理 书上都有。
红色的地方,像wi()=reshape()这些,你要对照着结构图来看,例如wi_2=reshape(u(8:7+4*nh),nh,4);,系统一共有7+14*nh个输入,其中u(8:7+nh)这几个输入作为wi_2的权值,同理,wi_1、wo_1、wo_2的权值也是这么来的。wi_1代表的是t(k-1)时刻的权值,就是上一次采样周期内的权值。wi_2是上上次的权值。

rreal34 发表于 2015-2-25 14:30:58
楼主你好,我现在也在参考这个程序,有一点很疑惑,这个程序的初始权值是怎么设置的?可不可以自己改动,谢谢!

haha_1993_12 发表于 2017-6-16 20:55:11
楼主你好,我的BP PID程序可以跑出来,但是PID参数一直未0.5,不知道为什么,你的程序最后能跑通吗,可以分享下吗

浅影川还2323 发表于 2018-6-28 15:22:46
haha_1993_12 发表于 2017-6-16 20:55
楼主你好,我的BP PID程序可以跑出来,但是PID参数一直未0.5,不知道为什么,你的程序最后能跑通吗,可以分 ...

您好,我也遇到了同样的问题,请问您解决了吗?非常感谢!

94踏月留香 发表于 2020-8-3 22:15:38
浅影川还2323 发表于 2018-6-28 15:22
您好,我也遇到了同样的问题,请问您解决了吗?非常感谢!

一样遇到这个问题,请问你们是怎么解决的?

xixixixixix 发表于 2020-10-7 10:21:30
haha_1993_12 发表于 2017-6-16 20:55
楼主你好,我的BP PID程序可以跑出来,但是PID参数一直未0.5,不知道为什么,你的程序最后能跑通吗,可以分 ...

初始化

小白来学习了 发表于 2022-1-6 21:29:06
请问可以将这个程序和simulink结构图发一下吗?谢谢

何满子 发表于 2022-5-14 11:55:11
243015239 发表于 2014-9-2 08:55
问题已经解决,有同样疑问的可以跟帖交流

%神经网络输入xi=(r,y,e,1)  为什么输入这个1
您需要登录后才可以回帖 登录 | 注册

本版积分规则

相关帖子
相关文章
热门教程
站长推荐
快速回复 返回顶部 返回列表