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