神经网络RBF_PID

matlab程序:

clc;clear;close all;
%% Step 1:初始化学习速率、PID权值系数和误差向量等。
%初始化P、I、D的学习速率
xiteP=0.40;   %比例系数的学习速率
xiteI=0.40;   %积分系数的学习速率
xiteD=0.40;   %微分系数的学习速率
xitePID=[xiteI;xiteP;xiteD]; %学习速率向量化
K1=0.5;K2=0.5;        %学习步长
%初始化P、I、D的系数
wk1_PID=[0.3150;1.1615;1.4948];   %初始化输入1的P、I、D的系数
wk2_PID=[0.2067;0.6365;0.4996];   %初始化输入2的P、I、D的系数
%初始化0,-1,-2时刻的输入
u1=zeros(3,1);     %初始化输入1在0,-1,-2时刻的输入
u2=zeros(3,1);     %初始化输入2在0,-1,-2时刻的输入
%初始化输出在0,-1,-2时刻的值
y1=zeros(3,1);     %初始化第一维的实际输出
y2=zeros(3,1);     %初始化第二维的实际输出
yd1=zeros(3,1);    %初始化第一维的期望输出
yd2=ones(3,1);     %初始化第二维的期望输出
%计算0,-1,-2时刻的误差
error1=yd1-y1;     %初始化输入1在0,-1,-2时刻的误差
error2=yd2-y2;     %初始化输入2在0,-1,-2时刻的误差
%计算积分、比例、微分项对应的误差向量
x1=[error1(1);error1(1)-error1(2);error1(1)-2*error1(2)+error1(3)];
x2=[error2(1);error2(1)-error2(2);error2(1)-2*error2(2)+error2(3)];
%初始化采样时间
ts=1;          %初始化采样时间间隔
N=50;         %采样时间点数
time=(1:N)'*ts;%采样时间
PIDcoefficient1=zeros(N,3);   %初始化输入1的PID系数
PIDcoefficient2=zeros(N,3);   %初始化输入2的PID系数
yreal=zeros(N,2);             %初始化实际输出
%% Step 2:利用动态神经网络对PID权值系数进行动态调整。
for k=1;N;
    %输入k时间的期望输出
    R=[0;1];
    %计算k,k-1,k-2时刻的期望输出
    yd1=[R(1);yd1(1:2)];   %第一维
    yd2=[R(2);yd2(1:2)];   %第二维
    %计算k,k-1,k-2时刻的实际输出
    y1=[(0.8*y1(1)+u1(2)+0.2*u2(3))/(1+y1(1))^2;y1(1:2)];       %第一维
    y2=[(0.9*y2(2)+0.3*u1(2)+0.2*u2(1))/(1+y2(2))^2;y2(1:2)];   %第二维
    
    %计算k,k-1,k-2时刻的误差
    error1=yd1-y1;    %初始化输入1在0,-1,-2时刻的误美
    error2=yd2-y2;    %初始化输人2住O,-1,-2时刻的误美
    
    %计算k时刻第一维的权系数更新
    wk1_PID=wk1_PID+diag(xitePID)*error1(1)*x1;
    %计算k时刻第二维的权系数更新
    wk2_PID=wk2_PID+diag(xitePID)*error2(1)*x2;
    
    %计算k时刻积分、比例、微分项对应的误差向量
    x1=[error1(1);error1(1)-error1(2);error1(1)-2*error1(2)+error1(3)];
    x2=[error2(1);error2(1)-error2(2);error2(1)-2*error2(2)+error2(3)];

    %对k时刻第一维权系数进行归一化
    wk1_PID0=wk1_PID/sum(abs(wk1_PID));
    %对k时刻第二维权系数进行归一化
    wk2_PID0=wk2_PID/sum(abs(wk2_PID));

    %计算k,k-1,k-2时刻第一维的输入向量
    ul=[u1(1)+K1*wk1_PID0'*x1;u1(1:2)];
    %计算k,k-1,k-2时刻第二维的输入向量
    u2=[u2(1)+K2*wk2_PID0'*x2;u2(1:2)];

    %记录PID系数
    PIDcoefficient1(k,:)=K1*wk1_PID0';
    PIDcoefficient2(k,:)=K2*wk2_PID0';
    %记录实际输出
    yreal(k,:)=[y1(1),y2(1)];
end

%% Step 3:显示结果。
figure("name","实际输出与期望输出随时间的变化情况","numbertitle","off");
subplot(311)
plot(time,R(1)*ones(N,1),time,yreal(:,1),"linewidth",1);
grid on;
h=legend("期望输出","实际输出");
set(h,"fontsize",9)
title("第一维输出幅值随时间的变化情况","fontsize",16);
xlabel("时间", "fontsize",16);
ylabel("第一维输出幅值", "fontsize",16);
subplot(312)
plot(time,R(2)*ones(N,1 ),time,yreal(:,2),"linewidth",1);
grid on;
h=legend("期望输出","实际输出");

set(h,"fontsize",9)
title("第一维输出幅值随时间的变化情况","fontsize",16);
xlabel("时间","fontsize",16);
ylabel("第一维输出幅值","fontsize",16);
subplot(313)
plot(time,R(1)-yreal(:,1),time,R(2)-yreal(:,2),"linewidth",1);
grid on;
h=legend("第一维输出误差,第二维输出误差");
set(h,"fontsize",9)
title("输出误差随时间的变化情况","fontsize",16);
xlabel("时间", "fontsize",16);
ylabel("输出误差","fontsize",16);
figure("name","第一维PID系数随时间的变化情况","numbertitle","off");
subplot(311)
plot(time,PIDcoefficient1(:,1),"linewidth",1);
grid on;
xlabel("时间","fontsize",16);
ylabel("系数","fontsize",16);
title("第一维积分(I)系数随时间的变化情况","fontsize",16);
subplot(312)
plot(time,PIDcoefficient1(:,2),"linewidth",1);
grid on;
xlabel("时间","fontsize",16);
ylabel("系数","fontsize",16);
title("第一维比例(P)系数随时间的变化情况","fontsize",16);
subplot(313)
plot(time,PIDcoefficient1(:,3),"linewidth",1);
grid on;
xlabel("时间","fontsize",16);
ylabel("系数","fontsize",16);
title("第一维微分(D)系数随时间的变化情况","fontsize",16);
figure("name","第二维PID系数随时间的变化情况","numbertitle","off");
subplot(311)
plot(time,PIDcoefficient2(:,1),"linewidth",1);
grid on;
xlabel("时间","fontsize",16);
ylabel("系数","fontsize",16);
title("第二维积分(I)系数随时间的变化情况","fontsize",16);
subplot(312)
plot(time,PIDcoefficient2(:,2),"linewidth",1);
grid on;
xlabel("时间","fontsize",16);
ylabel("系数","fontsize",16);
title("第二维比例(P)系数随时间的变化情况","fontsize",16);
subplot(313)
plot(time,PIDcoefficient2(:,3),"linewidth",1);
grid on;
xlabel("时间","fontsize",16);
ylabel("系数","fontsize",16);
title("第二维微分(D)系数随时间的变化情况","fontsize",16);

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值