【神经网络】RBF神经网络逼近任意连续非线性函数的Simulink仿真

前言:上周开始学习神经网络,觉得挺有意思,神经网络可以实现对任意非线性函数的逼近,而且可以作为控制器来实现对模型的自适应调节,让控制器能够不断学习不断修改自己的参数。

RBF神经网络逼近任意非线性函数

  RBF神经网络个人理解:RBF神经网络由输入层,隐含层和输出层构成,其中输入层到隐含层的激励函数为高斯基函数,隐含层到输出层为线性函数,高斯基函数的参数包括宽度矢量 b b b 和隐含神经元的中心矢量值 c c c。需要注意的是 b b b c c c 需要设计在网络输入有效的映射范围内,否则会导致RBF网络失效而逼近失败。
  RBF神经网络逼近包括基于梯度下降法的自适应控制和基于Lyapunov稳定性分析的在线自适应神经网络控制。基于梯度下降法的缺点是容易陷入局部最优且不能保证闭环系统的稳定性。

基于梯度下降法

  基于梯度下降法分为只调节权值 w w w 和调节权值及高斯基函数的参数 b b b c c c w w w 。通过误差来调节神经网络中的参数。

仿真模型:包括被控对象和RBF神经网络逼近。

在这里插入图片描述
Matlab代码

function [sys,x0,str,ts] = Book2222_controller(t,x,u,flag)
% 基于梯度下降法的RBF神经网络逼近
switch flag
  case 0 %初始化
    [sys,x0,str,ts]=mdlInitializeSizes;
  case {1,2,4,9} %离散状态计算,下一步仿真时刻,终止仿真设定
    sys=[];
  case 3 %输出信号计算
    sys=mdlOutputs(t,x,u);
  otherwise
    DAStudio.error('Simulink:blocks:unhandledFlag', num2str(flag));
end

function [sys,x0,str,ts]=mdlInitializeSizes   %系统的初始化
sizes = simsizes;
sizes.NumContStates  = 0;   
sizes.NumDiscStates  = 0;   
sizes.NumOutputs     = 1;   
sizes.NumInputs      = 2;   
sizes.DirFeedthrough = 1;   
sizes.NumSampleTimes = 0;   
                           
sys = simsizes(sizes);
x0  = [];            
str = [];                   
ts  = [];                   
% 权值初值的选择
% 神经网络PID控制器 2-5-1结构
global  W_new W_past C_new C_past  B_new B_past 
C_new = [-1  -0.5  0  0.5  1;  
         -10  -5   0  5   10];   %2*5  中心矢量
C_past = C_new;
B_new = [3  3  3  3  3];  %1*5  基宽度参数
B_past = B_new;
W_new = rand(1,5);  %权值取0-1的随机值
W_past = W_new;


function sys = mdlOutputs(t,x,u)   %产生(传递)系统输出
global W_new W_past C_new C_past  B_new B_past 
alpha = 0.05; 
xite = 0.15;   
u_in = u(1);
y_out = u(2);  
some = [u_in; y_out];
h = zeros(5,1);
for j = 1:5
    h(j) = exp(-(norm(some - C_new(:,j))^2/(2* B_new(j)^2)));  %5*1矩阵  径向基函数
end
% RBF的网络输出ym
ym = W_new * h;

% 权值的调整 更新值
deltaW = zeros(1,5);
for i = 1:5
    deltaW(i) = xite * (y_out - ym) * h(i);
end
for i = 1:5
    W_new(i) = W_new(i) + deltaW(i) + alpha*(W_new(i) - W_past(i));
end

% 基宽带参数b的修正
deltab = zeros(1,5);
for i = 1:5
    deltab(i) = xite * (y_out - ym) * W_new(i) * h(i) * (norm(some - C_new(:,i))^2 / B_new(i)^3);
    B_new(i) = B_new(i) + deltab(i) + alpha*(B_new(i) - B_past(i));
end

% 中心矢量c的修正
deltac = zeros(2,5);
for j = 1:2
    for i = 1:5 
        deltac(j,i) = xite * (y_out - ym) * W_new(i) * h(i) * ((some(j) - C_new(j,i)) / B_new(i)^2);
        C_new(j,i) = C_new(j,i) + deltac(j,i) + alpha*(C_new(j,i) - C_past(j,i));
    end
end

sys(1) = ym;

W_past = W_new;
B_past = B_new;
C_past = C_new;

仿真结果:

真实输出与RBF神经网络输出对比

输出误差:

结论

   RBF神经网络可以很好的逼近非线性函数,稳态误差很小,根据这一特性可以用神经网络来实现对模型的精确控制,后续考虑结合神经网络与固定时间滑模控制来发文章。

评论 27
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值