大林算法,比較基礎的,無振鈴的改了對象需要手動改一下

%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('輸出控制器輸出');

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