大林算法,比较基础的,无振铃的改了对象需要手动改一下

%Delay Control with Dalin Algorithm
clear all;
clc;
ts=1;

% Plant  控制对象传函:G(z)
sys1=tf([5],[0.1,0.7,1],'inputdelay',1);
dsys1=c2d(sys1,ts,'zoh')
[num1,den1]=tfdata(dsys1,'v');
[z,p,k]=zpkdata(dsys1);
% Z=[0;0.4346];
% P=[];
Gz=zpk(z,p,k,ts,'variable','z^-1')
%Ideal closed loop  理想脉冲传函:fi(z)
sys2=tf([1],[0.15,1],'inputdelay',1);
dsys2=c2d(sys2,ts,'zoh');

%Design Dalin controller控制器函数:D(z)
dsys=1/Gz*dsys2/(1-dsys2)
% dsys=1/dsys1*dsys2/(1-dsys2);%!!!!!!!!!!!!!!!!!!!!!!
% [zz,pp,kk]=zpkdata(dsys);对应下面的改对象无手动
[num,den]=tfdata(dsys,'v');
u_1=0.0;u_2=0.0;u_3=0.0;u_4=0.0;
y_1=0.0;y_2=0;
error_1=0.0;error_2=0.0;error_3=0.0;error_4=0.0;
ei=0;
for k=1:1:30
time(k)=k*ts;
rin(k)=1.0; %Tracing Step Signal
% dsys1 =Y(z)/U(z)
 
%                 3.895 z + 0.3995
%   z^(-1) * --------------------------
%            z^2 - 0.1421 z + 0.0009119
yout(k)=-den1(2)*y_1-den(3)*y_2+num1(2)*u_2+num1(3)*u_3;
error(k)=rin(k)-yout(k);
M=2;
if M==1 %Using Dalin Method
%     dsys =U(z)/E(z)
%  
%            0.25643 (1-0.1353z^-1) (1-0.006738z^-1) (1-0.001273z^-1)
%   z^(-1) * --------------------------------------------------------
%            (1+0.1026z^-1) (1+0.9987z^-1) (1-z^-1) (1-0.001273z^-1)
%          num(5)=0
% u(k)=(num(1)*error(k)+num(2)*error_1+num(3)*error_2+num(4)*error_3...
% -den(3)*u_1-den(4)*u_2-den(5)*u_3-den(6)*u_4-den(7)*u_5)/den(2);
  u(k)=(num(1)*error(k)+num(2)*error_1+num(3)*error_2+num(4)*error_3)
                  -(den(2)*u_1+den(3)*u_2+den(4)*u_3+den(5)*u_4);
elseif M==2 %无振铃
%     dsys =U(z)/E(z)
%  
%            0.25643 (1-0.1353z^-1) (1-0.006738z^-1) (1-0.001273z^-1)
%   z^(-1) * --------------------------------------------------------
%            (1+0.1026z^-1) (1+0.9987z^-1) (1-z^-1) (1-0.001273z^-1)
%      极点 z=1,则分母系数0.2564/1.9987

% for i=1:1:4 %找到最近离-1最近极点,但好像分子掉了一个z^-1,就没继续写
%菜鸡望大佬指正并补全
% ppp(i)=pp{1,1}(i)+1;
% end
% min_p=find( abs(ppp(:))==min(abs(ppp(:))) ) 
% mmp=1-pp{1,1}(min_p)
% a=[1,2,3,4];
% pp= pp{1,1}(a~=min_p)
% kk=[0.25643/mmp];
% dsysDz=zpk(zz,pp,kk,ts,'variable','z^-1')

zz=[0.1353 0.006738 0.001273 ];
pp=[-0.1026 1 0.001273 0];
kk=[0.25643/1.9987];
dsysDz=zpk(zz,pp,kk,ts,'variable','z^-1')
% dsysDz =
%  
%   0.1283 z^-1 (1-0.1353z^-1) (1-0.006738z^-1) (1-0.001273z^-1)
%   ------------------------------------------------------------
%             (1+0.1026z^-1) (1-z^-1) (1-0.001273z^-1)
[numd,dend]=tfdata(dsysDz,'v')
u(k)=(num(1)*error(k)+num(2)*error_1+num(3)*error_2+num(4)*error_3+num(5)*error_4)
                  -(den(2)*u_1+den(3)*u_2+den(4)*u_3+den(5)*u_4);


end
%----------Return of dalin parameters------------
u_4=u_3;u_3=u_2;u_2=u_1;u_1=u(k);
y_2=y_1;y_1=yout(k);
error_4=error_3;error_3=error_2;error_2=error_1;error_1=error(k);
end

figure(1);
plot(time,rin,'b',time,yout,'r');
legend('rin','yout')
xlabel('time(s)'),ylabel('rin,yout');
title('大林算法(控制对象4有振铃)')%设置图标题
grid on%开启网格

学控制应该都知道,注释也挺多的。
载把simulink的发一下,
在这里插入图片描述

结果:在这里插入图片描述
在这里插入图片描述

再来一个写死的,参数全手工的,自己放到代码里,提供一个思路
解释如下:
在这里插入图片描述

%Dalin Controller
clear all;
close all;
ts=0.08;
sys=tf(5,[0.1,0.7,1])
dsys=c2d(sys,ts,'z')
[num,den]=tfdata(dsys,'v')
u_1=0.0;u_2=0.0;u_3=0.0;
y_1=0.0;y_2=0.0;y_3=0.0;
x=[0,0,0]';
error_1=0;
for k=1:1:30
    time(k)=k*ts;rin(k)=1;%Linear model
    yout(k)=0.868*y_1+0.66*u_3;
    %yout(k)=-den(2)*y_1-den(3)*y_2+num(2)*u_1+num(3)*u_2;
    error(k)=rin(k)-yout(k);
    u(k)=0.5*error(k)-0.434*error_1+0.67*u_1+0.33*u_3;   %PID %Restricting the output of controller
    if u(k)>=10          
    u(k)=10;
    end
    if u(k)<=-10   
     u(k)=-10;
    end%Return of parameters
u_3=u_2;u_2=u_1;u_1=u(k);
y_3=y_2;y_2=y_1;y_1=yout(k);
error_1=error(k); 
end
figure(1);
plot(time,rin,'r',time,yout,'b');
xlabel('time(s)'),ylabel('rin,yout');
title('大林系统输出');
figure(2);
plot(time,u,'r');
stairs(u);
xlabel('time(s)'),ylabel('u');
title('输出控制器输出');

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章