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

📄 nnpid3.m

📁 利用神经网络自校订、自学习功能在线整定PID
💻 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 + -