题目
采用RBF网络对如下模型进行逼近
G(s)= 133/(s^2+25s)
网络结构为2-5-1结构取x(1) = u(t),x(2) = 3(t-1),η=0.50,α=0.05,网络的初始权值取0到1之间的随机值。考虑到网络的第一个输入范围为[0,1],离线测试可得第二个输入范围为[0,10],取高斯基函数的参数取值为
b_j = 1.5,j =1,2,3,4,5.
网络的第一个输入为u(k) = sint。仿真中,只调节权值w,取固定的c_j和b。
解题思路
用于逼近的RBP网络如下图所示
本题的模型结构
通过这两张图我们可以得到权值为
w_j (t)=w_j (t-1) +Δw_j(t)+α(w_j (t-1)-w_j (t-2))
代码
chap_5.m
(RBF网络程序)
function [sys,x0,str,ts] = s_function(t,x,u,flag)
switch flag,
case 0,
[sys,x0,str,ts] = mdlInitializeSizes
case 3,
sys = mdlOutputs(t,x,u);
case{2,4,9}
sys = [];
otherwise
error(['Unhandled flag = ',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); %模块设置完成后传递给sys参数
x0 = [];
str = [];
ts = [];
function sys = mdlOutputs(t,x,u)
persistent w w_1 w_2 b ci
xite = 0.50;
alfa = 0.05;
if t == 0
b =1.5;
ci = [-1 -0.5 0 0.5 1;
-10 -5 0 5 10];
w = rands(5,1);
w_1 = w;
w_2=w_1;
end
ut = u(1);
yout = u(2);
xi = [ut yout]';
for j = 1:1:5
h(j) = exp(-norm(xi-ci(:,j))^2/(2*b^2));
end
ymout = w' * h';
d_w = 0*w;
for j = 1:1:5
d_w(j) = xite *(yout - ymout)*h(j);
end
w = w_1 + d_w +alfa *(w_1 - w_2);
w_2 = w_1;
w_1 = w;
sys(1)=ymout;
chap_5b.m
(逼近对象程序)
function [sys,x0,str,ts] = s_function(t,x,u,flag)
switch flag,
case 0,
[sys,x0,str,ts] = mdlInitializeSizes
case 1,
sys = mdlDerivatives(t,x,u);
case 3,
sys=mdlOutputs(t,x,u);
case{2,4,9}
sys = [];
otherwise
error(['Unhandled flag = ',num2str(flag)]);
end
function[sys,x0,str,ts] = mdlInitializeSizes
sizes = simsizes; %设置模块参数结构体
sizes.NumContStates =2; %模块连续变量个数
sizes.NumDiscStates =0; %模块离散变量个数
sizes.NumOutputs =1; %模块输出变量个数
sizes.NumInputs =1; %模块输入变量个数
sizes.DirFeedthrough=0; %模块是否前后贯通,输入是否能直接控制输出
sizes.NumSampleTimes=0; %模块采样时间
sys=simsizes(sizes); %模块设置完成后传递给sys参数
x0 = [0,0];
str = [];
ts = [];
function sys = mdlDerivatives(t,x,u)
sys(1) = x(2);
sys(2) = -25*x(2) +133*u;
function sys=mdlOutputs(t,x,u)
sys(1) = x(1);
画图
close all;
figure(1);
plot(t,y(:,1),'r',t,y(:,2),'k:','linewidth',2);
xlabel('time(s)');ylabel('y and ym');
legend('ideal signal','signal approximation');
运行结果
代码详解
初始化
。
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); %模块设置完成后传递给sys参数
x0 = [];
str = [];
ts = [];
初始时的权值等数据
。
if t == 0
b =1.5;
ci = [-1 -0.5 0 0.5 1;
-10 -5 0 5 10];
w = rands(5,1);
w_1 = w;
w_2=w_1;
end
`隐藏层的输出`。
```javascript
for j = 1:1:5
h(j) = exp(-norm(xi-ci(:,j))^2/(2*b^2));
end
RBF网络的输出(理想输出)
。
ymout = w' * h';
调节权值
。
d_w = 0*w;
for j = 1:1:5
d_w(j) = xite *(yout - ymout)*h(j);
end
w = w_1 + d_w +alfa *(w_1 - w_2);
w_2 = w_1;
一般情况RBF Network只有三层,其中从输入层到隐层之间并没有权重连接,而是直接将用隐层的RBF计算与不同的中心(隐层神经元)的距离或者相似度,距离越远,相似度越低,神经元的激活程度就越小,作用也就越不明显,此外这个过程也可以以Kernel SVM的角度理解: 把原始低维的数据进行转换到高维空间中(高斯核对应无穷维)的特征转换。因而RBF Network的隐层激活函数可以说就是径向基函数,而一般Neural Network的激活函数则是一些如sigmod, tanh等非线性函数。当然很明显,RBF Network由于只有隐层到输出层的权重连接,因而训练速度会大大加快。