⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 bp_pid01.m

📁 bp神经网络PID参数自整定 S函数实现 不怎么好 期待其它完美的
💻 M
字号:
%
%
% BP网PID控制器的S函数
%by wtx 2007-11-19



function [sys,x0,str,ts]=bp_pid01(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(fkag)]);
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



        
    































⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -