bp+pid+rbF非线性预测模型控制器scl实现

控制器初始状态下,rbf预测模型存在较大拟合误差,不参与调节,仅有BP-PID进行控制动作,当拟合误差小于0.0001是使用rbf提供的雅可比矩阵矫正。


神经网络PID非线性预测控制.png

/RBF-NNI

//**********************************************************************//

#pre_error:=#y - #ym; //获取RBF预测值误差

#实际过程值_1 := #y;

#预测过程值_1 := #ym;

//************************************************************************//

(*网络训练*) (* 反向传播 *)

//************************************************************************//

IF #训练使能 THEN

(*step.1: 输出权重更新计算*)

    FOR #j := 1 TO 6 BY 1 DO

        #d_w[#j] := #lr * #pre_error * #h[#j];

    END_FOR;

    FOR #j := 1 TO 6 BY 1 DO

        #w[#j] := #w_1[#j] + #d_w[#j] + #beta * (#w_1[#j] - #w_2[#j]);

    END_FOR;

///

(*step.2:节点基函数方差更新*)

    FOR #j := 1 TO 6 BY 1 DO

        #d_bi[#j] := #lr * #pre_error * #w[#j] * #h[#j] * (1 / (#bi[#j] * #bi[#j] * #bi[#j])) * #norm_x_ci_array[#j];

    END_FOR;

    

    FOR #j := 1 TO 6 BY 1 DO

        #bi[#j] := #bi_1[#j] + #d_bi[#j] + #beta * (#bi_1[#j] - #bi_2[#j]);

    END_FOR;

    

///

(*step.3:节点中心更新*)

    FOR #j := 1 TO 6 BY 1 DO

        FOR #i := 1 TO 3 BY 1 DO

            #d_ci[#i, #j] := #lr * #pre_error * #w[#j] * #h[#j] * (#x[#i] - #ci[#i, #j]) * (1 / SQR_LREAL(#bi[#j]));

        END_FOR;

    END_FOR;

    FOR #j := 1 TO 6 BY 1 DO

        FOR #i := 1 TO 3 BY 1 DO

            #ci[#i, #j] := #ci_1[#i, #j] + #d_ci[#i, #j] + #beta * (#ci_1[#i, #j] - #ci_2[#i, #j]);

        END_FOR;

    END_FOR;

/

END_IF;

//*************************************************************//

#ci_3 := #ci_2;

#ci_2 := #ci_1;

#ci_1 := #ci;


#bi_3 := #bi_2;

#bi_2 := #bi_1;

#bi_1 := #bi;


#w_3 := #w_2;

#w_2 := #w_1;

#w_1 := #w;

//++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

//(*计算RBF预测输出ym:开始*)

#x[1] := #uout;

#x[2] := #y;

#x[3] := #y_1;

IF #输出使能 THEN

    FOR #j := 1 TO 6 BY 1 DO

        #norm_x_ci := 0;

        FOR #i := 1 TO 3 BY 1 DO

            #norm_x_ci := SQR_LREAL(#x[#i] - #ci[#i, #j]) + #norm_x_ci;

        END_FOR;

        #norm_x_ci_array[#j] := #norm_x_ci;//保存范数值

        #h[#j] := EXP(SQRT_LREAL(#norm_x_ci) / (2 * SQR_LREAL(#bi[#j])));

    END_FOR;

END_IF;

//

#wmh := 0;

FOR #i := 1 TO 6 BY 1 DO

    #wmh := #wmh + #w[#i] * #h[#i];

END_FOR;

#ym := #wmh;

//(*计算RBF网络输出ym:结束*)

//************************************************************************//

#实际过程值 := #y;

#预测过程值 := #ym;

//+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

#yu := 0.0;

FOR #j := 1 TO 6 BY 1 DO

    #yu := #yu + #w[#j] * #h[#j] * (- #x[1] + #ci[1, #j]) / SQR_LREAL(#bi[#j]);

END_FOR;

#dyout := #yu;

/

  

/show

    #拟合误差 := #pre_error;

    IF ABS_LREAL(#拟合误差) < 0.02 THEN

        #rbf_du_enbel := 1;

    ELSE

        #rbf_du_enbel := 0;

    END_IF;

    #rbf_du := LREAL_TO_REAL(#dyout);

 BP-PIDNN   

#e := #rin - #yout;

(* IF #e < 0.01 AND #e > -0.01 THEN

    #e := 0;

END_IF; *)

//#u := #u_1 + #Kp * (#e - #e_1) + #Ki * #e + #Kd * (#e - 2 * #e_1 + #e_2);

#x[1] := #e - #e_1;

#x[2] := #e;

#x[3] := #e - 2 * #e_1 + #e_2;

#epid[1]:=#x[1];

#epid[2]:=#x[2];

#epid[3] := #x[3];


#xi[1] := #rin;

#xi[2] := #yout;

#xi[3] := #e;

#xi[4] := 1;


#temp := 0;

FOR #a := 1 TO 5 BY 1 DO

    FOR #b := 1 TO 4 BY 1 DO

        #temp := #temp + #xi[#b] * #wi[#a, #b];

    END_FOR;

    #I[#a]:=#temp;

    #temp := 0;

END_FOR;


FOR #a :=1 TO 5 BY 1 DO

    #Oh[#a]:=EXP(#I[#a])-EXP(-(#I[#a]))/EXP(#I[#a]+EXP(-(#I[#a])));

END_FOR;


#temp := 0;

FOR #a := 1 TO 3 BY 1 DO

    FOR #b := 1 TO 5 BY 1 DO

        #temp:=#wo[#a,#b]*#Oh[#b] ;

    END_FOR;

    #K[#a] := #temp;

    #temp := 0;

END_FOR;


FOR #a := 1 TO 3 BY 1 DO

    #K[#a]:=EXP(#K[#a])/(EXP(#K[#a])+EXP(-(#K[#a])));

END_FOR;


#Kp := #K[1];

#Ki := #K[2];

#Kd := #K[3];


#Kpid[1] := #Kp;

#Kpid[2] := #Ki;

#Kpid[3] := #Kd;


#kpshow := #Kp;

#kishow := #Ki;

#kdshow := #Kd;


#du := #Kpid[1] * #epid[1] + #Kpid[2] * #epid[2] + #Kpid[3] * #epid[3];


#u := #u + #du;


IF #u > 20 THEN

    #u := 20;

END_IF;


IF #u < -20 THEN

    #u := -20;

END_IF;


IF #rbf_du_enable THEN

    #du := #rbf_du;

ELSE

    #temp := (#yout - #y_1) / (#u - #u_1 + 0.0000001);

    IF #temp > 0.0 THEN

        #dyu := 1;

    ELSIF

        #temp < 0.0 THEN

        #dyu := -1;

    ELSE

        #dyu := 0;

    END_IF;

END_IF;


//输出层

FOR #a := 1 TO 3 BY 1 DO

    #dK[#a] := 2 / SQR(EXP(#K[#a] + EXP(- (#K[#a]))));

END_FOR;


FOR #a := 1 TO 3 BY 1 DO

    #delta3[#a] := #e * #dyu * #epid[#a] * #dK[#a];

END_FOR;

    

FOR #a := 1 TO 3 BY 1 DO

    FOR #b := 1 TO 5 BY 1 DO

        #d_wo[#a, #b] := #xite * #delta3[#a] * #Oh[#b] + #alfa * (#wo_1[#a,#b] - #wo_2[#a,#b]);

    END_FOR;

END_FOR;



FOR #a := 1 TO 3 BY 1 DO

    FOR #b := 1 TO 5 BY 1 DO

        #wo[#a,#b] := #wo_1[#a,#b] + #d_wo[#a,#b] + #alfa * (#wo_1[#a,#b] - #wo_2[#a,#b]);

    END_FOR;

END_FOR;


//隐含层

FOR #a := 1 TO 5 BY 1 DO

    #dO[#a] := 4 / SQR(EXP(#I[#a]) + EXP(- (#I[#a])));

END_FOR;


#temp := 0;

FOR #a := 1 TO 5 BY 1 DO

    FOR #b := 1 TO 3 BY 1 DO

        #temp := #delta3[#b] * #wo[#b, #a]+#temp;

    END_FOR;

    #segma[#a] := #temp;

    #temp := 0;

END_FOR;


FOR #a := 1 TO 5 BY 1 DO

    #delta2[#a] := #dO[#a] * #segma[#a];

END_FOR;


FOR #a := 1 TO 5 BY 1 DO

    FOR #b := 1 TO 4 BY 1 DO

        #d_wi[#a, #b] := #xite * #delta2[#a] *#xi[#b];

    END_FOR;

END_FOR;


FOR #a := 1 TO 5 BY 1 DO

    FOR #b := 1 TO 4 BY 1 DO

        #wi[#a, #b] := #wi_1[#a, #b] + #d_wi[#a, #b] + #alfa * (#wi_1[#a, #b] - #wi_2[#a, #b]);

    END_FOR;

END_FOR;


//参数更新

#u_5 := #u_4;

#u_4 := #u_3;

#u_3 := #u_2;

#u_2 := #u_1;

#u_1 := #u;


#y_2 := #y_1;

#y_1 := #yout;


#wo_3 := #wo_2;

#wo_2 := #wo_1;

#wo_1 := #wo;


#wi_3 := #wi_2;

#wi_2 := #wi_1;

#wi_1 := #wi;


#e_2 := #e_1;

#e_1 := #e;


  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 6
    评论
评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值