[Neural Network Decoupling] Simulation of Neural Network Decoupling System Based on Matlab

1. Software version

matlab2013b

2. Theoretical knowledge of this algorithm

3. Core code

clc
clear
close all;
warning off;
addpath 'functions'
 

%外部输入的标准的值,这里可以在具体的验证的时候加入扰动。
CR   = 0.4;
h    = 0.6;
selt = 1;%1:加入扰动;0:不加扰动



%以下两个值越大,那么其PSO优化的RBF性能就越好
%进化次数  
iteration  = 250;
%种群规模
Sizes      = 20;   

sel        = 0;%1进行PSO优化得到最佳值,0直接进行实际测试

%本代码是在普通的PSO下的RBF神经网络解耦程序
%本代码是在普通的PSO下的RBF神经网络解耦程序
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%%%%%%%%%%%%%%%%%%%%%%%%%%以下为PSO%%%%%%%%%%%%%%%%%%%%%%%%%
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
if sel == 1
   %输入的CR和h
   %分别仅输入CR和h,使其达到解耦的结果
   [yy,Zbest] = func_train_online(iteration,Sizes,CR,h);
   figure(1)
   plot(yy,'LineWidth',2);grid on;
   xlabel('进化代数');
   ylabel('适应度');
   individual=Zbest;
   save trainPSO.mat Zbest yy
else
   load trainPSO.mat
   figure(1)
   plot(yy,'LineWidth',2);grid on;
   xlabel('进化代数');
   ylabel('适应度');
   individual=Zbest; 
end


 
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%%%%%%%%%%%%%%%%%%%%%%%%%%以下为RBF%%%%%%%%%%%%%%%%%%%%%%%%%
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
w11=reshape(individual(1:6),3,2);
w12=reshape(individual(7:12),3,2);
w13=reshape(individual(13:18),3,2);

w21=individual(19:27);
w22=individual(28:36);
w23=individual(37:45);

rate1=0.006;rate2=0.001; %学习率
k=0.3;K=3;
y_1=zeros(3,1);y_2=y_1;y_3=y_2;   %输出值
u_1=zeros(3,1);u_2=u_1;u_3=u_2;   %控制率
h1i=zeros(3,1);h1i_1=h1i;  %第一个控制量
h2i=zeros(3,1);h2i_1=h2i;  %第二个控制量
h3i=zeros(3,1);h3i_1=h3i;  %第三个空置量
x1i=zeros(3,1);x2i=x1i;x3i=x2i;x1i_1=x1i;x2i_1=x2i;x3i_1=x3i;   %隐含层输出 

%权值初始化
k0=0.03;

%值限定
ynmax=1;ynmin=-1;  %系统输出值限定
xpmax=1;xpmin=-1;  %P节点输出限定
qimax=1;qimin=-1;  %I节点输出限定
qdmax=1;qdmin=-1;  %D节点输出限定
uhmax=1;uhmin=-1;  %输出结果限定

for k=1:1:6000
    k
    %系统输出
    y1(k) = (0.4*y_1(1)+u_1(1)/(1+u_1(1)^2)+0.2*u_1(1)^3+0.5*u_1(2))+0.3*y_1(2);
    y2(k) = (0.4*y_1(2)+u_1(2)/(1+u_1(2)^2)+0.2*u_1(2)^3+0.5*u_1(1))+0.3*y_1(1);
    y3(k) = 0;
    
    
    %控制目标
    if selt == 1%加扰测试
        r1(k)  = CR + 0.005*sin(2*pi*k/200);
        r2(k)  = h  + 0.015*sin(2*pi*k/200);
        r3(k)  = 0; 
        r1s(k) = CR;
        r2s(k) = h;
        r3s(k) = 0;         
    else        %跟踪测试
        r1(k)  = sign(0.001*sin(2*pi*k/2000));
        r2(k)  = sign(0.003*sin(2*pi*k/2000));
        r3(k)  = 0;      
        r1s(k) = CR;
        r2s(k) = h;
        r3s(k) = 0;    
    end
    
    
    %系统输出限制
    yn=[y1(k),y2(k),y3(k)];
    yn(find(yn>ynmax))=ynmax;
    yn(find(yn<ynmin))=ynmin;
    
    %输入层输出
    x1o=[r1(k);yn(1)];
    
    x2o=[r2(k);yn(2)];
    
    x3o=[r3(k);yn(3)];
    
    %隐含层 
    x1i=w11*x1o;
    x2i=w12*x2o;
    x3i=w13*x3o;

    %比例神经元P计算
    xp=[x1i(1),x2i(1),x3i(1)];
    xp(find(xp>xpmax))=xpmax;
    xp(find(xp<xpmin))=xpmin;
    qp=xp;
    h1i(1)=qp(1);
    h2i(1)=qp(2);
    h3i(1)=qp(3);

    %积分神经元I计算
    xi=[x1i(2),x2i(2),x3i(2)];
    qi=[0,0,0];
    qi_1=[h1i(2),h2i(2),h3i(2)];
    
    qi=qi_1+xi;
    qi(find(qi>qimax))=qimax;
    qi(find(qi<qimin))=qimin;
    h1i(2)=qi(1);
    h2i(2)=qi(2);
    h3i(2)=qi(3);

    %微分神经元D计算
    xd=[x1i(3),x2i(3),x3i(3)];
    qd=[0 0 0];
    xd_1=[x1i_1(3),x2i_1(3),x3i_1(3)];
    qd=xd-xd_1;
    qd(find(qd>qdmax))=qdmax;
    qd(find(qd<qdmin))=qdmin;
    h1i(3)=qd(1);
    h2i(3)=qd(2);
    h3i(3)=qd(3);

    %输出层计算
    wo=[w21;w22;w23];
    qo=[h1i',h2i',h3i'];
    qo=qo';
    uh=wo*qo;
    uh(find(uh>uhmax))=uhmax;
    uh(find(uh<uhmin))=uhmin;
    u1(k)=uh(1);
    u2(k)=uh(2);
    u3(k)=uh(3);  

    
    %计算误差
    error=[r1(k)-y1(k);r2(k)-y2(k);0];  
    error1(k)=error(1);error2(k)=error(2);error3(k)=0;
    J(k)=0.5*(error(1)^2+error(2)^2);   %调整大小
    ypc=[y1(k)-y_1(1);y2(k)-y_1(2);y3(k)-y_1(3)];
    uhc=[u_1(1)-u_2(1);u_1(2)-u_2(2);u_1(3)-u_2(3)];
    
    %隐含层和输出层权值调整

    %调整w21
    Sig1=sign(ypc./(uhc(1)+0.00001));
    dw21=sum(error.*Sig1)*qo';  
    w21=w21+rate2*dw21;
    
    %调整w22
    Sig2=sign(ypc./(uh(2)+0.00001));
    dw22=sum(error.*Sig2)*qo';
    w22=w22+rate2*dw22;
    
    %调整w23
    Sig3=sign(ypc./(uh(3)+0.00001));
    dw23=sum(error.*Sig3)*qo';
    w23=w23+rate2*dw23;

    %输入层和隐含层权值调整
    delta2=zeros(3,3);
    wshi=[w21;w22;w23];
    for t=1:1:3
        delta2(1:3,t)=error(1:3).*sign(ypc(1:3)./(uhc(t)+0.00000001));
    end
    for j=1:1:3
        sgn(j)=sign((h1i(j)-h1i_1(j))/(x1i(j)-x1i_1(j)+0.00001));
    end
 
     s1=sgn'*[r1(k),y1(k)];
     wshi2_1=wshi(1:3,1:3);
     alter=zeros(3,1);
     dws1=zeros(3,2);
     for j=1:1:3
         for p=1:1:3
             alter(j)=alter(j)+delta2(p,:)*wshi2_1(:,j);
         end
     end
     
     for p=1:1:3
         dws1(p,:)=alter(p)*s1(p,:);
     end
     w11=w11+rate1*dws1;

     %调整w12
    for j=1:1:3
        sgn(j)=sign((h2i(j)-h2i_1(j))/(x2i(j)-x2i_1(j)+0.0000001));
    end
    s2=sgn'*[r2(k),y2(k)];
    wshi2_2=wshi(:,4:6);
    alter2=zeros(3,1);
    dws2=zeros(3,2);
    for j=1:1:3
        for p=1:1:3
            alter2(j)=alter2(j)+delta2(p,:)*wshi2_2(:,j);
        end
    end
    for p=1:1:3
        dws2(p,:)=alter2(p)*s2(p,:);
    end
    w12=w12+rate1*dws2;
    
    %调整w13
    for j=1:1:3
        sgn(j)=sign((h3i(j)-h3i_1(j))/(x3i(j)-x3i_1(j)+0.0000001));
    end
    s3=sgn'*[r3(k),y3(k)];
    wshi2_3=wshi(:,7:9);
    alter3=zeros(3,1);
    dws3=zeros(3,2);
    for j=1:1:3
        for p=1:1:3
            alter3(j)=(alter3(j)+delta2(p,:)*wshi2_3(:,j));
        end
    end
    for p=1:1:3
        dws3(p,:)=alter2(p)*s3(p,:);
    end
    w13=w13+rate1*dws3;

    %参数更新
    u_3=u_2;u_2=u_1;u_1=uh;
    y_2=y_1;y_1=yn;
    h1i_1=h1i;h2i_1=h2i;h3i_1=h3i;
    x1i_1=x1i;x2i_1=x2i;x3i_1=x3i;
    
    ErrCr(k) = y1(k) - r1s(k);
    Errh(k)  = y2(k) - r2s(k);
end

 

if selt == 0
    time=0.001*(1:k);
    figure(2)
    subplot(211)
    plot(time,r1,'r-',time,y1,'b-');
    ylabel('CR');
    legend('控制目标','实际输出','fontsize',12);
    subplot(212)
    plot(time,r2,'r-',time,y2,'b-');
    ylabel('h');
    legend('控制目标','实际输出','fontsize',12);
else
    time=0.001*(1:round(k)/20);
    figure(3)
    subplot(211)
    plot(time,ErrCr(1:round(k)/20),'k-','LineWidth',2);
    title('CR输入输出误差');
    axis([0,time(round(k)/20),-0.8,0.4]);

    
    subplot(212)
    plot(time,Errh(1:round(k)/20),'k-','LineWidth',2);
    title('h输入输出误差');
    axis([0,time(round(k)/20),-0.8,0.4]);
    
    save errorpso.mat ErrCr Errh
    
    
end

4. Operation steps and simulation conclusion

RBF decoupling simulation results under ordinary PSO :

The optimized fitness curve of this PSO particle swarm reflects the convergence of PSO and the final performance.

This is the tracking effect of the system.

Error curve after adding perturbation.

RBF decoupling simulation results under HPSO :

Convergence curve of HPSO.

Tracking effect of HPSO.

The error curve of HPSO after adding perturbation.

5. References

[1] Fu Longhai, Li Meng. Variable air volume air conditioning system based on PID neural network decoupling control [J]. Journal of Southwest Jiaotong University, 2005, 40(1):13-17.

A05-05

Guess you like

Origin blog.csdn.net/ccsss22/article/details/124371702