📄 nnpid3.m
字号:
clear all
xite=0.25; %学习速率
alfa=0.05; %惯性系数
IN=4;H=5;Out=3;%输入层、中间层、输出层神经元数
wi=0.5*rands(H,IN);%随机选取输入层初始权值
wi=[ 0.2482 0.4070 0.5688 -0.0113 %反复实验选取的理想权值
-0.6204 0.3542 -0.1292 -0.8021
-0.6379 0.1658 -0.6182 -0.6213
-0.5437 -0.2838 -0.3578 -0.2676
-0.0785 0.0578 -0.4618 -0.3719];
wi_1=wi;wi_2=wi;wi_3=wi;
wo=0.5*rands(Out,H);%随机选取输出层初始权值
wo=[-0.4369 0.5517 0.7507 -0.2364 -0.2161%反复实验后选取的理想权值
-0.0543 -0.3583 0.6729 -0.0831 0.5442
-0.3409 0.9342 0.9830 0.7236 0.3612];
wo_1=wo;wo_2=wo;wo_3=wo;
x=[0 0 0];
u_1=0;
y_1=0;oh=zeros(H,1);
I=oh;
error_2=0;error_1=0;
for k=1:1000
% rin(k)=1+0.1*rand;
rin(k)=1;%输入
% rin(k)=sin(0.01*k);
a(k)=1.2*(1-0.8*exp(-0.1*k));
yout(k)=a(k)*y_1/(1+y_1^2)+u_1;%被控对象函数
error(k)=rin(k)-yout(k);%误差
x(1)=error(k)-error_1;
x(2)=error(k);
x(3)=error(k)-2*error_1+error_2;
xi=[error(k) error_1 error_2 rin(k)];%神经网络输入
epid=[x(1);x(2);x(3)];
I=wi*xi';
for j=1:H
oh(j)=(exp(I(j))-exp(-I(j)))/(exp(I(j))+exp(-I(j)));%使用S型双曲正切激活函数
end
Ko=wo*oh;
for l=1:Out
K(l)=exp(Ko(l))/(exp(Ko(l))+exp(-Ko(l)));%使用S型对数激活函数
end
kp(k)=K(1);ti(k)=K(2);td(k)=K(3);
Kpid=[kp(k),ti(k),td(k)];%神经网络输出参数Kp,Ki,Kd
du(k)=Kpid*epid;%控制量增量
u(k)=u_1+du(k);
if u(k)>=10 %限制控制量幅值
u(k)=10;
end
if u(k)<=-10
u(k)=-10;
end
dyu(k)=sign((yout(k)-y_1)/(u(k)-u_1+0.00001));%y(k)相对与u(k)的变化率
for j=1:Out
dK(j)=2/(exp(K(j))+exp(-K(j)))^2;%输出层权值调整
end
for l=1:Out
delta3(l)=error(k)*dyu(k)*epid(l)*dK(l);
end
for l=1:Out
for i=1:H
d_wo(l,i)=xite*delta3(l)*oh(i);
end
end
wo=wo_1+d_wo+alfa*(wo_1-wo_2);
for i=1:H
do(i)=4/(exp(I(i))+exp(-I(i)))^2;%输入层权值调整
end
segma=delta3*wo;
for i=1:H
delta2(i)=do(i)*segma(i);
end
d_wi=xite*delta2'*xi;
wi=wi_1+d_wi+alfa*(wi_1-wi_2);
u_1=u(k);
y_1=yout(k);
wo_3=wo_2;wo_2=wo_1;wo_1=wo;
wi_3=wi_2;wi_2=wi_1;wi_1=wi;
error_2=error_1;
error_1=error(k);
end
m=1:1000;
plot(m,yout)% 对被控对象输出作图
hold on
plot(m,error,'r-') %误差曲线图
hold off
figure
plot(m,u) %对控制量作图
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -