【智能控制实验】基于MATLAB的BP神经网络PID控制器设计
生活随笔
收集整理的这篇文章主要介绍了
【智能控制实验】基于MATLAB的BP神经网络PID控制器设计
小编觉得挺不错的,现在分享给大家,帮大家做个参考.
基于MATLAB的BP神经网络PID控制器设计
一、BP神经网络PID控制算法步骤:
(1)确定BP神经网络结构,即确定输入层和隐含层的节点个数,选取各层加权系数的初值wij(0)、wli(0),选定学习速率和惯性系数,此时k=1(2)采样给定和反馈信号,即r(k)和y(k),计算误差e(k)=r(k)-y(k)(3)确定输入量(4)根据上述公式,计算各层神经元的输入、输出,神经网络输出层即为PID控制器的三个可调参数Kp、Ki和Kd(5)由增量式PID控制公式,计算PID控制器的控制输出u(k)(6)进行神经网络学习,实时自动调整输出层和隐含层的加权系数wli(k)和wij(k),实现PID控制参数的自适应调整(7)置k=k+1,返回步骤(2)二、建立模型
2.1 BP_PID
2.2 Subsystem
2.3 S_Function
function [sys,x0,str,ts,simStateCompliance] = nnbp(t,x,u,flag,T,nh,xite,alfa) switch flag,case 0,[sys,x0,str,ts,simStateCompliance]=mdlInitializeSizes(T,nh); %初始化函数case 3,sys=mdlOutputs(t,x,u,nh,xite,alfa); %输出函数case {1,2,4,9},sys=[];otherwiseDAStudio.error('Simulink:blocks:unhandledFlag', num2str(flag)); end function [sys,x0,str,ts,simStateCompliance]=mdlInitializeSizes(T,nh) %调用初始画函数,两个外部输入参数 参数T确定采样时间,参数nh确定隐含层层数 sizes = simsizes; sizes.NumContStates = 0; sizes.NumDiscStates = 0; sizes.NumOutputs = 4+6*nh; %定义输出变量,包括控制变量u,三个PID参数:Kp,Ki,Kd,隐含层+输出层所有加权系数 sizes.NumInputs = 7+12*nh; %定义输入变量,包括前7个参数[e(k);e(k-1);e(k-2);y(k);y(k-1);r(k);u(k-1)] %隐含层+输出层权值系数(k-2),隐含层+输出层权值系数(k-1) sizes.DirFeedthrough = 1; sizes.NumSampleTimes = 1; sys = simsizes(sizes); x0 = []; str = []; ts = [T 0]; simStateCompliance = 'UnknownSimState'; function sys=mdlOutputs(t,x,u,nh,xite,alfa) %调用输出函数 wi_2 = reshape(u(8:7+3*nh),nh,3); %隐含层(k-2)权值系数矩阵,维数nh*3 wo_2 = reshape(u(8+3*nh:7+6*nh),3,nh); %输出层(k-2)权值系数矩阵,维数3*nh wi_1 = reshape(u(8+6*nh:7+9*nh),nh,3); %隐含层(k-1)权值系数矩阵,维数nh*3 wo_1 = reshape(u(8+9*nh:7+12*nh),3,nh); %输出层(k-1)权值系数矩阵,维数3*nh xi = [u(6),u(4),u(1)]; %神经网络的输入xi=[u(6),u(4),u(1)]=[r(k),y(k),e(k)] xx = [u(1)-u(2);u(1);u(1)+u(3)-2*u(2)]; %xx=[u(1)-u(2);u(1);u(1)+u(3)-2*u(2)]=[e(k)-e(k-1);e(k);e(k)+e(k-2)-2*e(k-1)] I = xi*wi_1'; %计算隐含层的输入,I=神经网络的输入*隐含层权值系数矩阵的转置wi_1',结果为: %I=[net0(k),net1(k)...netnh(k)]为1*nh矩阵 Oh = exp(I)./(exp(I)+exp(-I)); %激活函数,可更改 %计算隐含层的输出,(exp(I)-exp(-I))./(exp(I)+exp(-I))为隐含层的激活函数Sigmoid %Oh=[o0(k),o1(k)...onh(k)],为1*nh的矩阵 O = wo_1*Oh'; %计算输出层的输入,维数3*1 K = 2./(exp(O)+exp(-O)).^2; %激活函数,可更改 %计算输出层的输出K=[Kp,Ki,Kd],维数为1*3 %exp(Oh)./(exp(Oh)+exp(-Oh))为输出层的激活函数Sigmoid uu = u(7)+K'*xx; %根据增量式PID控制算法计算控制变量u(k) dyu = sign((u(4)-u(5))/(uu-u(7)+0.0000001)); %计算输出层加权系数修正公式的sgn %sign((y(k)-y(k-1))/(u(k)-u(k-1)+0.0000001)近似代表偏导 dK = 2./(exp(K)+exp(-K)).^2; %激活函数,可更改 delta3 = u(1)*dyu*xx.*dK; wo = wo_1+xite*delta3*Oh+alfa*(wo_1-wo_2); %输出层加权系数矩阵的修正 dOh = 2./(exp(Oh)+exp(-Oh)).^2; %激活函数,可更改 wi = wi_1+xite*(dOh.*(delta3'*wo))'*xi+alfa*(wi_1-wi_2); %隐含层加权系数修正 sys = [uu;K(:);wi(:);wo(:)]; %输出层输出sys=[uu;K(:);wi(:);wo(:)]= %[uu;Kp;Ki;Kd;隐含层+输出层所有权值系数] %K(:),wi(:),wo(:),把这三个矩阵按顺序排为列向量三、实验结果及分析
3.1 output
3.2 kp
3.3 ki
3.4 kd
参考文章
基于BP神经网络PID控制+Simulink仿真
总结
以上是生活随笔为你收集整理的【智能控制实验】基于MATLAB的BP神经网络PID控制器设计的全部内容,希望文章能够帮你解决所遇到的问题。
- 上一篇: c语言经典程序技能高考,计算机类技能高考
- 下一篇: 永磁同步电机PI控制器设计