function [sys,x0,str,ts,simStateCompliance] =s_bppid(t,x,u,flag)
switch flag,
case 0,
[sys,x0,str,ts,simStateCompliance]=mdlInitializeSizes;
% case 1,
% sys=mdlDerivatives(t,x,u);
% case 2,
% sys=mdlUpdate(t,x,u);
case 3,
sys=mdlOutputs(t,x,u);
case 4,
sys=mdlGetTimeOfNextVarHit(t,x,u);%计算下一个采样点的绝对时间
case 9,
sys=mdlTerminate(t,x,u);
case {1,2,9},
sys=[];
otherwise
DAStudio.error('Simulink:blocks:unhandledFlag', num2str(flag));
end
function [sys,x0,str,ts,simStateCompliance]=mdlInitializeSizes
sizes=simsizes;%用于设置模块参数的结构体用simsizes来生成
sizes.NumContStates=0;%sizes构架的NumContStates域存放数值
sizes.NumDiscStates=0;%模块离散状态变量的个数
sizes.NumOutputs=3;%模块输出变量的个数
sizes.NumInputs=11;%模块输入变量的个数
sizes.DirFeedthrough=1;%模块是否存在直接贯通(直接贯通我的理解是输入能直接控制输出)
sizes.NumSampleTimes=1;%模块的采样时间个数,至少是一个
sys=simsizes(sizes);%设置完后赋给sys输出
x0=[];
% x0=[1,0.1,10];%系统状态变量设置x0=[];%状态变量设置为空,表示没有状态变量离散和连续的状态 变量我们都设它初值为0
str=[];%这个就不用说了,保留参数嘛,置[]就可以了,反正没什么用
ts=[0 0];%采样周期设为0表示是连续系统
simStateCompliance = 'UnknownSimState';
% function sys=mdlDerivatives(t,x,u)
% sys = [x];
% function sys=mdlUpdate(t,x,u)
% T=0.1;
% % x=[u(5);x(2)+u(5)*T;(u(5)-u(4))/T];%e(k),e(k)求和,e(k)求微分
% %3个状态量(偏差、偏差和以及偏差变化量),u(5)是偏差,u(4)是上一次的偏差,x(2)则是之前的偏差和
% sys=[x(1);x(2);x(3)];
function sys=mdlOutputs(t,x,u)
persistent xite alfa wi wi_1 wi_2 wi_3 wo wo_1 wo_2 wo_3
xite=0.2;%学习速率用来×偏导数
alfa=0.05;%惯性因子
% IN=3;H=5;OUT=3;
T=0.1;
% persistent wi wo wi_1 wi_2 wi_3 wo_1 wo_2 wo_3 Kp Ki Kd
% persistent x u_1 u_2 u_3 u_4 u_5 y_1 y_2 y_3
% global wi;global wo;%隐含层加权系数wi定义**为全局变量;输出层加权系数wo
% global wi_1;global wi_2;global wi_3;global wo_1;global wo_2;global wo_3;
wi=rand(5,4);wo=rand(3,5);
wi_1=wi;wi_2=wi;wi_3=wi;
wo_1=wo;wo_2=wo;wo_3=wo;
Oh=zeros(1,5);I=Oh;%隐含层的输入1x4x4x5
B1=[5545 40050 73];%输出层的输入3x5x5x1
dK=zeros(1,3);%输出层的激活函数求导
delta3=zeros(1,3);
d_wo=zeros(3,5);
segma=zeros(1,5);
delta2=zeros(1,5);
d_wi=zeros(5,4);
dO=zeros(1,5);%隐含层求导
%%4-5-3
%%正向传播
xi=[u(1),u(2),u(3),1];%期望值、实际值、偏差1x4x4x5
% epid=[x(1);x(2);x(3)];%用于传给pid控制器的误差x=[u(5);x(2)+u(5)*T;(u(5)-u(4))/T]
I=xi*wi';%隐含层的输入1x4x4x5
for j=1:1:5 %5g隐含层
Oh(j)=(exp(I(j))-exp(-I(j)))/(exp(I(j))+exp(-I(j)));%隐含层的输出,激活函数Tanh
end
B1=wo*Oh'; %输出层的输入3x5x5x1
for i=1:1:3 %3层输出层B=K
B(i)=exp(B1(i))/(exp(B1(i))+exp(-B1(i)));%输出层的输出(B1,B2,B3)
end
% B1=K(1);B2=K(2);B3=K(3);
% sys=[B1,B2,B3];
% u_k=K*epid;%计算得到控制律u,1个值1*3*3*1
%以下是权值调整
%隐含层至输出层的权值调整
% dyu1=sign((u(11)-u(10))/(u(5)-u(4)+0.00000001)); %[(期望输出差分/控制输出差分+0.01)]
% dyu2=sign((u(11)-u(10))/(u(7)-u(6)+0.00000001)); %[(期望输出差分/控制输出差分+0.01)]
% dyu3=sign((u(11)-u(10))/(u(9)-u(8)+0.00000001)); %[(期望输出差分/控制输出差分+0.01)]
dyu1=sign((u(4)-u(3))/(u(7)-u(6)+0.00000001)); %[(期望输出差分/控制输出差分+0.01)]
dyu2=sign((u(4)-u(3))/(u(9)-u(8)+0.00000001)); %[(期望输出差分/控制输出差分+0.01)]
dyu3=sign((u(4)-u(3))/(u(11)-u(10)+0.00000001)); %[(期望输出差分/控制输出差分+0.01)]
dyu=[dyu1 dyu2 dyu3];
for j=1:1:3
dK(j)=2/(exp(B1(j))+exp(-B1(j)))^2; %输出层的激活函数求导,输出的一阶导3种
end
% for i=1:1:3
% delta3(i)=u(5)*dyu*epid(i)*dK(i); %输出层的delta///u(5)=e ; u(5)1 dyu2 dK(i)3 epid3
% end
for i=1:1:3
delta3(i)=u(1)*dyu(i)*dK(i); %1x3 输出层的delta///u(5)=e ; u(1)1 dyu2 dK(i)3 epid=u/o
end
delta3=[delta3(1) delta3(2) delta3(3)];%B123个参数对输出误差的影响
for j=1:1:3
for i=1:1:5
% d_wo=xite * delta3(j) * Oh(i) + alfa*(wo_1-wo_2);%3x5 xite学习速率 调整量Oh4
d_wo=xite * delta3(j) * Oh(i);%3x5 xite学习速率 调整量Oh4
end
end
wo=wo_1+d_wo+alfa*(wo_1-wo_2); %alfa惯性因子 矩阵形式 3x5
%以下是输入层至隐含层的权值调整
for i=1:1:5
dO(i)=4/(exp(I(i))+exp(-I(i)))^2; %隐含层求导 ;I隐含层输入
end
segma=delta3*wo; %1x5=1x3x3x5 delta是3个东西的乘积segma=5个元的输出对输出的影响
% delta2(i)=dO.*segma;
for i=1:1:5
delta2(i)=dO(i)*segma(i); %1*5
end
% % a=[1 2 3 4];c=[1 2 3 4 5];
% for i=1:1:5
% for j=1:1:4
% % b_a=a(j)+c(i);
% d_wi=xite*delta2(i)*xi(j)+alfa*(wi_1-wi_2);%xite学习速率
% end
% end
d_wi=xite*delta2'*xi; %5*1*1*4
wi=wi_1+d_wi+alfa*(wi_1-wi_2);
wo_3=wo_2;
wo_2=wo_1;
wo_1=wo; %储存输出层本次调整后的权值
wi_3=wi_2;
wi_2=wi_1;
wi_1=wi; %储存隐层本次调整后的权值
sys=[B(1),B(2),B(3)]; %s函数4个输出对应为控制变量
function sys=mdlGetTimeOfNextVarHit(t,x,u)%这个函数主要用于变步长的设置
sampleTime = 0.1;%Example,set the next hit to be one second later.
sys = t+sampleTime;
function sys=mdlTerminate(t,x,u)
sys = [];