
直接用广义RBF网络我感觉比较方便,而且可以直接用newgrnn(P,T,spread)函数。
RLS算法的MATLAB程序在附件,你可以参考下。
最小二乘大约是1795年高斯在他那星体运动轨道预报工作中提出的[1]。后来,最小二乘法就成了估计理论的奠基石。由于最小二乘法结构简单,编制程序也不困难,所以它颇受人们重视,应用相当广泛。
如用标准符号,最小二乘估计可被表示为:
AX=B (2-43)
上式中的解是最小化 ,通过下式中的伪逆可求得:
A'AX=A'B (2-44)
(A'A)^(-1)A'AX=(A'A)^(-1)A'B (2-45)
由于
(A'A)^-1A'A=I (2-46)
所以有
X=(A'A)^(-1)A'B (2-47)
此即最小二乘的一次完成算法,现代的递推算法,更适用于计算机的在线辨识。
最小二乘是一种最基本的辨识方法,但它具有两方面的缺陷[1]:一是当模型噪声是有色噪声时,最小二乘估计不是无偏、一致估计;二是随着数据的增长,将出现所谓的“数据饱和”现象。针对这两个问题,出现了相应的辨识算法,如遗忘因子法、限定记忆法、偏差补偿法、增广最小二乘、广义最小二乘、辅助变量法、二步法及多级最小二乘法等。
%%%%% 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
%% 清空环境变量clc
clear
close all
%%
a=load('walk1.txt')%读取数据 % xlsread(‘ ‘);读取execl文件
data=a(1:500,5)%样本数据和测试数据
order=5%输入数据个数
snum=200%训练样本数
step=3%预测步数
input=data(1:snum)
output=data(1+order+step:snum+order+step)
delay=200%训练样本与测试样本间时延
input1=data(1+delay:snum+delay)
output1=date(1+order+delay+step:snum+order+delay+step)
input_train=zeros(snum,order)input_test=zeros(snum,order)
for i=1:snum
input_train(i,:)=data(i:i+order-1)
input_test(i,:)=data(i+delay:i+delay+order-1)
end
%% RBF神经网络预测
%% 网络建立和训练
net=newrb(input_train',output',0.001,100,300,25)
% net=newrbe(input_train',output',100)
% net=newgrnn(input_train',output',10)
%% 网络验证
ty=sim(net,input_train')
errR=abs(output-ty')
ty1=sim(net,input_test')
errR1=abs(output1-ty1')
figure
plot(1:snum,output1,'r*-')
hold on
plot(1:snum,ty1','kx-')
title('三步RBF')
xlabel('数据序号')
ylabel('数据值')
legend('实际值','预测值')
figure
subplot(2,1,1)
stem(1:snum,errR1,'r*')
title('三步RBF')
xlabel('数据序号')
ylabel('绝对误差值')
rbfmean = mean(errR1)
subplot(2,1,2)
stem(1:snum,
abs(errR1./output1),'r*')
title('三步RBF')
xlabel('数据序号')
ylabel('绝对误差率')
rbfpmean = mean(abs(errR1./output1))*100%%
自己对着改一下。
欢迎分享,转载请注明来源:内存溢出
微信扫一扫
支付宝扫一扫
评论列表(0条)