📄 dmc8lubangxingfangzhenk.m
字号:
clear all;%以下2--5语句与[a,t]=step(tf(num,den,'inputdelay',3))等价
num=2.994;
den=[82^2 164 1];
%简化算法2对象2
s=tf('s');
sysA=1/(82^2*s^2+82*2*s+1);
Ts=5;
aaa1=0;aaa2=0;
for i=2:161
aaa1(i)=exp(-Ts/82)*aaa1(i-1)+2.994*(1-exp(-Ts/82))*1;%零阶保持器下的差分方程;
aaa2(i)=exp(-Ts/82)*aaa2(i-1)+(1-exp(-Ts/82))*aaa1(i);
end
a=aaa2(2:161);
P=150;
for i=1:P
Q(i)= 1;
end %误差加权系数
Tr=3;
ArfaR=exp(-Ts/Tr);
M=8;
for i=1:M
R(i)=0.1;
end %控制加权系数
Q=diag(Q);%误差加权矩阵
R=diag(R);%控制加权矩阵
N=length(a);
%构造矩阵A,可以从Workspace复制,也可以由line5直接得出;
for i=1:P
for j=1:M
if i==j
A(i,j)=a(1);
end
if i>j
A(i,j)=a(i-j+1);
end
if i<j
A(i,j)=0;
end
end
end
%构造矩阵A0b;
for i=1:P
for j=1:i+1
A0b(i,j)=a(N);
end
for j=i+2:N
A0b(i,j)=a(N-j+i+1);
end
end
%构造矩阵A0;
for i=1:P
for j=2:N-1
A0(i,j)=A0b(i,j)-A0b(i,j+1);
end
A0(i,N)=A0b(i,N);
end
A0(:,1)=[];%删除矩阵的第一列;
h=1*ones(1,P);
h=h';
%简化算法;
arfa=1.5;
for i=1:M
Aarfa(i)=(1-i/M)^arfa;
end
Aarfa=Aarfa';
Au=A*Aarfa;
SimulationStep=200;
D=inv(Au'*Q*Au+Aarfa'*R*Aarfa)*Au'*Q;%inv为矩阵求逆;需列计算式;
d1=D(1,:);
U(1:N-1)=0; U=U';DeltaU(1:N)=0; DeltaU=DeltaU';y=[0,0];u=0;w=1;y1=0;ym=0;y1m=0;Delta_u=0;TT1=0;TT2=0;
%仿真;
K=1.2;
for i=2:SimulationStep
u(i)=u(i-1)+Delta_u;
y1(i)=exp(-Ts/82)*y1(i-1)+2.994*K*(1-exp(-Ts/82))*u(i);%零阶保持器下的差分方程(对象);
y(i)=exp(-Ts/82)*y(i-1)+(1-exp(-Ts/82))*y1(i);
y1m(i)=exp(-Ts/82)*y1m(i-1)+2.994*(1-exp(-Ts/82))*u(i);%零阶保持器下的差分方程(对象);
ym(i)=exp(-Ts/82)*ym(i-1)+(1-exp(-Ts/82))*y1m(i);
%ym=y(i-1)+a(1)*Delta_u;
%构造参考轨迹输出yr;
for j=1:P
yr(j)=ArfaR^j*y(i)+(1-ArfaR^j)*w;
end
e(i)=y(i)-ym(i);%计算实际输出误差;
Delta_u=d1*(yr'-A0*U-h*e(i));%控制增量;
for j=1:N-2
U(j)=U(j+1);
end
U(N-1)=u(i);
for j=1:N-1
DeltaU(j)=DeltaU(j+1);
end
DeltaU(N)=Delta_u;
TT1(i)=i;
end
TT1=TT1*Ts;
U1(1:N-1)=0; U1=U1';DeltaU1(1:N)=0; DeltaU1=DeltaU1';z=[0,0];u1=0;w=1;z1=0;zm=0;z1m=0; SimulationStep=200;Delta_u1=0;
K=0.8;
for i=2:SimulationStep
u1(i)=u1(i-1)+Delta_u1;
z1(i)=exp(-Ts/82)*z1(i-1)+2.994*K*(1-exp(-Ts/82))*u1(i);%零阶保持器下的差分方程;
z(i)=exp(-Ts/82)*z(i-1)+(1-exp(-Ts/82))*z1(i);
z1m(i)=exp(-Ts/82)*z1m(i-1)+2.994*(1-exp(-Ts/82))*u1(i);%零阶保持器下的差分方程;
zm(i)=exp(-Ts/82)*zm(i-1)+(1-exp(-Ts/82))*z1m(i);
%ym=y(i-1)+a(1)*Delta_u;
%构造参考轨迹输出yr;
for j=1:P
yr(j)=ArfaR^j*y(i)+(1-ArfaR^j)*w;
end
e(i)=z(i)-zm(i);%计算实际输出误差;
Delta_u1=d1*(yr'-A0*U1-h*e(i));%控制增量;
for j=1:N-2
U1(j)=U1(j+1);
end
U1(N-1)=u1(i);
for j=1:N-1
DeltaU1(j)=DeltaU1(j+1);
end
DeltaU1(N)=Delta_u1;
TT2(i)=i;
end
TT2=TT2*Ts;
hold on
plot(TT1,y,'k-')
plot(TT2,z,'k-')
grid
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -