用c语言编写RBF神经网络程序

用c语言编写RBF神经网络程序,第1张

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


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/yw/11006686.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-12
下一篇 2023-05-12

发表评论

登录后才能评论

评论列表(0条)

保存