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);