RBF网络能够逼近任意的非线性函数,可以处理系统内的难以解析的规律性,具有良好的泛化能力,并有很快的学习收敛速度,已成功应用于非线性函数逼近、时间序列分析、数据分类、模式识别、信息处理、图像处理、系统建模、控制和故障诊断等。
简单说明一下为什么RBF网络学习收敛得比较快。当网络的一个或多个可调参数(权值或阈值)对任何一个输出都有影响时,这样的网络称为全局逼近网络。由于对于每次输入,网络上的每一个权值都要调整,从而导致全局逼近网络的学习速度很慢。BP网络就是一个典型的例子。
如果对于输入空间的某个局部区域只有少数几个连接权值影响输出,则该网络称为局部逼近网络。常见的局部逼近网络有RBF网络、小脑模型(CMAC)网络、B样条网络等。
附件是RBF神经网络的C++源码。
需要在设置种开启生成rbf文件选项。也能够直接经过命令行的方式,从quartus编译获得的sof文件转换获得rbf文件。须要注意的是,这种方式生成的rbf文件是通过压缩了的,能够支持Linux中使用应用程序直接配置FPGA。
%%%%% RBF网络PID %%%%%clear all
close all
T=0.005%采样周期
sys=tf(1,[0.0015,0.08,1])
dsys=c2d(sys,T,'z')
[num,den]=tfdata(dsys,'v')
%%%%% 学习率初值给定 %%%%%
xite=0.05%学习速率η
alfa=0.1%平滑因子
belte=0.15
x=[0,0,0]'%网络的输入向量
H=3%隐含层节点数
ci=28*ones(3,H)
bi=40*ones(H,1)
w=30*ones(H,1)%网络的权向量
h=zeros(H,1)%隐层输出
ci_1=cici_2=ci_1ci_3=ci_2
bi_1=bibi_2=bi_1bi_3=bi_2
w_1=ww_2=w_1w_3=w_2
u_1=0y_1=0%函数中间变量
u_2=0y_2=0%函数中间变量
xc=[0,0,0]'%高斯函数的输入
error_1=0error_2=0%误差初始化
%%%%% PID初始参数给定 %%%%%
kp=1%比例系数
ki=0.1%积分系数
kd=0.01%微分系数
kp_1=kp
ki_1=ki
kd_1=kd
xitekp=0.5
xiteki=0.5
xitekd=0.5
for k=1:1:1000%采样
time(k)=k*T
rin(k)=1%输入指令信号
yout(k)=-den(3)*y_2-den(2)*y_1+num(3)*u_2+num(2)*u_1%二阶被控对象
for j=1:1:H
h(j)=exp(-norm(x-ci_1(:,j))^2/(2*bi_1(j)*bi_1(j)))%为高斯函数
end
ymout(k)=w_1'*h%辨识网络的输出
d_w=0*w% Defining matrix number of d_w equal to that of w
for j=1:1:H
d_w(j)=xite*(yout(k)-ymout(k))*h(j)
end
w=w_1+d_w+alfa*(w_1-w_2)+belte*(w_2-w_3)%输出权的迭代算法
d_bi=0*bi
for j=1:1:H
d_bi(j)=xite*(yout(k)-ymout(k))*w_1(j)*h(j)*(bi_1(j)^-3)*norm(x-ci_1(:,j))^2
end
bi=bi_1+d_bi+alfa*(bi_1-bi_2)+belte*(bi_2-bi_3)%节点中心的迭代算法
for j=1:1:H
for i=1:1:3
d_ci(i,j)=xite*(yout(k)-ymout(k))*w_1(j)*h(j)*(x(i)-ci_1(i,j))*(bi_1(j)^-2)
end
end
ci=ci_1+d_ci+alfa*(ci_1-ci_2)+belte*(ci_2-ci_3)%节点基宽参数的迭代算法
%%%%%%%%%%%%%%%%%%%%%%Jacobian%%%%%%%%%%%%%%%%%%
dyu=0
for j=1:1:H
dyu=dyu+w(j)*h(j)*(-x(1)+ci(1,j))/bi(j)^2
end
dyout(k)=dyu
%%%%%%%%%%%%%%%%%%%%%%Start of Control system%%%%%%%%%%%
error(k)=rin(k)-yout(k)%期望输出与实际输出的偏差值,即控制误差
kp(k)=kp_1+xitekp*error(k)*dyout(k)*xc(1)
kd(k)=kd_1+xitekd*error(k)*dyout(k)*xc(2)
ki(k)=ki_1+xiteki*error(k)*dyout(k)*xc(3)
if kp(k)<0
kp=0
end
if kd(k)<0
kd=0
end
if ki(k)<0
ki=0
end
du(k)=kp(k)*xc(1)+kd(k)*xc(2)+ki(k)*xc(3)
u(k)=u_1+du(k)
if u(k)>=2
u(k)=2
end
if u(k)<=0
u(k)=0
end
%Return of parameters返回参数
x(1)=du(k)
x(2)=yout(k)
x(3)=y_1
u_1=u(k)
y_1=yout(k)
%%%%% 权值更新 %%%%%
w_3=w_2
w_2=w_1
w_1=w
%%%%% PID三项输入 %%%%%
xc(1)=error(k)-error_1%Calculating P
xc(2)=error(k)-2*error_1+error_2%Calculating D
xc(3)=error(k) %Calculating I
error_2=error_1
error_1=error(k)
kp_1=kp(k)
kd_1=kd(k)
ki_1=ki(k)
end
figure(1)
plot(time,rin,'b',time,yout,'r')
xlabel('time(s)')ylabel('rin,yout')
figure(4)
subplot(311)
plot(time,kp,'r')
xlabel('time(s)')ylabel('kp')
subplot(312)
plot(time,ki,'g')
xlabel('time(s)')ylabel('ki')
subplot(313)
plot(time,kd,'b')
xlabel('time(s)')ylabel('kd')
hold on
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)